SAM CLI の local invoke の関数名として指定できるフォーマットのパターンが増えました
いわさです。
AWS SAM CLI がアップデートされまして、新しい v1.148.0 がリリースされています。
そのもう少し前になるのですが、v1.146.0 がリリースされたタイミングでいくつか新機能が追加されていました。
その中の次の機能がきになりました。
feat: Support all formats of function name in invoke (#8351)
sam local invokeで開発中の Lambda 関数をローカル実行できるわけですが、これまでは SAM テンプレート上の関数論理名を指定する必要がありました。
例えば次の SAM テンプレートと関数があったとします。
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
:
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.13
Architectures:
- arm64
Events:
HelloWorld:
Type: Api
Properties:
Path: /hello
Method: get
:
この時次のコマンドでローカル関数として実行できます。
% sam local invoke HelloWorldFunction
Invoking app.lambda_handler (python3.13)
Local image is up-to-date
Using local image: public.ecr.aws/lambda/python:3.13-rapid-arm64.
Mounting /Users/iwasa.takahito/work/hoge1110sam/hoge1110sam2/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated, inside runtime container
START RequestId: 794976ce-0fe3-4f46-9a77-8f554a790c25 Version: $LATEST
END RequestId: 284b9397-c0a5-40cb-a1b8-bddf996c0d6b
REPORT RequestId: 284b9397-c0a5-40cb-a1b8-bddf996c0d6b Init Duration: 0.03 ms Duration: 47.37 ms Billed Duration: 48 ms Memory Size: 128 MB Max Memory Used: 128 MB
{"statusCode": 200, "body": "{\"message\": \"hello world\"}"}
ただし、このsam local invokeは ARN 形式やエイリアスを指定した形式ではエラーになります。
% sam local invoke arn:aws:lambda:ap-northeast-1:123456789012:function:HelloWorldFunction
arn:aws:lambda:ap-northeast-1:123456789012:function:HelloWorldFunction not found. Possible options in your template: ['HelloWorldFunction']
Error: Function arn:aws:lambda:ap-northeast-1:123456789012:function:HelloWorldFunction not found in template
% sam local invoke 123456789012:function:HelloWorldFunction
123456789012:function:HelloWorldFunction not found. Possible options in your template: ['HelloWorldFunction']
Error: Function 123456789012:function:HelloWorldFunction not found in template
% sam local invoke HelloWorldFunction:hogeAlias
HelloWorldFunction:hogeAlias not found. Possible options in your template: ['HelloWorldFunction']
Error: Function HelloWorldFunction:hogeAlias not found in template
この 8351 のイシューの大元は次のイシューでして、どうやら外部システムによっては実際のリモート関数と同じ ARN 形式やバージョンを指定した形式で呼び出せるようにする必要があるのではないかという意見です。なるほど。
私自身はこれまで外部システムから SAM ローカル関数を ARN 形式で実行する場合を経験したことがないのですが、今後使うこともあるかもしれないので今回最新バージョンでの挙動を確認してみました。
最新バージョンで色々なパターンを試してみる
事前に SAM CLI をブログ執筆時点の最新バージョン v1.146.0 にアップデートしておきます。
% sam --version
SAM CLI, version 1.146.0
先程の旧バージョンではエラーになった ARN 形式やエイリアスを指定した形式などを試してみましょう。
% sam local invoke arn:aws:lambda:ap-northeast-1:123456789012:function:HelloWorldFunction
Invoking app.lambda_handler (python3.13)
Local image is up-to-date
Using local image: public.ecr.aws/lambda/python:3.13-rapid-arm64.
Mounting /Users/iwasa.takahito/work/hoge1110sam/hoge1110sam2/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated, inside runtime container
SAM_CONTAINER_ID: 06a9c8611083b92ffb006077154605424ef0846b0bb1a3b37b14b33937258001
START RequestId: 6a92eb8c-e181-4d7a-a99d-808107446399 Version: $LATEST
END RequestId: 65bbdca7-a0cd-4f56-97d4-257b8eb2c8c9
REPORT RequestId: 65bbdca7-a0cd-4f56-97d4-257b8eb2c8c9 Init Duration: 0.06 ms Duration: 55.80 ms Billed Duration: 56 ms Memory Size: 128 MB Max Memory Used: 128 MB
{"statusCode": 200, "body": "{\"message\": \"hello world\"}"}
% sam local invoke 123456789012:function:HelloWorldFunction
Invoking app.lambda_handler (python3.13)
Local image is up-to-date
Using local image: public.ecr.aws/lambda/python:3.13-rapid-arm64.
Mounting /Users/iwasa.takahito/work/hoge1110sam/hoge1110sam2/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated, inside runtime container
SAM_CONTAINER_ID: 2b1371aa6b3c09c9ae5d7b5cd0f9e56f152acd6a1d6c1da329449a56c2641c23
START RequestId: ea59b0e6-f393-4741-b6be-c128ded0112c Version: $LATEST
END RequestId: 6238903e-f162-4fba-8f17-302fbb3af0b8
REPORT RequestId: 6238903e-f162-4fba-8f17-302fbb3af0b8 Init Duration: 0.10 ms Duration: 65.03 ms Billed Duration: 66 ms Memory Size: 128 MB Max Memory Used: 128 MB
{"statusCode": 200, "body": "{\"message\": \"hello world\"}"}
% sam local invoke HelloWorldFunction:hogeAlias
Invoking app.lambda_handler (python3.13)
Local image is up-to-date
Using local image: public.ecr.aws/lambda/python:3.13-rapid-arm64.
Mounting /Users/iwasa.takahito/work/hoge1110sam/hoge1110sam2/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated, inside runtime container
SAM_CONTAINER_ID: 545704df2555b0b7b73eefe8c99403418b4abcf75064158e74b477e761c303ca
START RequestId: 02229219-172d-499f-9882-342ea5f79b63 Version: $LATEST
END RequestId: f5395ebd-c5a1-46fd-9fc4-032a9d984f64
REPORT RequestId: f5395ebd-c5a1-46fd-9fc4-032a9d984f64 Init Duration: 0.02 ms Duration: 45.63 ms Billed Duration: 46 ms Memory Size: 128 MB Max Memory Used: 128 MB
{"statusCode": 200, "body": "{\"message\": \"hello world\"}"}
なるほど、すべて成功しました。
リモート関数の ARN を指定してローカル INVOKE 出来るわけではない
ここで指定する ARN は実在の ARN というわけではなく、あくまでの ARN 形式であって内部的にはそこから正規表現で関数名を抽出して local invoke に使っているみたいです。
そのため、私が検証前に勘違いしていたのですが次のようにリモートデプロイした時の ARN を指定しても、関数名が違っている場合はエラーになります。
% sam deploy
:
Key HelloWorldFunction
Description Hello World Lambda Function ARN
Value arn:aws:lambda:ap-northeast-1:123456789012:function:hoge1110sam2-HelloWorldFunction-3kbm3KGveEQq
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Successfully created/updated stack - hoge1110sam2 in ap-northeast-1
% sam local invoke arn:aws:lambda:ap-northeast-1:123456789012:function:hoge1110sam2-HelloWorldFunction-3kbm3KGveEQq
arn:aws:lambda:ap-northeast-1:123456789012:function:hoge1110sam2-HelloWorldFunction-3kbm3KGveEQq not found. Possible options in your template: ['HelloWorldFunction']
Error: Function arn:aws:lambda:ap-northeast-1:123456789012:function:hoge1110sam2-HelloWorldFunction-3kbm3KGveEQq not found in template
さいごに
本日は SAM CLI の local invoke の関数名として指定できるフォーマットのパターンが増えたので試してみました。
これまで使っていた方に影響が出ることはないので意識しなくても大丈夫ですが、こういった指定の仕方もできるようになったと覚えておいても良いですね。
使うかわからないですけど。






