ボクココ

個人開発に関するテックブログ

AWS Lambda をローカルで実行できる環境を作る方法

ども、@kimihom です。

AWS のサービスの中でダントツに気に入ってる AWS Lambda 。コードの実行自体はテストで実行する回数分なんてたいしたことないからリモートでやってもいいんだけど、毎回Zipにして固めてアップロードするのがめんどくさいってのがある。

てな訳でローカルで実行できる環境を用意しておくと、開発時には何かと便利。今回は Node.js の場合のコードを記す。

index.handler を呼び出す

結局は シンプルな JavaScript ファイルを実行するだけなので、ローカルで実行するのも非常に簡単だ。

test.js とかを index.js と同じディレクトリ内に入れて、こんな感じのコードを書けばいいだけだ。

var event = {
    "Records": [ { "s3": { "bucket": { "name": "mybucket" }, "object": { "key": "test.json" } } } ]
};

var context = {};
var callback = function(err, data) {
    return;
};

var myLambda = require('./index');
myLambda.handler(event, context, callback);

event ってのは例えば S3 をトリガにして起動するタイプだと、Records[{s3: ~}] みたいなデータが渡ってくるので、それをローカルのJSONで書いてあげればOKだ。これに関しては最初に一回実行してみて console.log で確認するのが一番早い。

context はあんまり使わないかもだけど、例えば Lambda ないでエラーが起きた時に、CloudWatch ログの名前をメールなり Slack なりに通知する際に context.functionNamecontext.logStreamName は使えるだろう。

そんなこんなで ローカルで node test.js を打てば実行できる環境ができあがった。

AWS Lambda 内で手動実行する方法

ローカルだと当然実行する環境が違うので、テストできないという場合も出てくるだろう。そんな場合は AWS Lambda コンソールないから手動で実行ができる。これも割と便利でよく使う機能だ。

まずは Actions -> Configure test event を選択し、テスト実行する際の JSON を定義する。これが通常の AWS Lambda に渡ってくる event の JSON そのものだ。

f:id:cevid_cpp:20160901214837p:plain

これで Save して Test すれば、AWS Lambda の環境で作ったコードを実行することができる。S3トリガの AWS Lambda ファンクションであっても、それの event を test event として定義すればいいことになる。

Zip デプロイはシェルにでも書いておこう

んでいよいよ完成で Lambda に反映だ!ってなった時は Zip 化して aws コマンドを呼ぶことになる。簡単なシェルを書いておけばコマンド一発でデプロイできる。

aws lambda update-function-code --function-name myFunc --zip-file fileb://zipped.zip

zip で固める処理と、アップデート終わった後に zip を削除するシェルも書いておけばより楽になるだろう。

終わりに

AWS Lambda では以下の記事でも注意点など紹介している。AWS Lambda は本当に便利なので、まだ触ったことがない方がいればぜひチェックしておきたいところ。 Azure でも GCP , Bluemixでも同等の技術があるらしいので、それぞれのプラットフォームで調べてみるといいだろう。やはり便利だからどこのクラウドサービスでも提供しているということだろう。

www.bokukoko.info

Enjoy Coding!