19
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

はじめに

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上にファイルを保存するのは難しいですね。

19
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?