Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
11
Help us understand the problem. What is going on with this article?
@yoshidasts

AWS Lambdaでファイル入出力をしてみる

More than 5 years have passed since last update.

はじめに

Qiitaで以下の投稿を見て、Lambdaの実行環境にファイル出力が出来ることをしりました。

AWS lambdaでファイル出力する方法 (Java)
http://qiita.com/ABCompany1/items/e34fad93d7966087b4bb

となると、もちろんファイル入力も出来るのかっていうのが気になります。

ファイル作成

まずはファイルを作ります。fsライブラリはAWS Lambdaに標準で対応しています。
Node.jsにはwriteFileというファイルに直接出力する関数が用意されていて、
ファイルへの文字列の出力がとっても簡単です。

index.js
var fs = require('fs');

exports.handler = function(event, context){
    fs.writeFile('/tmp/sample.txt', 'Hello File', function(err){
        console.log(err);
        context.done(null, err);
    });
}

Lambdaのコンソール上で「Test」ボタンをクリックして実行して見ます。

START RequestId: 9582746c-cc76-11e5-929d-0dcb72880f7c Version: $LATEST
2016-02-06T02:08:59.383Z    9582746c-cc76-11e5-929d-0dcb72880f7c    null
END RequestId: 9582746c-cc76-11e5-929d-0dcb72880f7c
REPORT RequestId: 9582746c-cc76-11e5-929d-0dcb72880f7c  Duration: 80.31 ms  Billed Duration: 100 ms     Memory Size: 128 MB Max Memory Used: 9 MB   

ログ出力をみると、errがnullとなっていますので、無事にファイル出力されたようです。

ファイルの確認

念のためにファイルを確認してみます。

var fs = require('fs');

exports.handler = function(event, context){
    fs.readdir('/tmp/', function(err, files){
        console.log(files);
        context.done(null, files);
    });
};

このコードを実行してみた結果は以下の通りでした。

2016-02-06T02:13:11.863Z    2c02e645-cc77-11e5-ab41-a9b8cc6efe0d    []

あれ?ファイルがありません。
Lambda関数がデプロイされるサーバーは固定ではないので
今度は違うサーバーにデプロイされてしまったのかもしれません。

ファイル出力と確認を同じプログラムで実行する

そこで、今度はファイル出力と確認を同じコードで見てみます。

var fs = require('fs');

exports.handler = function(event, context){
    fs.writeFile('/tmp/sample.txt', 'Hello File', function(err){
        fs.readdir('/tmp/', function(err, files){
            console.log(files);
            context.done(null, files);
        });
    });
};

さて、結果は・・・

2016-02-06T02:21:05.363Z    463e7c80-cc78-11e5-a64f-994ec5d55787    [ 'sample.txt' ]

ファイルの存在を確認できました。
ただ、毎回デプロイされる先が変更されてしまうのでは、実用には出来ませんね。

再実行可能なファイル入出力

そこで、再デプロイせずに済むようにファイル出力と読み込みとを同じコードで実行します。
見やすいように同期メソッドを使って呼び出して見ます。

var fs = require('fs');

exports.handler = function(event, context){
    var dir = fs.readdirSync('/tmp');

    //If the file is not exist, create a file
    if(dir.length == 0){
        console.log('The file is not exist.');
        fs.writeFileSync('/tmp/sample.txt', 'Hello File');
        var files = fs.readdirSync('/tmp/');
            console.log(files);
            context.done(null, files);
    }else{
        var data = fs.readFileSync('/tmp/sample.txt', 'utf-8');
        console.log(data);
        context.done(null, data);
    }
};

1回目の実行結果は

2016-02-06T02:32:07.204Z    d0b4151b-cc79-11e5-8cb4-a10c8e66e56a    The file is not exist.
2016-02-06T02:32:07.205Z    d0b4151b-cc79-11e5-8cb4-a10c8e66e56a    [ 'sample.txt' ]

ファイルが存在しませんでしたので、作成されました。
さて、ここでプログラムの修正を行わず、再実行します。

2016-02-06T02:36:10.743Z    61dd7d35-cc7a-11e5-8cb4-a10c8e66e56a    The file is not exist.
2016-02-06T02:36:10.744Z    61dd7d35-cc7a-11e5-8cb4-a10c8e66e56a    [ 'sample.txt' ]

2回目もファイルが新規作成されてしまいました。何故でしょう?
念のためにもう1回。

2016-02-06T02:37:33.257Z    933182b6-cc7a-11e5-837b-fdb3c6285259    Hello File

3回目にしてやっとファイルの読み込みに成功しました!
ただ、実行するたびに読み込めたり、新規作成されたりでした・・・。
残念ながらLambda上にファイルを保存するのは難しいですね。

11
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
11
Help us understand the problem. What is going on with this article?