CodeBuildでRails5.2プロジェクトをビルドしようてハマった


概要

CodeBuildでRails5.2プロジェクトをビルドしようてハマったのでメモ

症状

ビルド時にRAILS_MASTER_KEYがないといわれてエラー終了する

Missing encryption key to decrypt file with. Ask your team for your master key and write it to /app/config/master.key or put it in the ENV['RAILS_MASTER_KEY'].

原因

以下の条件が重なってエラーになっていた

  • ENV['RAILS_MASTER_KEY']が設定されていなかった
  • Dockerfile内でRailsプロセスの起動を行なっていた
  • config.require_master_key = true が設定されていた
...
ENTRYPOINT ["./entrypoint.sh"]
entrypoint.sh
bundle exec rake about
bundle exec rake db:create db:migrate db:seed
config/environments/production.rb
config.require_master_key = true

解決方法

以下の2点が必要

  • CodeBuildの環境変数としてRAILS_MASTER_KEYを設定する
  • docker build 時に引数としてRAILS_MASTER_KEYを渡す

CodeBuildの環境変数としてRAILS_MASTER_KEYを設定する

マネージメントコンソールからビルドの環境変数としてRAILS_MASTER_KEYを設定してもよいのだが、
機密情報ではあるのでAWS System Managerのパラメータストアを利用する。

version: 0.2
env:
  parameter-store:
    RAILS_MASTER_KEY: 'rails_master_key'
  variables:
    AWS_DEFAULT_REGION: us-east-1
    REPOSITORY_URI: 08123xxxx.dkr.ecr.us-east-1.amazonaws.com/collect_and_destroy

envparameter-storeにキーを設定する。
RAILS_MASTER_KEYがCodeBuildで利用できる環境変数名、rails_master_keyがSystem Managerのパラメータとして設定したキー名となる。

docker build 時に引数としてRAILS_MASTER_KEYを渡す

シェルに設定された環境変数とDockerから利用される環境変数は違うみたい
Dockerから利用される環境変数を設定するにはENVARGという定義命令を使う
ENVは環境変数の定義、ARGdocker build時に引数として値を渡すことができる

ENV RAILS_ENV production
ARG RAILS_MASTER_KEY

ARGに引数を渡すには以下のようなコマンドを実行する

$ docker build --build-arg RAILS_MASTER_KEY=12345 -t docker_image:latest .

最終的に以下のような感じになった

buildspec.yml
version: 0.2
env:
  parameter-store:
    RAILS_MASTER_KEY: 'rails_master_key'
phases:
  build:
    commands:
      - docker build --build-arg RAILS_MASTER_KEY=$RAILS_MASTER_KEY -t collect_and_destroy:latest .