AWS CLI v1 => v2 でバイナリ入力パラメータのデフォルトの解釈方法が変わっているメモ。
AWS CLI v1 => v2 で file://
とか使うときのバイナリ入力パラメータのデフォルトの解釈方法が変わっている。v2 を使うときにバイナリ入力パラメータのデフォルトの解釈方法を v1 互換にする方法とかを調べたメモ。
バイナリ入力パラメータのデフォルトの解釈方法
AWS CLI v1 => v2 でバイナリ入力パラメータのデフォルトの解釈方法が変わっている。 AWS CLI v2 を使うときにバイナリ入力パラメータのデフォルトの解釈方法を v1 互換にする方法をメモしておく。
$ 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://
プレフィクスを使っていく。
このエントリには、同等の環境変数はありません。