[Docker]コンテナでローカルのAWS認証情報を使用する
ローカルの認証情報を使って、 Docker コンテナから AWS にアクセスする方法
例えばですが、 S3 の操作をするバッチを Container 化して ECS 上で動かしたいとします。
まずは、ローカルで開発し dokcerfile を作り、その後下記のような compose.yaml も作ったとします。
services:
batch_aws:
build: .
ローカル環境で docker compose up
すると AWS 認証情報がないので AWS のリソースにアクセスできずにエラーとなります。(イメージ内部に認証情報を埋め込めばエラーにならないかもしれませんが、セキュリティ上とてもよろしくないです)
では、どうするのがよいでしょうか?
一つの解決策として、ローカルの AWS 認証情報を Container 内に取り込み、環境変数でプロファイルを指定することで AWS にアクセスが出来るようになります。
services:
batch_aws:
build: .
environment:
- AWS_PROFILE={AWSのプロファイル名}
volumes:
- ~/.aws/credentials:/root/.aws/credentials:ro
- ~/.aws/config:/root/.aws/config:ro
ここまでは、少し調べれば分かります。
しかしちょっと待ってください。これでは compose.yaml がローカルでしか使えなくなってしまっています。開発の時だけ書き換えるのは面倒くさいですしミスも怖いです。 compose.yaml を本番用と開発用に用意することも考えられますが、共通部分が2重管理になるのでイマイチです。
では、どうすればよいでしょうか?
docker compose を override しよう
override で解決しましょう。 compose ファイルは上書き出来ます。
まず、compose.yaml を元に戻します。
services:
batch_aws:
build: .
compose.local.yamlを作って、追加設定部分のみを書きます
services:
batch_aws:
environment:
- AWS_PROFILE={AWSのプロファイル名}
volumes:
- ~/.aws/credentials:/root/.aws/credentials:ro
- ~/.aws/config:/root/.aws/config:ro
これにより、
- ローカルのAWS認証情報を使いたい時は、
docker compose up -f compose.yaml -f compose.local.yaml
- それ以外(AWS上の本番環境など)の時は、
docker compose up
とすれば、毎回 compose.yaml を書き換えたりする必要はなくなります。
.envファイルで切り替えられるようにする
それでは本題です。
前述の方法でも、まぁ、悪くはないんですが、本番とローカルで起動コマンドが違うのは分かりにくいというのが個人的な感想です。また環境の違いによる差分なので環境変数で切り替えたいです。
アプリ開発時には .envファイルで環境変数を制御することが多いので、 docker 環境の切り替えも .env を使いたいです。
ということで .env から環境変数を読むことで切り替えができるように、 compose.yaml と compose.local.yaml を書き換えます
services:
batch_aws:
build: .
env_file: .env
services:
batch_aws:
volumes:
- ~/.aws/credentials:/root/.aws/credentials:ro
- ~/.aws/config:/root/.aws/config:ro
.envファイルを用意します
AWS_PROFILE={AWSのプロファイル名}
COMPOSE_FILE=compose.yaml:compose.local.yaml
この状態で docker compose up
すると、
compose.yaml が compose.local.yaml にオーバライドされてローカル用の設定で動きます。
.envファイルを空にします
この状態で docker cmpose up
すると、 compose.yaml だけが使われるので本番用の設定で動きます。
以上です。
Discussion