AWS Lambdaをローカルで実行する

2 min read読了の目安(約2000字

Lambdaでちょっとしたスクリプトを書く必要があって、ローカルで書いて実行する方法を調べました。

結論から言うとこのlambci/lambdaというdocker imageを使えばサクッと実行できます。

https://github.com/lambci/docker-lambda

今回は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はファイルと同じ階層で実行するので$PWDruntimenodejs12.xhandlerindex.jsexport.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はビルドしてデプロイなどもできて便利そうなので、機会があったら深堀りする。