CDK内のLambdaをsam local invokeする
いろいろハマったのでメモ
準備
-
docker 入れてなかった→入れる
https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-22-04 -
SAM 入れてなかった→入れる
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-install-linux.html -
cdk
- Lambdaがあれば何でも。仮に以下のようなものを想定。fn とHelloHandlerだけ説明に使います。
const fn = new lambda.Function(this, 'HelloHandler', {
runtime: lambda.Runtime.PYTHON_3_9,
code: lambda.Code.fromAsset('lambda'),
handler: 'my_lambda.handler',
...
local invoke成功したとき
入力
sam local invoke -t ./cdk.out/CdkScheduleLambdaStack.template.json HelloHandler
出力
Invoking my_lambda.handler (python3.9)
Skip pulling image and use local one: public.ecr.aws/sam/emulation-python3.9:rapid-1.53.0-x86_64.
Mounting /home/user/Desktop/aws/cdk/cdk-schedule-lambda/cdk.out/asset.fa298259481283ebf9ce7718fd65c9c26b02584f9e250c21ff062907b025c3d9 as /var/task:ro,delegated inside runtime container
START RequestId: 7100d048-e5b6-4345-8786-8139714e6163 Version: $LATEST
Hello! 2022-08-07 06:06:02.774762
END RequestId: 7100d048-e5b6-4345-8786-8139714e6163
REPORT RequestId: 7100d048-e5b6-4345-8786-8139714e6163 Init Duration: 0.24 ms Duration: 734.35 ms Billed Duration: 735 ms Memory Size: 128 MB Max Memory Used: 128 MB
{"statusCode": 200}
エラーいろいろ
dockerがないエラー
Error: Running AWS SAM projects locally requires Docker. Have you got it installed and running?
公式のトラブルシュートの通りで、dockerが正しく動いていない。
これは、Docker が正しくインストールされていないことを意味します。ローカルでアプリケーションをテストするには、Docker が必要です。これを修正するには、開発ホスト用の Docker をインストールする手順を実行します。
docker 入れて、sudoを変えて(けっきょく効果なかった)、一度ログアウト、ログインしたら通った。
template.yml使えなかった
# 使えなかった
sam local invoke [OPTIONS] [STACK_NAME/FUNCTION_IDENTIFIER]
ここに書いてあるけど、できない。
Error: Template file not found at <project_root>/template.yml
こういうエラーがでる。template.ymlはSAMの記法なのでCDKでは使えないということ?
ロジカルIDでsam local invokeしてもNG
const fn = new lambda.Function(this, 'HelloHandler', {....
のfnを使って呼び出したら
sam local invoke -t ./cdk.out/CdkScheduleLambdaStack.template.json fn
エラー
fn not found. Possible options in your template: ['HelloHandler']
Error: Function fn not found in template
HelloHandlerの方を使うのが正しい。
Lambdaを変更したあとはcdk synthすること
synthして出力されるCdkScheduleLambdaStack.template.json
を見ているから、ということらしい。
CDKでS3へのPathを設定を削らないこと
このエラーでうまくいかなかった
The resource AWS::Lambda::Function 'HelloHandler2E4FBA4D' has specified S3 location for Code. It will not be built and SAM CLI does not support invoking it locally.
HelloHandler not found. Possible options in your template: []
Error: Function HelloHandler not found in template
原因は、CDK synthの出力からこういうMetadataを消していたからだった。
"Metadata": {
"aws:cdk:path": "CdkScheduleLambdaStack/HelloHandler/ServiceRole/Resource"
}
},
同じようなIssue
Discussion