🐌
AWS Lambdaをローカルで実行する
Lambdaでちょっとしたスクリプトを書く必要があって、ローカルで書いて実行する方法を調べました。
結論から言うとこのlambci/lambda
というdocker image
を使えばサクッと実行できます。
今回はNode.jsを使います。まずはindex.js
というファイルを作ってこんな書く。
exports.handler = async (event, context) => {
console.log("event: ", event.value)
console.log("context: ", context)
return context.logStreamName
}
そして実行するコマンドのフォーマットはこれ
$ docker run --rm \
-v <code_dir>:/var/task:ro,delegated \
[-v <layer_dir>:/opt:ro,delegated] \
lambci/lambda:<runtime> \
[<handler>] [<event>]
code_dir
はファイルと同じ階層で実行するので$PWD
。runtime
はnodejs12.x
。handler
はindex.js
のexport.handler
なのでindex.handler
。そしてevent
は引数で渡せるのでvalue
というキーで値を渡します。
実際に実行するコマンドはこんな感じになる
$ docker run --rm \
-v "$PWD":/var/task \
lambci/lambda:nodejs12.x \
index.handler '{ "value": "hogehoge"}'
実行すると
START RequestId: 3e0f4c9f-bd58-191a-a748-280fd117ca87 Version: $LATEST
2020-10-18T05:43:22.133Z 3e0f4c9f-bd58-191a-a748-280fd117ca87 INFO event: hogehoge
2020-10-18T05:43:22.144Z 3e0f4c9f-bd58-191a-a748-280fd117ca87 INFO context: {
callbackWaitsForEmptyEventLoop: [Getter/Setter],
succeed: [Function],
fail: [Function],
done: [Function],
functionVersion: '$LATEST',
functionName: 'test',
memoryLimitInMB: '1536',
logGroupName: '/aws/lambda/test',
logStreamName: '2020/10/18/[$LATEST]3bb3b43ee593083427b7c9b4fd72f976',
clientContext: undefined,
identity: undefined,
invokedFunctionArn: 'arn:aws:lambda:us-east-1:181260691:function:test',
awsRequestId: '3e0f4c9f-bd58-191a-a748-280fd117ca87',
getRemainingTimeInMillis: [Function: getRemainingTimeInMillis]
}
END RequestId: 3e0f4c9f-bd58-191a-a748-280fd117ca87
REPORT RequestId: 3e0f4c9f-bd58-191a-a748-280fd117ca87 Init Duration: 201.24 ms Duration: 22.61 ms Billed Duration: 100 ms Memory Size: 1536 MB Max Memory Used: 41 MB
"2020/10/18/[$LATEST]3bb3b43ee593083427b7c9b4fd72f976"
このdocker imageはビルドしてデプロイなどもできて便利そうなので、機会があったら深堀りする。
Discussion