LoginSignup
0
0

More than 1 year has passed since last update.

[rails]git pushした後ローカルファイルを削除したらテーブルが作成できなかった話。

Posted at

経緯

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.   

catconfig/credentials.yml.encconfig/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ってすごい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0