AWS CLI v2で Lambda を呼び出す際 payload を指定するとエラーになる事象を回避するには

2024.05.14

困っていた内容

AWS CLI v2 で Lambda の呼び出しを行っています。
--payloadを指定すると、コマンドがエラーとなり Lambda が呼び出せません。対処方法を教えてください。

どう対応すればいいの?

コマンドに--cli-binary-format raw-in-base64-outを追加してください。

AWS CLI バージョン 2 で Lambda の--payloadを指定する場合、原則として--cli-binary-format raw-in-base64-outが必要になります。

AWS Lambda関数の呼び出しがAWS CLI v2にアップデートすると失敗する | DevelopersIO

簡単にまとめれば、バイナリパラメーター(blob)を指定する際にはBase64でエンコードしてね、ということです。lambda invokeの--payloadはblobで指定することになっています。そのためAWS CLI v2ではペイロードをBase64でエンコードする必要があるわけです。それでは実例も交えて確認してみましょう。

--cli-binary-formatパラメータが不足している場合、次のようなエラーとなります。

パターンA

$ aws lambda invoke --function-name hato-lambda \
 --payload '{ "a": "a" }' response.json

Invalid base64: "{ "a": "a" }"

パターンB

$ aws lambda invoke --function-name hato-lambda \
 --payload '{ "あ": "い" }' response.json

string argument should contain only ASCII characters

パターンC

$ aws lambda invoke --function-name hato-lambda \
 --payload '{ "key": "value" }' response.json

An error occurred (InvalidRequestContentException) when calling the Invoke operation: Could not parse request body into json: Could not parse payload into json: Unexpected character ((CTRL-CHAR, code 145)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
 at [Source: (byte[])"��j[�"; line: 1, column: 2]

そのため AWS CLI バージョン 2 で、 Lambda の--payloadを指定する場合は--cli-binary-format raw-in-base64-outを追加してください。

追加例

$ aws lambda invoke --function-name hato-lambda --cli-binary-format raw-in-base64-out \
 --payload '{ "a": "a" }' response.json
{
    "StatusCode": 200,
    "ExecutedVersion": "$LATEST"
}

参考資料

AWS CLI バージョン 2 を使用している場合、cli-binary-format オプションは必須です。

AWS CLI バージョン 2 を使用している場合、cli-binary-format オプションは必須です。

バイナリパラメータはデフォルトで base64 エンコードされた文字列として渡されるようになりました

AWS CLI では、base64 でエンコードされた文字列を必要とするコマンドもあれば、UTF-8 エンコードのバイト文字列が必要なコマンドもあります。AWS CLI バージョン 1 では、2 つのエンコードされた文字列型間でデータを渡すには、多くの場合、中間処理が必要でした。AWS CLI バージョン 2 では、バイナリパラメータの処理の一貫性が向上するため、1 つのコマンドから別のコマンドに、より確実に値を受け渡すことができます。

AWS CLI バージョン 2 では、デフォルトですべてのバイナリ入力パラメータとバイナリ出力パラメータが base64 でエンコードされた文字列 blobs (バイナリラージオブジェクト) として渡されます 詳細については、「blob」を参照してください。

AWS CLI バージョン 1 の動作に戻すには、cli_binary_format ファイル設定または --cli-binary-format パラメータを使用します。