AWS Secrets Manager に AWS CLI で秘密鍵を格納したら Invalid base64 エラーが発生

記事タイトルとURLをコピーする

はじめに

こんにちは。アプリケーションサービス部の水垣です。

ある案件で Secrets Manager に格納した秘密鍵を利用して、SSH 通信させるような Lambda を作成していました。
その際に、Secrets Manager に秘密鍵をバイナリデータとしてAWS CLI から登録しようとして、不可解な内容のエラー(Invalid base64)に直面して頭を抱えてました...

結論

最初に結論を書いてしまうと、実行した環境の AWS CLI のバージョンに起因するエラーでした。
AWS CLI の v1 と v2 とで、バイナリパラメーターの Base64 の扱いが異なるんですね。
まったく知りませんでした...
これは、コマンドのパラメーターに --cli-binary-format raw-in-base64-out を追加することで解決できます。
詳細は、以下の公式サイトをご覧ください。

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

なにが発生したのか

手元の Mac から、AWS CLI を利用し、 Secret を作成して秘密鍵ファイルの中身を登録しようとしました。
秘密鍵自体は、手元の Mac から対象の公開鍵を設定した EC2 に SSH 接続できているので、正常な鍵ファイルです。

以下が実行したコマンドと、出力されたエラーの結果です。

$ aws secretsmanager create-secret \
> --name sample-key \
> --description "接続用の秘密鍵" \
> --secret-binary file:///Users/xxx/xxxx/test_id_rsa

Invalid base64: "-----BEGIN OPENSSH PRIVATE KEY-----
b3B
...
...EC
-----END OPENSSH PRIVATE KEY-----
"

Invalid base64 ... 無効なBase64...え!? 普通に利用できているのに、訳わかりません (T_T)

何を試したか

自分で調べても有効な解決策がみつけられず、メンバーに相談して試しに EC2 上からコマンドを実施してみようとなりました。
実際に EC2 を新規に立ち上げて試してみると、EC2 からの実行では普通に登録できました。え!? OSの違い...まさか...え!?
ちょっと解せずに悶々としてたら、メンバーから「AWS CLI のバージョン差異とかないですか?」の一言が。

実際に調べてみると、Mac が ver2、EC2 が ver1 でした。

# Mac
$ aws --version
aws-cli/2.2.38 Python/3.9.7 Darwin/...

# EC2
$ aws --version
aws-cli/1.18.147 Python/2.7.18 Linux/4.14.243-185.433.amzn2.x86_64 botocore/1.18.6

で、先に記載した AWS の公式ページの内容を知ることとなりました。
ちなみに、EC2 の AWS CLI のデフォルトって、ver1 なんですね。

最後に

開発をしていると、時々ブチ当たるバージョン問題。悩ましいですね。
Docker で環境を統一したり、自身の利用している環境で使用するツール類のバージョンをきちんと把握したり、なるべく足を引っ張られないようにしたいところです。

開発環境を統一する方向としては、AWS Lambda をよく構築する身としては、Amazon Linux 2 の Docker Image を利用して Visual Studio Code の Remote-Containers(ms-vscode-remote.remote-containers) を利用するのが、手軽で学習コストも少なくていいのかなと考えています。
これについては、次回にでも書きたいと思います。

この記事が、誰かのお役に立てば幸いです。