経緯
cloud9でrailsをかたかた。
↓
git push。
↓
ec2の作成をしていたため、無料利用枠ぎりぎりに。「git hubにあげたし、まあええか」とファイルごとcloud9を削除。
↓
gitからファイルを引っ張って、ec2の環境構築。
↓
無事死亡
もう少し具体的に話すと
$ bundle exec rails db:create RAILS_ENV=production
でproductionのデータベースを作成しようとしたところ、
ActiveSupport::MessageEncryptor::InvalidMessage
と言われる。
答えは全て以下の記事にありました。
参考
【Rails】ActiveSupport::MessageEncryptor::InvalidMessage
Rails 5.2 で ActiveSupport::MessageEncryptor::InvalidMessage
Railsのmaster.keyで泣くほどハマった・・
参考にさせて頂いた記事の内容を簡単に言うと、5.2以降のrailsのセキュリティに自分でひっかかってしまったという話のようです。
rails new
をするとmaster.key
が自動で作成される。
これは.gitignore
によって、pushしても反映されない。
つまり、リモートから引っ張ってきたファイルではmaster.key
が存在しないため、credentials.yml.enc
の復号ができない。よってエラーが発生する。
ローカルのファイルが手元にないと、どうにもならない!!!
EDITOR=vim bundle exec rails credentials:edit
で新たにmaster.key
を作成したとしても、既存のcredentials.yml.enc
の鍵ではないため、なんの意味もないということです。
対処方法
本番環境に、元のmaster.key
をコピペすれば済む話。
私と同じようにローカルファイルを削除してしまった場合は、
チーム開発など複数人での開発であれば、ローカルのキーを教えてもらい、config/master.key
に書き込めばそれで完了です。
独り身の方は大人しく諦めましょう。
もしくは、credentials.yml.enc
に大したことを書いていない場合は、新たに作り直すことでどうにかなるようです。
実際にやってみた。
$ rm credentials.yml.enc
$ EDITOR="vi" bin/rails credentials:edit
エラーが発生。鍵の方もこの世から消し去ることにする。
$ rm master.key
$ EDITOR="vi" bin/rails credentials:edit
今度は成功。以下のことを言われる。
Save this in a password manager your team can access.
If you lose the key, no one, including you, can access anything encrypted with it.
create config/master.key
File encrypted and saved.
cat
でconfig/credentials.yml.enc
とconfig/master.key
を確認。
どちらも新たな内容が作成されている。
というわけで、今度こそデータベースを作ってみる。
$ bundle exec rails db:create RAILS_ENV=production
Mysql2::Error::ConnectionError: Access denied for user ユーザー名 (using password: NO)
パスワードが違うと怒られる。
パスワードはAWS SSMのパラメータストアから引っ張ってきていて、設定も完了していた。
printenv
で確認。
環境変数の反映が消えている。
aws configure list
で確認。
aws configureの情報は保持されている。
パラメータストアのbashファイルの設定をやり直してみる。
$ export 名前=$(aws ssm get-parameters --リージョン --name 名前 --query "Parameters[0].Value" --output text)
printenv
でもう一度確認。
環境変数にパスワードが反映されている。
今度こそいきたいところ。
$ bundle exec rails db:create RAILS_ENV=production
成功!
おわりに
リモートにファイルがある=ローカルを削除してもよい、
というわけではないんだな、と。
というかファイルに限らず、不用意な削除は禁物ですね。
.gitignoreってすごい。