「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]

「AWS EC2を使ってRailsアプリをデプロイ」のログ01

はじめに

*個人情報っぽいものはhogeで隠している。

作成したインスタンスにパブリックDNSが表示されない場合、ここを参考

AWSでPublic DNS(パブリックDNS)が割り当てられない時の解決法 - Qiita

EC2ログインする

brew install python
brew install awscli
↑まずやる

wadakazuma@kw desktop % mkdir ~/.ssh
wadakazuma@kw desktop % cd ~/.ssh   
wadakazuma@kw .ssh % chmod 600 key_berlin_now.pem 
wadakazuma@kw .ssh % ssh -i key_berlin_now.pem ec2-user@ここにElasticIP
ssh: connect to host 52.197.166.41 port 22: Operation timed out

↓ port:22エラー 

【AWS EC2 エラー】ssh port 22 Operation timed out - Qiita

上によると、セキュリティグループのインバウンドルールの、port22をカスタムからマイipに変える必要があるらしい。その後インスタンスを停止、起動

結果: 行けた(個人情報っぽいものは、hogeで隠した。)

wadakazuma@kw .ssh % ssh -i key_berlin_now.pem ec2-user@ここにelasticip
The authenticity of host 'hogehoge' can't be established.
ECDSA key fingerprint is hogehoge.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

ssh通信による、インスタンスへのログイン

サーバーとクライアントの暗号化された通信

f:id:kaz08:20210206084535p:plain
ssh通信

参照: https://www.kagoya.jp/howto/rentalserver/ssh/

個人情報っぽいものは一応隠している

ローカル

鍵を生成

wadakazuma@kw .ssh % ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/wadakazuma/.ssh/id_rsa): keyの名前登録
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in hoge.
Your public key has been saved in key_berlin_now.pub.
The key fingerprint is:
**************************wadakazuma@kw.local
The key's randomart image is:
ここに線で書かれたboxが表示される
wadakazuma@kw .ssh % ls
自分のキーとpubのキーが生成さてた

それ(鍵)をどの通信の認証で使うかの設定

.ssh % vim config
---------------------------------------------
# 以下を追記
Host mumu_key_rsa
  Hostname 前出のElastic IP (#自分の設定に合わせて)
  Port 22
  User kazumawada (#先ほどのユーザー名)
  IdentityFile ~/.ssh/key_berlin_now_rsa (#秘密鍵の設定)
-------------------------------------------------

サーバ(EC2)

https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-10-0-0-197 ~]$ sudo su - kazumawada
最終ログイン: 2021/02/05 (金) 02:03:45 UTC日時 pts/1
[kazumawada@ip-10-0-0-197 ~]$ mkdir .ssh
[kazumawada@ip-10-0-0-197 ~]$ chmod 700 .ssh
[kazumawada@ip-10-0-0-197 ~]$ cd .ssh
[kazumawada@ip-10-0-0-197 .ssh]$ vim authorized_keys
vimないに、rsaのpubで出力されたコードを入力。
(ローカルがrsa。サーバーがそのpubのコード)
[kazumawada@ip-10-0-0-197 .ssh]$ vim authorized_keys
[kazumawada@ip-10-0-0-197 .ssh]$ chmod 600 authorized_keys
[kazumawada@ip-10-0-0-197 .ssh]$ exit

700読み込み書き込み実行ができる

https://chmodcommand.com/chmod-700/

600読み込み書き込みができる

https://chmodcommand.com/chmod-600/


これで通信できると思ったら、

エラーでた

permission deny

no such identity: /Users/wadakazuma/ssh/key_berlin_now_rsa:
 No such file or directory
kazumawada@elasticIpがここに: 
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

ローカルからキーを入力したら、ElasticIPが表示されたから、繋がってはいると思う。

EC2へのSSH接続でPermission denied (publickey). が出たとき - Qiita

SSH を使用した Linux インスタンスへの接続

解決 typoだった。

.ssh内のconfigファイル(鍵をどの通信で使用するかの設定)をvimでもう一度見返したら、.sshのはずがsshになっていた。それを直したら、通った。

.sshが、sshと書いていたから、通らなかった。これは.sshと書き直した。

Host key_rsa
  Hostname 前出のElastic IP (#自分の設定に合わせて)
  Port 22
  User ユーザー名
  IdentityFile ~/.ssh/key_rsa (#秘密鍵の設定)

インスタンスへログインできた。

次は、

EC2インスタンスの環境構築

(Rubyとかを動くようにするため。)

エラー。

sudoで環境をインストールしようと思ったら、passwordを聞かれたけど、思いつく限りのものを打ってみたがうまくいかない。

AWSの初期設定でrootパスワードを設定する - Qiita

そもそもパスワードが初期では設定されていないからする必要があるみたい。

一旦ec2userでログインする。そこで以下のように、passwed設定

#一旦ec2userでログイン
wadakazuma@kw .ssh % ssh -i key_berlin_now.pem ec2-user@hogehoge
Last login: Fri Feb  5 02:52:56 2021 from hoge

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
#パスワードみ設定のユーザーに行く
[ec2-user@ip- ~]$ sudo su - kazumawada
[root@ip-10-0-0-197 ~]# passwd
Changing password for user root.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@ip-10-0-0-197 ~]#

exitしてec2インスタンスにもう一回password入力してみる。

[ec2-user@ip-10-0-0-197 ~]$ sudo su - kazumawada
最終ログイン: 2021/02/05 (金) 07:18:12 UTC h175-hogeから開始日時 pts/1
[kazumawada@ip-10-0-0-197 ~]$ passwd
Changing password for user kazumawada.
Changing password for kazumawada.
(current) UNIX password: 
passwd: Authentication token manipulation error
[kazumawada@ip-10-0-0-197 ~]$

確かにパスワードはwmkm0511

sudo adduser kazumawada
[ec2-user@ip-10-0-0-197 ~]$ sudo passwd wmkm0511
passwd: 不明なユーザー名 'wmkm0511'。
[ec2-user@ip-10-0-0-197 ~]$ sudo visudo
wadakazuma@kw .ssh % sudo su - kazumawada
wadakazuma is not in the sudoers file.  This incident will be reported.
wadakazuma@kw .ssh % sudo adduser kazuma 
wadakazuma is not in the sudoers file.  This incident will be reported.
wadakazuma@kw .ssh % ssh -i key_berlin_now.pem ec2-user@hoge
Last login: Fri Feb  5 01:26:32 2021 from h175-177-04

AWS EC2(Linux)パスワード認証設定方法 - Qiita

EC2インスンス(Linux)作成した際、デフォルトは鍵認証しか許可されていないため、 パスワード認証を許可したい場合は、sshd_configの設定が必要です。

やったこと

#まずルートで入る
sudo su -
#このファイルは、ルート以外では入れなかったから。
vi /etc/ssh/sshd_config
PasswordAuthentication yesを追加した。
[sudo] kazumawada のパスワード:
残念、また試してください。

まだパスワードが違うって言われた。

現状整理

なぜかkazumawadaUserでsudoコマンドを実行できない。

パスワードが違うと言われるから。

・ec2user kazumawadaのパスワードの確認方法

・ec2インスタンスでのsudo実行方法を調べる必要がある。

sudoで入って、

visudo

をやってみる。

すでにkazumawadaがallになっていた。

これでログインして実行っしてみる

ssh -i key_berlin_now_rsa kazumawada@hoge

結果同じ。

これを試す。

CentOSでuserをsudo可能にする - Qiita

Amazon EC2にSudoユーザーを追加する。 - Qiita

解決

↓どうやったか。

passwordを要求されないようにしてみる。

visudo
kazumawada ALL=(ALL)       NOPASSWD:ALL

EC2にRubyなどをもろもろをインストールしていく

参考:

(デプロイ編①)世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで - Qiita

f:id:kaz08:20210206085453j:plain