「AWS EC2を使ってRailsアプリをデプロイ」のログ02 gitと連携~master.keyの取得まで
gitとの連携
アプリをgitからクローンし、EC2インスタンス内に配置していきます。
gitのclone
これでできた
git cloneする時permission deniedが出る場合、レポジトリがGithubにある場合は、~/.ssh/configのHostの部分をHost github→Host github.comに変更すると、通るようになるかもしれません。
エラー
rake secret Could not find rake-13.0.2 in any of the sources Run `bundle install` to install missing gems.
解決柵
そもそもアプリがDocker環境だから、Docker環境ないで一度secret_key作成して、config内に貼り付けてpush。ec2内のアプリを削除して(keyがないアプリ)keyを作成してpushしたアプリをec2インスタンス内にクローンした。念の為、ec2内のアプリにvim congig/secret.ymlでみてみると、keyが登録されていた。
webサーバ・アプリケーションサーバー/Racksとは?
https://qiita.com/naoki_mochizuki/items/5a1757d222806cbe0cd1
・クライアントからの簡単な命令だと、webサーバが処理してくれる。
しかし、
$ rails s
を命令したら、webサーバーでは処理できず、その先にあるアプリに情報が届く。そのアプリ本体がアプリケーションサーバー内に置かれている。
・アプリとアプリケーションサーバーは使われている言語が違う。その仲介をするのがRackと呼ばれるもの
・大半のアプリケーションサーバーは、webサーバーを使わずに単体で実行できます。
Nginx :Webサーバー
ここからは、myappを操作していくから、もしdocker環境内でしか動かないという操作があるかどうか、下までスクロールして確認してみる。
↓
bundle installとかがある。
↓
また一回消して、最後にクローンする。
↓
それでワークするのか?myappがec2内にないとダメな時があるかみてみる。
protospace: hogeみたいに使う?なんかアプリケーション名が入るところによく使われていた。
エラー
$sudo service mysqld start Failed to start mysqld.service: Unit not found.
解決策
2つセット
【ハンズオン】Amazon Linux2にApache、PHP、MySQLをインストールする - Qiita
【個人メモ】RailsアプリをAWSへデプロイする際につまづいたことまとめ - Qiita
mysqlをインストールすると、maniraがインストールされてしまう。
[kazumawada@ip-10-0-0-197 myapp]$ sudo yum install mysql 読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd amzn2-core | 3.7 kB 00:00:00 200 packages excluded due to repository priority protections パッケージ 1:mariadb-5.5.68-1.amzn2.x86_64 はインストール済みか最新バージョンです 何もしません
自分のバージョン
mysql Ver 8.0.23 for Linux on x86_64 (MySQL Community Server - GPL)
だから、
$ yum localinstall -y https://dev.mysql.com/get/mysql80-community-release-el7-2.noarch.rpm $ yum -y install mysql mysql-community-server $ mysql --version mysql Ver 8.0.23 for Linux on x86_64 (MySQL Community Server - GPL) #アプリと同じバージョンになってる。
エラーになったコマンドを実行してみる
[kazumawada@ip- myapp]$ sudo service mysqld start Redirecting to /bin/systemctl start mysqld.service $
今度はエラーなしで通った。
このエラーの参考(mysql8のダウンロード解説)
【ハンズオン】Amazon Linux2にApache、PHP、MySQLをインストールする - Qiita
DB作る
が、またエラー。
[kazumawada@ip- myapp]$ rake db:create RAILS_ENV=production rake aborted! LoadError: libmysqlclient.so.18: cannot open shared object file: No such file or directory - /home/kazumawada/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3/lib/mysql2/mysql2.so /var/www/rails/myapp/config/application.rb:25:in `<top (required)>' /var/www/rails/myapp/Rakefile:4:in `require_relative' /var/www/rails/myapp/Rakefile:4:in `<top (required)>' (See full trace by running task with --trace)
解決策
一つ目
【ハンズオン】Amazon Linux2にApache、PHP、MySQLをインストールする - Qiita
2つ目
この部分が詰まったので共有します。 結論原因はMySQLには初期パスワードが存在する、ということです。 なのでその初期パスワードをconfig/database.ymlのpasswordに記述する必要があります。 こちらを参考に確認してください。
3つセット
AWS Amazon LinuxサーバにMySQLをインストールした際に詰まった箇所の備忘録 - Qiita
EC2 MySQL 初期設定 root にパスワードの設定 - Qiita
1つめのqiitaでやってみる
mysqlのパスワードが原因せつ
[kazumawada@ip myapp]$ sudo more /var/log/mysqld.log | grep password 2021-02-07T04:14:21.761748Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: c>y4et(1DncW
上記をもとに、mysqlへログイン。
その後パスワードを変えようとしたら、
mysql> set password for root@localhost=password('Hogehoge1234@');
mysql8は書き方が違うらしい。パスワード設定の。
正しくは、↓(passwordとしたら、もっと厳重なものにしろと言われた。)
mysql> set password for 'root'@'localhost' = 'password'; ERROR 1819 (HY000): Your password does not satisfy the current policy requirements mysql> mysql> set password for 'root'@'localhost' = 'HOGEhoge12345@'; Query OK, 0 rows affected (0.01 sec) mysql>
https://qiita.com/k3ntar0/items/22486f0666dc1759e0c1
パスワード設定完了した。
上にも書いたように、
この部分が詰まったので共有します。 結論原因はMySQLには初期パスワードが存在する、ということです。 なのでその初期パスワードをconfig/database.ymlのpasswordに記述する必要があります。 こちらを参考に確認してください。
これをdatabase.ymlに追記する必要がある。
これをdatabase.ymlに追記する必要がある。
#ここにpasswordを書き足す [kazumawada@ip- myapp]$ vim config/database.yml
↓
まだ変わらずエラー
[kazumawada@ip myapp]$ rake db:create RAILS_ENV=production rake aborted! LoadError: libmysqlclient.so.18: cannot open shared object file: No such file or directory - /home/kazumawada/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3/lib/mysql2/mysql2.so /var/www/rails/myapp/config/application.rb:25:in `<top (required)>' /var/www/rails/myapp/Rakefile:4:in `require_relative' /var/www/rails/myapp/Rakefile:4:in `<top (required)>' (See full trace by running task with --trace)
考えられること
・mysqlが起動したままだから、
mysql.server stop mysql.server start
する
https://qiita.com/fukumon/items/69c541cd5c87d77465b2
↑これ良質なやつ
・passwordをpasswordに変えてみる。(dockerとかのpasswordはそれだから。)
変えるときに、mysql8だから、また特殊なコマンドを使う必要があるかもしれない。
・まずもう一回ログインしてみる
整理:解決したいことは、
LoadError: libmysqlclient.so.18: cannot open shared object file:
mysql2 gem not working after updating to Ubuntu 16.04 - libmysqlclient.so.18
これをやってみた。
bundle install時にエラー
An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue. Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling.
今gemにあるもの
gem 'mysql2', '~> 0.5'
これを
gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/
に変えてインストールしてみる。
↓
mysql client is missing. You may need to 'sudo apt-get install libmariadb-dev', 'sudo apt-get install libmysqlclient-dev' or 'sudo yum install mysql-devel', and try again.
エラー文に書いてある
sudo yum install mysql-devel
を実行。
またgem mysql2の再bundleしてみる
↓
$ gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/ Building native extensions. This could take a while... Successfully installed mysql2-0.5.3 Parsing documentation for mysql2-0.5.3 Installing ri documentation for mysql2-0.5.3 Done installing documentation for mysql2 after 0 seconds 1 gem installed
できた。
今度はどうか
[kazumawada@ip-10-0-0-197 myapp]$ rake db:create RAILS_ENV=production rake aborted! LoadError: Error loading the 'mysql2' Active Record adapter. Missing a gem it depends on? mysql2 is not part of the bundle. Add it to your Gemfile. /var/www/rails/myapp/config/environment.rb:5:in `<main>' Caused by: Gem::LoadError: mysql2 is not part of the bundle. Add it to your Gemfile. /var/www/rails/myapp/config/environment.rb:5:in `<main>' Tasks: TOP => db:create => db:load_config => environment (See full trace by running task with --trace)
reinstall時に、gemfileからmysql2を消してしまっていた。
gem 'mysql2', '~> 0.5' bundle install
↓
Couldn't create 'myapp_production' database. Please check your configuration. rake aborted! ActiveRecord::ConnectionNotEstablished: Unknown MySQL server host 'db' (2) Caused by: Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (2) Tasks: TOP => db:create (See full trace by running task with --trace)
mysqlを最初からにしたから、また色々設定が必要だった。
まずスタートさせてみる(忘れてた)
sudo service mysqld start
それでもまだunknow
・mysqlログインするときのpaswwordをconfigに書いていないとか。
passwordを表記してもエラー。
そもそも
Caused by: Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (2)
とはどういうエラーなんだろうか。
sudo yum install -y docker
2/8
https://www.youtube.com/watch?v=DYoXhTUfm98
Caused by: Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (2)
権限を確認するコマンド
ls -l
ec2内で誰がログインしているのか
who
権限を変える
sudo chown 変えたいユーザー var
ディレクトリを削除する
$ rm -r
master.keyがない場合
$ bin/rails credentials:edit No $EDITOR to open file in. Assign one like this: EDITOR="mate --wait" bin/rails credentials:edit For editors that fork and exit immediately, it's important to pass a wait flag, otherwise the credentials will be saved immediately with no chance to edit. $ EDITOR="mate --wait" bin/rails credentials:edit Adding config/master.key to store the encryption key: 2eefab762a20f47777bc4fe257798d2a 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 Couldn't decrypt config/credentials.yml.enc. Perhaps you passed the wrong key? #
myappのmaster.keyをec2内に登録したところ、
エラー
Couldn't decrypt config/credentials.yml.enc. Perhaps you passed the wrong key?
/config/master.keyが共有できない環境ではmaster keyを環境変数:RAILS_MASTER_KEYで指定します。
/config/master.keyが存在せず、環境変数:RAILS_MASTER_KEYでmaster keyが設定されてない場合はcredentials.yml.enc内のデータは読み取れません。
Rails5.2から追加された credentials.yml.enc のキホン - Qiita
・ローカルでも編集をすることができなかった。
つまり、/config/master.keyが共有できない環境ではmaster keyを環境変数:RAILS_MASTER_KEYで指定します
↑
これが解決してくれそう。
それのやり方
$ rails c irb(main):001:0> Rails.application.credentials.secret_key_base => nil
or
$ export RAILS_MASTER_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" $ rails c irb(main):001:0> Rails.application.credentials.secret_key_base => cee513823adb2cda09b6c08b2b5508..
試しにローカルでやってみる
rails c したら、こうなった
ActiveSupport::MessageEncryptor::InvalidMessage (ActiveSupport::MessageEncryptor::InvalidMessage)
=
「端的にcredentials.yml.encの文字列とmaster.keyの文字列の組み合わせが不正解であるということです。」
https://hirocorpblog.com/rails-credentials-master/
if you delete your project local and clone it again your master.key will be lost.
The only way to fix this is by setting up new credentials.yml.enc and add your AWS credentials to it again. First you need to remove the existing credentials.yml.enc and then run: rails credentials:edit to create a new one.
つまり、master.keyがcloneしてしまってないから、また作った
↓
credentialと整合性が取れない。
↓
credential消して、
run: rails credentials:edit
でmaster.key作る
↓
解決
[f:id:kaz08:20210207143003j:plain]