らんだむな記憶

blogというものを体験してみようか!的なー

CDK (4)

折角なので、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"
}

というコテコテのログが得られた。