AWS LambdaのLimited Previewが使えるようになったので、デバッグ用にローカルからさくさく実行できるツールを作ってみた。
lambchop 0.0.2
https://github.com/winebarrel/lambchop
shebangに「#!/usr/bin/env lambchop」と書いておくと、マジックコメントを読み込んで中身のスクリプトをAWS Lambdaにアップロードして、CloudWatchLogsにイベントが書き込まれたら標準出力にメッセージを出力する…というもの。
スクリプトの中身は以下のような感じ。
#!/usr/bin/env lambchop /* function_name: test runtime: nodejs role: arn:aws:iam::NNNNNNNNNNNN:role/lambda_exec_role handler: test.handler mode: event description: '' timeout: 3 memory_size: 128 */ console.log('Loading event'); exports.handler = function(event, context) { console.log('value1 = ' + event.key1); console.log('value2 = ' + event.key2); console.log('value3 = ' + event.key3); context.done(null, 'Hello World'); // SUCCESS with message };
これを実行スクリプトとして実行すると、中身がアップロードされてログ出力を待つ。
$ export AWS_REGION=us-east-1 $ ./test.js Function was uploaded: { "function_name": "test", "function_arn": "arn:aws:lambda:us-east-1:NNNNNNNNNNNN:role:function:test", "configuration_id": "92ae8021-a6c3-4fcc-9684-282d3f4e72cb", "runtime": "nodejs", "role": "arn:aws:iam::NNNNNNNNNNNN:role/lambda_exec_role", "handler": "test.handler", "mode": "event", "code_size": 272, "description": "", "timeout": 3, "memory_size": 128, "last_modified": "2014-11-23 17:43:58 +0900" } (イベント待ち…)
他のターミナルを開いて付属のlambchop-catでサンプルイベントを送ってやると
echo '{"key1":101, "key2":201, "key3":301}' | lambchop-cat test
test.jsを立ち上げている端末にはFunctionのログが出力される。
(イベント待ち…) 2014-11-23T08:45:32.732Z 48p3jzf4z1vmz3is Loading event START RequestId: 18f76777-72ed-11e4-bf1c-db8a8f474c8d 2014-11-23T08:45:32.830Z 18f76777-72ed-11e4-bf1c-db8a8f474c8d value1 = 101 2014-11-23T08:45:32.830Z 18f76777-72ed-11e4-bf1c-db8a8f474c8d value3 = 301 2014-11-23T08:45:32.830Z 18f76777-72ed-11e4-bf1c-db8a8f474c8d value2 = 201 END RequestId: 18f76777-72ed-11e4-bf1c-db8a8f474c8d REPORT RequestId: 18f76777-72ed-11e4-bf1c-db8a8f474c8d Duration: 116.71 ms Billed Duration: 200 ms Memory Size: 128 MB Max Memory Used: 9 MB
既存のFunctionをダンプすることもできる。
$ lambchop-dump test #!/usr/bin/env lambchop /* function_name: test runtime: nodejs role: arn:aws:iam::NNNNNNNNNNNN:role/lambda_exec_role handler: test.handler mode: event description: '' timeout: 3 memory_size: 128 */ console.log('Loading event'); exports.handler = function(event, context) { console.log('value1 = ' + event.key1); console.log('value2 = ' + event.key2); console.log('value3 = ' + event.key3); context.done(null, 'Hello World'); // SUCCESS with message };
デモ
これでだいぶトライ・アンド・エラーがしやすくなった気がする…
2014/11/23 20:50 追記
node_modulesをサポートしました。
スクリプトと同じディレクトリに node_modules/
があると一緒にアップロードされます。