AWS CLIバージョン2を使いだしたらlambda invokeが出来なくなった話

目次
  1. 何をしたかったのか
  2. 何故動かなかったのか
  3. 修正後
  4. 他の手段
  5. ~/.aws/config ファイルに追記する
  6. コマンドに追記する

何をしたかったのか

macOSから下記のようなシェルスクリプトでLambda関数を実行しようとしたのですが、 AWS CLIのバージョンを1から2にアップデートしたところ、突如としてエラーを吐くようになってしまいました。

aws lambda invoke --invocation-type Event \
          --function-name HogeFugaLambdaFunction \
          --region ap-northeast-1 \
          --payload '{ "hoge": "fuga" }' \
          --log-type Tail \
          outputfile.txt

何故動かなかったのか

AWS CLI バージョン 2 はデフォルトで base64 エンコードされた文字列としてバイナリパラメータを渡すようになりました https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cliv2-migration.html#cliv2-migration-binaryparam

AWS公式からしっかりアナウンスされていました。

今まではLambdaへ渡すjsonは単純に文字列指定していたのですが、base64エンコードが必要になったようです。

修正後

macOSでbase64エンコードする場合はecho '******' | base64を実行します。

aws lambda invoke --invocation-type Event \
          --function-name HogeFugaLambdaFunction \
          --region ap-northeast-1 \
          --payload $(echo '{ "hoge": "fuga" }' | base64) \
          --log-type Tail \
          outputfile.txt

他の手段

~/.aws/config ファイルに追記する

configファイルに追記することで、AWS CLIをバージョン1の挙動に戻すことが可能です。

~/.aws/config

cli_binary_format=raw-in-base64-out

コマンドに追記する

実行するコマンドに下記を付与して、AWS CLIをバージョン1の挙動に戻すこともできるようです。

--cli-binary-format raw-in-base64-out

以外にもググってすぐに答えが探し出せずに悩みました。