🥫

[Docker]コンテナでローカルのAWS認証情報を使用する

2023/05/01に公開

ローカルの認証情報を使って、 Docker コンテナから AWS にアクセスする方法

例えばですが、 S3 の操作をするバッチを Container 化して ECS 上で動かしたいとします。
まずは、ローカルで開発し dokcerfile を作り、その後下記のような compose.yaml も作ったとします。

compose.yaml
services:
  batch_aws:
    build: .

ローカル環境で docker compose up すると AWS 認証情報がないので AWS のリソースにアクセスできずにエラーとなります。(イメージ内部に認証情報を埋め込めばエラーにならないかもしれませんが、セキュリティ上とてもよろしくないです)

では、どうするのがよいでしょうか?
一つの解決策として、ローカルの AWS 認証情報を Container 内に取り込み、環境変数でプロファイルを指定することで AWS にアクセスが出来るようになります。

compose.yaml
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 を元に戻します。

compose.yaml
services:
  batch_aws:
    build: .

compose.local.yamlを作って、追加設定部分のみを書きます

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 を書き換えます

compose.yaml
services:
  batch_aws:
    build: .
    env_file: .env
compose.local.yaml
services:
  batch_aws:
    volumes:
      - ~/.aws/credentials:/root/.aws/credentials:ro
      - ~/.aws/config:/root/.aws/config:ro

.envファイルを用意します

.env
AWS_PROFILE={AWSのプロファイル名}
COMPOSE_FILE=compose.yaml:compose.local.yaml

この状態で docker compose up すると、
compose.yaml が compose.local.yaml にオーバライドされてローカル用の設定で動きます。

.envファイルを空にします

.env

この状態で docker cmpose up すると、 compose.yaml だけが使われるので本番用の設定で動きます。

以上です。

Discussion