「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]
「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通信による、インスタンスへのログイン
サーバーとクライアントの暗号化された通信
参照: 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
解決 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
結果同じ。
これを試す。
Amazon EC2にSudoユーザーを追加する。 - Qiita
解決
↓どうやったか。
passwordを要求されないようにしてみる。
visudo
kazumawada ALL=(ALL) NOPASSWD:ALL
EC2にRubyなどをもろもろをインストールしていく
参考:
(デプロイ編①)世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで - Qiita