はじめに
こんにちは。アプリケーションサービス部の水垣です。
ある案件で 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) を利用するのが、手軽で学習コストも少なくていいのかなと考えています。
これについては、次回にでも書きたいと思います。
この記事が、誰かのお役に立てば幸いです。