はじめに
Qiitaで以下の投稿を見て、Lambdaの実行環境にファイル出力が出来ることをしりました。
AWS lambdaでファイル出力する方法 (Java)
http://qiita.com/ABCompany1/items/e34fad93d7966087b4bb
となると、もちろんファイル入力も出来るのかっていうのが気になります。
ファイル作成
まずはファイルを作ります。fsライブラリはAWS Lambdaに標準で対応しています。
Node.jsにはwriteFileというファイルに直接出力する関数が用意されていて、
ファイルへの文字列の出力がとっても簡単です。
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上にファイルを保存するのは難しいですね。