🤢

CDK内のLambdaをsam local invokeする

2022/08/07に公開

いろいろハマったのでメモ

準備

    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
https://github.com/aws/aws-sam-cli/issues/2802

Discussion