概要
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
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 .
最終的に以下のような感じになった
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 .