AWSを使ってホームページを公開するまで。

　AWSで新規プロジェクトを立ち上げようとしたらよくわからない不具合で止まったのでその全貌のメモ。

１１月１０日
追記：ついに解決しました。が、原因等は不明なのでこれからも原因究明に尽力します。

# １　AWSでアカウントを作る。
　リージョンは東京。
　別の地域、特に現在地から遠いところだと最大０.１秒程度のラグが出るらしい。
# ２　EC2インスタンス立ち上げ。
- EC2を起動
- キーペア作成
- インスタンスIDをコピーしてメモしとく
- Elastic IPとインスタンスIDを関連付ける
- セキュリティグループを開いてポートの開放
 - インバウンドタブを開いて編集
 - ルールの追加
 - HTTPを選択して保存

```terminal:terminal
$ cd
$ mv Downloads/XXX.pem  .ssh/
$ cd .ssh/
$ chmod 600 XXX.pem
$ ssh -i XXX.pem ec2-user@Elastic IP
```
　これでSSH接続完了。

　　**[ヒント]**

```terminal:terminal
-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
```
　上記のようなエラーが出た場合は、

1. ターミナルをいったん閉じる。
2. Terminal -> Preferences -> Profiles -> Advanced
3. 最下部の Set locale environment variables on startup のチェックを外す。
4. もう一度SSH接続し直す。

　これで改善される。

# ３　環境づくり
　まずパッケージのアップデートを行う。

```terminal:terminal
$ sudo yum update
```

　次に一度に必要なものをインストール。

```terminal:terminal
$ sudo yum install \
git make gcc-c++ patch \
libyaml-devel libffi-devel libicu-devel \
zlib-devel readline-devel libxml2-devel libxslt-devel \
ImageMagick ImageMagick-devel \
```

```terminal:terminal
$ sudo yum install -y openssl-devel
```

## Node.jsをインストール

```terminal:terminal
$ sudo curl -sL https://rpm.nodesource.com/setup_6.x | sudo bash -
$ sudo yum install nodejs
```
## rbenvとruby-buildをインストール

```terminal:terminal
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source .bash_profile
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ rbenv rehash
$ rbenv install X.X.X
$ # これはかなり長くかかる場合もあるので痺れを切らせて閉じたり変な入力をしないように！
$ rbenv global X.X.X
$ rbenv rehash
$ ruby -v
$ # 入れたバージョンと同じなら問題なし。
```

## MySQLのインストール
　今回は5.6を入れる。

```terminal:terminal
$ sudo yum install mysql56-server mysql56-devel mysql56
$ sudo service mysqld start
$ sudo service mysqld status
$ # ここで running と出れば大丈夫。
$ sudo /usr/libexec/mysql56/mysqladmin -u root password 'XXXpasswordxxx'
$ mysql -u root -p
$ # パスワードを入れて問題なければ quit で終了。
```

## SSH鍵ペアを作る

```terminal:terminal
$ ssh-keygen -t rsa -b 4096
$ cat ~/.ssh/id_rsa.pub
$ # これで出てきた文字列をコピーする。
```

- GitHubの[https://github.com/settings/keys](https://github.com/settings/keys)に行く。
- New SSH key を押してタイトルを入れ、keyのところに先ほどコピーした文字列を入力する。

```terminal:terminal
$ ssh -T git@github.com
```

##unicorn導入

```ruby:gemfile
group :production do
  gem 'unicorn', '5.4.1'
end
```
　config/unicorn.rb を作成。

```ruby:config/unicorn.rb
app_path = File.expand_path('../../', __FILE__)
worker_processes 1
working_directory app_path
pid "#{app_path}/tmp/pids/unicorn.pid"
listen 3000
stderr_path "#{app_path}/log/unicorn.stderr.log"
stdout_path "#{app_path}/log/unicorn.stdout.log"
timeout 60
preload_app true
GC.respond_to?(:copy_on_write_friendly=) && GC.copy_on_write_friendly = true
check_client_connection false
run_once = true
before_fork do |server, worker|
 defined?(ActiveRecord::Base) &&
   ActiveRecord::Base.connection.disconnect!
 if run_once
   run_once = false # prevent from firing again
 end
 old_pid = "#{server.config[:pid]}.oldbin"
 if File.exist?(old_pid) && server.pid != old_pid
   begin
     sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
     Process.kill(sig, File.read(old_pid).to_i)
   rescue Errno::ENOENT, Errno::ESRCH => e
     logger.error e
   end
 end
end
after_fork do |_server, _worker|
 defined?(ActiveRecord::Base) && ActiveRecord::Base.establish_connection
end
```

　と入力する。

```terminal:terminal
$ sudo mkdir /var/www/
$ sudo chown ec2-user /var/www/
$ cd /var/www/
$ git clone リポジトリURL
$ # このリポジトリURLは各リポジトリを選択した際に右のほうに出る clone or download という緑色のボタンのところに出る。
```

## gemのインストール

```terminal:terminal
$ cd /var/www/リポジトリ名
$ # 以降はこのディレクションで作業する
$ ruby -v
```

　ローカルでの開発環境で bundler のバージョンを確認。

```terminal:local_terminal
$ bundler -v
```
```terminal:terminal
$ gem install bundler -v X.X.X
$ # 先ほど確認したバージョンのものを入れる。
$ bundler install
$ # この作業もかなり時間がかかる場合がある。
```

## 環境変数の設定

```terminal:terminal
$ rake secret
$ # これで表示された文字列をコピーしておく。
$ sudo vim /etc/environment
$ # 入力後に i を押してインサートモードにし、

DATABASE_PASSWORD='MySQLのパスワード'
SECRET_KEY_BASE='さっきの文字列'
```

　入力後は esc を押した後に :wq で保存して終了。

　　**[ヒント]**
　:q!で保存せずに終了。
　出られなくなったりめちゃくちゃになった時はこれ！

　その後 exit でいったんログアウトする。

```terminal:terminal
$ env | grep SECRET_KEY_BASE
$ env | grep DATABASE_PASSWORD
```

　これで現在の環境変数を確認できる。
　セキュリティグループを選択してインバウンドタブの編集から、
　カスタムTCP、３０００番ポートを開放する設定を追加。

# ４　データベースを作る

```yml:config/database.yml
production:
  <<: *default
  database: XXX
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock
```

　変更を加えた時は必ず

```terminal:termianl
$ git pull origin master
```

　をする。

　**そして現在（２０１９／１０／２３）の問題点……**

```terminal:terminal
$ rails db:create
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
Couldn't create 'XXX_development' database. Please check your configuration.
rails aborted!
Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
/var/www/XXX/bin/rails:9:in `<top (required)>'
/var/www/XXX/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'
Tasks: TOP => db:create
(See full trace by running task with --trace)
```

　以前まではこれで普通にデータベースを作れていたのだが、
　何故か今回このような表示が出てデータベースが作れなくなってしまった。
　エラー画面を元に様々な解決法を検索して試してみたが、
　（２）が別の数字に変わるだけで依然進展せず、
　インスタンスをかれこれ３回も初めからやり直すことに……

　解決法が分かり次第更新するが、もしこれを見て解決法が分かりそうな方は是非お力を貸していただきたいです！

　**（２０１９／１１／１０）問題解決！**

　ついに問題が解決するも原因不明。
　一応解決方法を記載するが対策に関しては随時調査続行。

　とりあえずの解決方法は、

```yml:config/database.yml
default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: <%= ENV['DATABASE_PASSWORD'] %>
socket: /var/lib/mysql/mysql.sock

development:
<<: *default
database: XXXXXX_development

test:
<<: *default
database: XXXXXX_test

production:
<<: *default
database: XXXXXX_production
username: root
password: <%= ENV['DATABASE_PASSWORD'] %>
socket: /var/lib/mysql/mysql.sock
```

　このように database.yml を編集すれば rails db:create でデータベースを作れる。
　解決するにあたって teratail を活用させていただきました。回答いただいたお二人には何とお礼を申せばいいやら……

　しかし何故他のプロジェクトでは <%= ENV['DATABASE_PASSWORD'] %> で問題がなかったのに今回はできなかったのか……もしわかる方がいらっしゃったら是非お力添えいただきたいです。

　とりあえずここにくるまでの道のりで学んだことも記載します。

```terminal:terminal
$ whoami
$ # 現在の自分自身が何というユーザーかを表示する。


$ mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.6.45 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT USER(); 
$ # MySQL にログインしているユーザーを表示する。


$ ls /XXX/
$ # ディレクションがどうなっているかリストアップする。ls の横に -l を入れると詳しい情報も出る。 
```


　続き

```terminal:terminal
$ rails db:create
$ rails db:migrate
$ unicorn_rails -p 3000
$ # http://Elastic IP:3000/ に接続が確認できたら一度落とす。
$ rails assets:precompile
```

　ところが
　何とここでどうあがいても This site can’t be reached になってしまうという問題発生。ログを見てもどうしてダメなのか不明。
　またしても暗礁に乗り上げてしまう……

　**２０１９年１１月１２日解決！**

```terminal:terminal
$ unicorn_rails -p 3000
```
　何故かは不明ですがポートを指定すると接続できました。