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

AWS CLI v2ではblobの指定はBase64エンコードをする必要があります。覚えておきましょう。
2021.05.24

こんにちは。サービスグループの武田です。

AWS LambdaをAWS CLIで呼び出す機会はそう多くなかったのですが、やってみたら一発でうまくいかなかったので備忘録として残しておきます。

AWS CLIでLambda関数を呼び出すにはaws lambda invokeコマンドを利用します。

Lambda関数はペイロード(引数)を取ることができます。たとえば次のようにペイロードを指定できます。

$ aws lambda invoke --function-name input-test-function --payload '{ "name": "classmethod" }' response.json

AWS CLIがv1であればこれですんなりと話は終わるのですが、v2だとうまくいきません。理由は次のドキュメントで説明されています。

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

関数の準備

試すにあたって次のようなLambda関数をマネジメントコンソールから作成しました。関数名はinput-test-function、ランタイムはPython 3.8です。

lambda_function.py

import json

def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': json.dumps(event)
    }

コマンドを実行してみる

それでは失敗パターンから試してみます。

$ aws --version
aws-cli/2.1.10 Python/3.7.4 Darwin/19.6.0 exe/x86_64 prompt/off

$ aws lambda invoke --function-name input-test-function --payload '{ "name": "classmethod" }' response.json


Invalid base64: "{ "name": "classmethod" }"

Invalid base64 というエラーメッセージが出ました。AWS CLI v2を使用するにあたって、このメッセージは覚えておいた方がよさそうです。

それでは続いて成功パターン。正しくリクエストする方法は大きく2種類あります。1つ目は仕様どおりBase64でエンコードする方法。2つ目はオプションを指定してAWS CLI v1互換のモードにする方法です。それぞれ試してみます。

$ aws lambda invoke --function-name input-test-function --payload $(echo '{ "name": "classmethod" }' | base64) response.json
{
    "StatusCode": 200,
    "ExecutedVersion": "$LATEST"
}

$ cat response.json
{"statusCode": 200, "body": "{\"name\": \"classmethod\"}"}

ペイロードをBase64でエンコードしてやれば問題なく成功しますね。続いてオプション指定の方法も確認してみます。

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

$ cat response.json
{"statusCode": 200, "body": "{\"name\": \"classmethod\"}"}

こちらも成功しました。--cli-binary-format raw-in-base64-outを指定するのがポイントになります。なお.aws/configファイルにcli_binary_format=raw-in-base64-outを指定することでも同じ動作になります。

まとめ

AWS CLI v2がリリースされてだいぶ経ちましたが、移行はもうお済みでしょうか。基本的には同じように使えますが細かい変更でつまずくこともあります。まだの方はぜひ早めに試してみてください。