業務で、Rails アプリケーションの docker build
を AWS CodeBuild で行なっており、assets:precompile
時に assets を Amazon S3 にアップロードしています。
その際に、AWS CodeBuild サービスロールで全てを行うために設定したことをまとめます。
結論
- Asset Sync では、
aws_iam_roles: Yes
で設定する。 -
docker build
時に AWS CodeBuild のコンテナの環境設定変数AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
を参照する。
前提
- Rails アプリケーションを Docker で運用している。
-
assets:precompile
時に Asset Sync を利用して assets を Amazon S3 にアップロードしている。 -
docker build
は、AWS CodeBuild で実行している。
詳細
Asset Sync の設定
Asset Sync では、 README に書かれているように、 IAM ロール を利用すればアクセスキーを設定する必要はありません。
具体的には、こちらで fog-aws に設定が引き渡されています。
if aws_iam?
options.merge!({
:use_iam_profile => true
})
docker build 時の環境設定変数
上記の設定により、fog-aws では、 こちら にて認証情報を取得しています。
if options[:use_iam_profile]
さらにコードを読むと以下のような条件が存在します。
if ENV["AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"]
AWS のコンテナ (CodeBuild) では、インスタンスのメタデータ取得先が Amazon EC2 とは異なります。そのため、上記の環境設定変数の参照が必要となっています。
docker build
で変数を利用したい場合は、 ARG
を利用します。こちらの値を assets:precompile
の際に参照させるようにしてください。
ARG AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
最終的に、 AWS CodeBuild で利用する buildspec.yml の docker build
の部分は、以下のようになります。
build:
commands:
- |
docker build -t app \
--build-arg AWS_CONTAINER_CREDENTIALS_RELATIVE_URI=${AWS_CONTAINER_CREDENTIALS_RELATIVE_URI} \
.