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

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