概要
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"]
bundle exec rake about
bundle exec rake db:create db:migrate db:seed
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
envのparameter-storeにキーを設定する。
RAILS_MASTER_KEYがCodeBuildで利用できる環境変数名、rails_master_keyがSystem Managerのパラメータとして設定したキー名となる。
docker build 時に引数としてRAILS_MASTER_KEYを渡す
シェルに設定された環境変数とDockerから利用される環境変数は違うみたい
Dockerから利用される環境変数を設定するにはENVかARGという定義命令を使う
ENVは環境変数の定義、ARGはdocker build時に引数として値を渡すことができる
ENV RAILS_ENV production
ARG RAILS_MASTER_KEY
ARGに引数を渡すには以下のようなコマンドを実行する
$ docker build --build-arg RAILS_MASTER_KEY=12345 -t docker_image:latest .
最終的に以下のような感じになった
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 .