全力で怠けたい

怠けるために全力を尽くしたいブログ。

AWS CLI v1 => v2 でバイナリ入力パラメータのデフォルトの解釈方法が変わっているメモ。

AWS CLI v1 => v2 で file:// とか使うときのバイナリ入力パラメータのデフォルトの解釈方法が変わっている。v2 を使うときにバイナリ入力パラメータのデフォルトの解釈方法を v1 互換にする方法とかを調べたメモ。

バイナリ入力パラメータのデフォルトの解釈方法

AWS CLI v1 => v2 でバイナリ入力パラメータのデフォルトの解釈方法が変わっている。 AWS CLI v2 を使うときにバイナリ入力パラメータのデフォルトの解釈方法を v1 互換にする方法をメモしておく。

AWS CLI のバージョン。

$ aws --version
aws-cli/2.0.35 Python/3.7.4 Darwin/19.5.0 botocore/2.0.0dev39

AWS CLI v2 はデフォルトで base64エンコードされたテキストに解釈する

AWS CLI v1 は file:// とか使うときのバイナリ入力パラメータをデフォルトで raw データつまりエンコードされていないテキストに解釈したけど、AWS CLI v2 は file:// とか使うときのバイナリ入力パラメータをデフォルトで base64エンコードされたテキストに解釈する。

以下のコードは AWS CLI v1 では意図するとおりに動くけど AWS CLI v2 はエラーになって Invalid base64: "Hello" が表示する。

$ aws kms encrypt --key-id=${KEY_ID} --plaintext="Hello" --query=CiphertextBlob --output=text

Invalid base64: "Hello"

file:// プレフィクスを使っても同じ結果になる。

$ aws kms encrypt --key-id=${KEY_ID} --plaintext=file://<(echo -n "Hello") --query=CiphertextBlob --output=text

Invalid base64: "Hello"

AWS CLI v1 => v2 で file:// とか使うときのバイナリ入力パラメータのデフォルトの解釈方法が変わってしまっているので、v1 のときに作ったツールとかシェルスクリプトを v2 を使うとエラーになったり、意図しない挙動になったりする。 エラーになるのは困るけど意図しない挙動になるともっと困ることが多いと思うので、v1 のときに作ったツールとかを作ったときに意図していた挙動で動かす方法を書いていく。

バイナリ入力パラメータを v1 互換の解釈方法にする

AWS CLI v2 はバイナリ入力パラメータの解釈方法をコマンドのフラグとか config ファイルで指定できる。

コマンドのフラグでバイナリ入力パラメータの解釈方法を指定する

コマンドのフラグでバイナリ入力パラメータの解釈方法を指定するには --cli-binary-format オプションを指定していく。 --cli-binary-format=raw-in-base64-out を指定すると AWS CLI v1 互換の解釈方法になる。

$ aws kms encrypt --key-id=${KEY_ID} --plaintext="Hello" --query=CiphertextBlob --output=text --cli-binary-format=raw-in-base64-out
# 暗号化したテキストが出力

file:// プレフィクスを使っても同じ結果になる。

$ aws kms encrypt --key-id=${KEY_ID} --plaintext=file://<(echo -n "Hello") --query=CiphertextBlob --output=text --cli-binary-format=raw-in-base64-out
# 暗号化したテキストが出力

cofig ファイルでバイナリ入力パラメータの解釈方法を指定する

AWS CLI v2 はバイナリ入力パラメータの解釈方法を config ファイルの cli_binary_format オプションに設定しておくとその解釈方法でバイナリ入力パラメータを解釈する。 cli_binary_format オプションが raw-in-base64-out のときは AWS CLI v2 はバイナリ入力パラメータを raw データとして解釈して、 cli_binary_format オプションが config ファイルにないか cli_binary_format オプションが base64 のときはバイナリ入力パラメータを base64エンコードされたテキストとして解釈する。

[default]
cli_binary_format = raw-in-base64-out

config ファイルを直接いじるかこんな感じのコマンドを実行すればいい。

$ aws configure set cli_binary_format raw-in-base64-out

$ cat ~/.aws/config
[default]
cli_binary_format = raw-in-base64-out
# 省略

$ aws kms encrypt --key-id=${KEY_ID} --plaintext="Hello" --query=CiphertextBlob --output=text
# 暗号化したテキストが出力

$  aws kms encrypt --key-id=${KEY_ID} --plaintext=file://<(echo -n "Hello") --query=CiphertextBlob --output=text
# 暗号化したテキストが出力

自分が普段使ってる環境は config を設定しておくのが手軽だけどシェルスクリプトを作って他の人に使ってもらったり CI で動かすときはバイナリ入力パラメータの解釈方法は config の設定に依存したくないと思うので --cli-binary-format フラグでバイナリ入力パラメータの解釈方法を指定するのがよさそう。

fileb:// プレフィクスを使うと常に raw データとして解釈する

AWS CLI v2 は fileb:// プレフィクスを使うとバイナリ入力パラメータを常に raw データとして解釈する。

$ cat ~/.aws/config
[default]
cli_binary_format = base64

$  aws kms encrypt --key-id=${KEY_ID} --plaintext=fileb://<(echo -n "Hello") --query=CiphertextBlob --output=text --cli-binary-format=base64
# 暗号化したテキストが出力

fileb:// プレフィクスは --cli-binary-format フラグと config ファイルの cli_binary_format オプションで base64 を指定してもバイナリ入力パラメータを常に raw データとして解釈するので、AWS CLI v1 のときに作ったツールとかシェルスクリプトAWS CLI v2 で同じ挙動にするのは fileb:// プレフィクスを使うのが一番楽なような気がする。

環境変数でバイナリ入力パラメータの解釈方法は指定できない

バイナリ入力パラメータの解釈方法は環境変数では指定できないので AWS CLI v2 でバイナリ入力パラメータの解釈方法を指定するのは --cli-binary-format フラグ、config ファイルの cli_binary_format オプションを指定するか、あるいは fileb:// プレフィクスを使っていく。

このエントリには、同等の環境変数はありません。

参考サイト