AWSで新規プロジェクトを立ち上げようとしたらよくわからない不具合で止まったのでその全貌のメモ。
11月10日
追記:ついに解決しました。が、原因等は不明なのでこれからも原因究明に尽力します。
1 AWSでアカウントを作る。
リージョンは東京。
別の地域、特に現在地から遠いところだと最大0.1秒程度のラグが出るらしい。
2 EC2インスタンス立ち上げ。
- EC2を起動
- キーペア作成
- インスタンスIDをコピーしてメモしとく
- Elastic IPとインスタンスIDを関連付ける
- セキュリティグループを開いてポートの開放
- インバウンドタブを開いて編集
- ルールの追加
- HTTPを選択して保存
$ cd
$ mv Downloads/XXX.pem .ssh/
$ cd .ssh/
$ chmod 600 XXX.pem
$ ssh -i XXX.pem ec2-user@Elastic IP
これでSSH接続完了。
[ヒント]
-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
上記のようなエラーが出た場合は、
- ターミナルをいったん閉じる。
- Terminal -> Preferences -> Profiles -> Advanced
- 最下部の Set locale environment variables on startup のチェックを外す。
- もう一度SSH接続し直す。
これで改善される。
3 環境づくり
まずパッケージのアップデートを行う。
$ sudo yum update
次に一度に必要なものをインストール。
$ 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 \
$ sudo yum install -y openssl-devel
Node.jsをインストール
$ sudo curl -sL https://rpm.nodesource.com/setup_6.x | sudo bash -
$ sudo yum install nodejs
rbenvとruby-buildをインストール
$ 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を入れる。
$ 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鍵ペアを作る
$ ssh-keygen -t rsa -b 4096
$ cat ~/.ssh/id_rsa.pub
$ # これで出てきた文字列をコピーする。
- GitHubのhttps://github.com/settings/keysに行く。
- New SSH key を押してタイトルを入れ、keyのところに先ほどコピーした文字列を入力する。
$ ssh -T git@github.com
##unicorn導入
group :production do
gem 'unicorn', '5.4.1'
end
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
と入力する。
$ sudo mkdir /var/www/
$ sudo chown ec2-user /var/www/
$ cd /var/www/
$ git clone リポジトリURL
$ # このリポジトリURLは各リポジトリを選択した際に右のほうに出る clone or download という緑色のボタンのところに出る。
gemのインストール
$ cd /var/www/リポジトリ名
$ # 以降はこのディレクションで作業する
$ ruby -v
ローカルでの開発環境で bundler のバージョンを確認。
$ bundler -v
$ gem install bundler -v X.X.X
$ # 先ほど確認したバージョンのものを入れる。
$ bundler install
$ # この作業もかなり時間がかかる場合がある。
環境変数の設定
$ rake secret
$ # これで表示された文字列をコピーしておく。
$ sudo vim /etc/environment
$ # 入力後に i を押してインサートモードにし、
DATABASE_PASSWORD='MySQLのパスワード'
SECRET_KEY_BASE='さっきの文字列'
入力後は esc を押した後に :wq で保存して終了。
[ヒント]
:q!で保存せずに終了。
出られなくなったりめちゃくちゃになった時はこれ!
その後 exit でいったんログアウトする。
$ env | grep SECRET_KEY_BASE
$ env | grep DATABASE_PASSWORD
これで現在の環境変数を確認できる。
セキュリティグループを選択してインバウンドタブの編集から、
カスタムTCP、3000番ポートを開放する設定を追加。
4 データベースを作る
production:
<<: *default
database: XXX
username: root
password: <%= ENV['DATABASE_PASSWORD'] %>
socket: /var/lib/mysql/mysql.sock
変更を加えた時は必ず
$ git pull origin master
をする。
そして現在(2019/10/23)の問題点……
$ 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)
以前まではこれで普通にデータベースを作れていたのだが、
何故か今回このような表示が出てデータベースが作れなくなってしまった。
エラー画面を元に様々な解決法を検索して試してみたが、
(2)が別の数字に変わるだけで依然進展せず、
インスタンスをかれこれ3回も初めからやり直すことに……
解決法が分かり次第更新するが、もしこれを見て解決法が分かりそうな方は是非お力を貸していただきたいです!
(2019/11/10)問題解決!
ついに問題が解決するも原因不明。
一応解決方法を記載するが対策に関しては随時調査続行。
とりあえずの解決方法は、
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'] %> で問題がなかったのに今回はできなかったのか……もしわかる方がいらっしゃったら是非お力添えいただきたいです。
とりあえずここにくるまでの道のりで学んだことも記載します。
$ 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 を入れると詳しい情報も出る。
続き
$ rails db:create
$ rails db:migrate
$ unicorn_rails -p 3000
$ # http://Elastic IP:3000/ に接続が確認できたら一度落とす。
$ rails assets:precompile
ところが
何とここでどうあがいても This site can’t be reached になってしまうという問題発生。ログを見てもどうしてダメなのか不明。
またしても暗礁に乗り上げてしまう……
2019年11月12日解決!
$ unicorn_rails -p 3000
何故かは不明ですがポートを指定すると接続できました。