[小ネタ] AWS Vaultの認証情報をDockerコンテナに渡してみた

AWS Vaultの仕組みを理解して、環境変数でDockerコンテナに認証情報を渡してみました。
2023.08.31

こんにちは!コンサル部のinomaso(@inomasosan)です。

下記のブログを参考にAWS ParallelCluster の管理コマンド(pclusterコマンド)の実行環境を準備していました。

ただ、AWS Vaultの認証情報をDockerコンテナに渡す部分に苦戦したので、備忘としてブログにまとめていきます。

AWS Valutとは

AWSのアクセスキー/シークレットキーを安全に保存・利用するためのOSSソフトウェアです。
このソフトウェアを利用することで、ローカルPC内の認証情報ファイルに平文でアクセスキー/シークレットキーを設定することなく認証情報を利用することができます。

詳細につきましては、以下のブログをご確認ください。

AWSの認証情報を確認

AWSの認証情報は上記のブログの通り、利用時に一時的な認証情報を取得して利用する形となります。

AWS VaultはIAM認証情報をOSのキーストアに保存し、認証情報の利用時にはSTSにて一時的な認証情報を取得した上でシェルやアプリケーションに引き渡します。

例えばTerraformでAWSリソースを作成したい場合は、以下のようなコマンドを実行する必要があります。

aws-vault exec <プロファイル名> -- terraform apply

実態としては、aws-vaultコマンドにより、環境変数に一時的な認証情報がセットされてコマンドを実行する形となります。 そのため、環境変数を出力することで認証情報を確認することができます。

% aws-vault exec <プロファイル名> -- env | grep AWS
AWS_VAULT=<プロファイル名>
AWS_DEFAULT_REGION=ap-northeast-1
AWS_REGION=ap-northeast-1
AWS_ACCESS_KEY_ID=ASIA%%
AWS_SECRET_ACCESS_KEY=%%%
AWS_SESSION_TOKEN=%%%

Dockerコンテナへの認証情報の渡し方

docker rundocker compose execで、ローカルPCの環境変数を渡すためには-e--envオプションで渡す必要があります。

実行するたびに環境変数をコピペしてDockerコンテナを実行するのでは、逆に作業効率が悪くなるので悩んでいたところ、下記のブログを見つけました。

上記のブログを参考にイメージをビルドして実行していきます。

docker compose build --no-cache
docker compose up -d
aws-vault exec <プロファイル名> env | \
    read envs <<< $(awk -v 'ORS= ' '/AWS_(REGION|ACCESS_KEY_ID|SECRET_ACCESS_KEY|SESSION_TOKEN)/ {print "-e " $0}'); \
    zsh -c "docker compose exec $envs pcluster bin/bash"

コンテナ上で環境変数の受け渡しができているかを確認します。

root@1234567890abc:/# env | grep AWS
AWS_REGION=ap-northeast-1
AWS_SECRET_ACCESS_KEY=%%%
AWS_ACCESS_KEY_ID=ASIA%%
AWS_SESSION_TOKEN=%%%

まとめ

今までDockerコンテナによる環境を構築したことがなかったので、AWS Vaultの認証情報を渡すのに苦労しました。
今回の検証でAWS Vaultの仕組みを理解することができたので、他のサードパーティーで認証情報が必要な場合にスムーズに対応できそうです。

この記事が、どなたかのお役に立てば幸いです。それでは!