「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とは?

f:id:kaz08:20210208150903p:plain https://qiita.com/naoki_mochizuki/items/5a1757d222806cbe0cd1

・クライアントからの簡単な命令だと、webサーバが処理してくれる。

しかし、

$ rails s

を命令したら、webサーバーでは処理できず、その先にあるアプリに情報が届く。そのアプリ本体がアプリケーションサーバー内に置かれている。

・アプリとアプリケーションサーバーは使われている言語が違う。その仲介をするのがRackと呼ばれるもの

大半のアプリケーションサーバーは、webサーバーを使わずに単体で実行できます。

Unicorn : アプリケーションサーバ

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

mysql5.7でパスワードを変更する - 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

mysql5.7でパスワードを変更する - Qiita

 ↑これ良質なやつ

・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

そもそもcredentials.yml.enc

・ローカルでも編集をすることができなかった。

つまり、/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作る

https://stackoverflow.com/questions/63348058/couldnt-decrypt-config-credentials-yml-enc-perhaps-you-passed-the-wrong-key

解決

qiita.com

[f:id:kaz08:20210207143003j:plain]