AWS CodeBuild で Rails アプリケーションの docker build


業務で、Rails アプリケーションの docker buildAWS 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 に設定が引き渡されています。

config.rb#L197-L200
if aws_iam?
    options.merge!({
        :use_iam_profile => true
    })

docker build 時の環境設定変数

上記の設定により、fog-aws では、 こちら にて認証情報を取得しています。

credential_fetcher.rb#L16
if options[:use_iam_profile]

さらにコードを読むと以下のような条件が存在します。

credential_fetcher.rb#L21
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 の部分は、以下のようになります。

buildspec.yml
build:
    commands:
      - |
        docker build -t app \
        --build-arg AWS_CONTAINER_CREDENTIALS_RELATIVE_URI=${AWS_CONTAINER_CREDENTIALS_RELATIVE_URI} \
        .

参考