Skip to Content

DockerコンテナにAWS資格情報を手軽に渡したい

概要

DockerコンテナにAWS認証情報を手軽に渡す方法

結論

環境変数にアクセスキー・シークレットキーを入れる

1
2
AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id)
AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key)

コンテナ起動時に環境変数を渡す

1
docker run --rm -it -e AWS_REGION=ap-northeast-1 -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY [コンテナ名:タグ] sh

環境

1
2
> aws --version
aws-cli/1.16.309 Python/3.7.5 Linux/5.3.0-24-generic botocore/1.13.45

状況

ECS Fargateで動かすコンテナを作成した際にローカルでテストしたかった
コンテナはalpineイメージにGoのバイナリを載せたシンプル構成
Goのコード自体はローカルの端末で~/.aws/credentialsの資格情報からAWSのリソースを扱えていた
コンテナの動作テストしたら当然資格情報がなくて弾かれる
ECS Fargateではタスクに割り当てたIAMロールで権限は管理するので、
ロールの権限設定以外の部分に手間をかけたくなかった

手順

aws-cliが動けば簡単に設定ができる
aws configure getコマンドを利用して設定済みの認証情報を拾って、
環境変数にそのまま入れることができる

1
2
$ AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id)
$ AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key)

ECRからdocker pullしてきたイメージでテストする
これはCodeBuildでビルドされたイメージ

1
2
3
4
$ docker images
REPOSITORY                                                        TAG                 IMAGE ID            CREATED             SIZE
xxx.dkr.ecr.ap-northeast-1.amazonaws.com/dmm-sent-line   latest              885391ac6096        51 minutes ago      17.5MB
bash

コンテナ起動時に-eオプションで環境変数を渡す
alpineのイメージを利用しているのでshでログインする
dmm-sent-lineはECRに作成したリポジトリ名です

1
$ docker run --rm -it -e AWS_REGION=ap-northeast-1 -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY xxx.dkr.ecr.ap-northeast-1.amazonaws.com/dmm-sent-line:latest sh

コンテナ内の様子
envコマンドで見てみるとアクセスキーが設定されている
GoのバイナリもSDKを通してAWSのリソースにアクセスできることを確認できた

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
/app # env
HOSTNAME=b47a3b488f77
SHLVL=1
HOME=/root
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
AWS_REGION=ap-northeast-1
AWS_ACCESS_KEY_ID=xxx
AWS_SECRET_ACCESS_KEY=xxx
PWD=/app

感想

Fargateで上手く動作しなくてローカルで動くかテストしたくて試してみた
すごく手軽だったから最初からやるべきだったと反省

参考

https://qiita.com/kter/items/be1d0a08aa39fb4cddc7