折角なので、CDK (3) - らんだむな記憶 で作成した Lambda を呼んでみたい。AWS CLI での Lambda の使用 - AWS Lambda を参考に CLI で同期的に呼び出してみよう。というか、LocalStack なので CLI で呼ぶしかない・・・。
$ awslocal lambda invoke --function-name Hello response.json { "StatusCode": 200, "LogResult": "", "ExecutedVersion": "$LATEST" } $ cat response.json {"statusCode":200}
ということで、呼べた。呼べたのだが、Lambda の VM がコールドスタートしたとして、VM イメージはどこから・・・?とか結構時間かかるぞ・・・?というのが気になるわけで、
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE localstack/localstack latest e50a85480f2f 3 weeks ago 1.55GB mlupin/docker-lambda python3.9 1971dcd11b71 5 weeks ago 488MB ...
あぁぁ・・・やっぱりね、と。488 MB のイメージが pull されている。ま、普通に docker コンテナが起動されるだけだよね・・・。
https://hub.docker.com/r/mlupin/docker-lambda を見ると、
Images mimicking live AWS Lambda environment, both x86_64 and arm64
ということで、納得。Maciej Wilczyński 氏は AWS の中の人というわけでもなさそうだ・・・。コミュニティの力・・・。
一応ログを確認しておきたいので、CloudWatch Logs を CLI で操作する。
logs — AWS CLI 2.5.7 Command Reference を見つつ、
$ awslocal logs describe-log-groups { "logGroups": [ { "logGroupName": "/aws/lambda/Hello", "creationTime": 1646493236260, "metricFilterCount": 0, "arn": "arn:aws:logs:us-east-1:000000000000:log-group:/aws/lambda/Hello", "storedBytes": 324 } ] }
でロググループを特定する。次にログストリームを確認する:
$ awslocal logs describe-log-streams --log-group-name "/aws/lambda/Hello" { "logStreams": [ { "logStreamName": "2022/03/05/[LATEST]8538bf48", "creationTime": 1646493236274, "firstEventTimestamp": 1646493236184, "lastEventTimestamp": 1646493236259, "lastIngestionTime": 1646493236293, "uploadSequenceToken": "1", "arn": "arn:aws:logs:us-east-1:000000000000:log-group:/aws/lambda/Hello:log-stream:2022/03/05/[LATEST]8538bf48", "storedBytes": 324 } ] }
そして、
$ awslocal logs get-log-events --log-group-name "/aws/lambda/Hello" --log-stream-name "2022/03/05/[LATEST]8538bf48" { "events": [ ... { "timestamp": 1646493236203, "message": "Hello, wo...", "ingestionTime": 1646493236293 }, ... ], "nextForwardToken": "f/00000000000000000000000000000000000000000000000000000006", "nextBackwardToken": "b/00000000000000000000000000000000000000000000000000000000" }
で確認できたという感じで。
次にペイロード付きの場合を見てみよう。と、ここで LocalStack - らんだむな記憶 をよく思い出すと、PyPI 経由で AWS CLI v2 を扱うことができないという理由で AWS CLI v1 を使っているのだった。なので本当は CLI v1 のドキュメントを参照する必要がある。そして CLI v1 であるが故に v2 の流儀の
$ awslocal lambda invoke --function-name Hello --payload $(echo '{ "message": "World" }' | base64) response.json
ではダメで、
$ awslocal lambda invoke --function-name Hello --payload '{ "message": "World" }' response.json { "StatusCode": 200, "LogResult": "", "ExecutedVersion": "$LATEST" }
だとうまくいく。仕方ない・・・というかかえって楽。
勿論ちゃんと動作はしていて
$ awslocal logs get-log-events --log-group-name "/aws/lambda/Hello" --log-stream-name "2022/03/05/[LATEST]eed1ab9e" { "events": [ ... { { "timestamp": 1646494790212, "message": "Hello, World", "ingestionTime": 1646494790239 }, ], ... "nextForwardToken": "f/00000000000000000000000000000000000000000000000000000006", "nextBackwardToken": "b/00000000000000000000000000000000000000000000000000000000" }
というコテコテのログが得られた。