【AWS】EC2+RDSでRailsアプリを動かすメモ

あくまで学習の一環としてのメモ。

VPCの作成

まずはVPCの作成。

CIDRブロックは10.0.0.0/16で。

EC2用のサブネットを作成

EC2用なので、外部と通信できるサブネットを作る。

CIDRブロックは10.0.0.0/24

インターネットゲートウェイを作成

EC2用のサブネットがインターネットと通信できるようにゲートウェイを作成する。

作成後、「VPCにアタッチ」からVPCを選択。

ルートテーブルを作成

EC2用のサブネットを、先程作成したゲートウェイを通るというルールを作る。

作成後、下のタブからルート>ルート追加から、

送信先を0.0.0.0/0、ターゲットを先程のゲートウェイにして保存。

これでルートテーブルを作ったので、これをEC2用サブネットに適応する。

サブネットのダッシュボード下のルートテーブルから関連付け編集。

そこからルートテーブルを選択し保存する。

これでEC2用サブネットにインターネットと通信するルートテーブルを適応することができた。

セキュリティグループの作成

セキュリティグループはホワイトリスト形式で、許可する通信を設定できるもの。

なのでデフォルトでは基本全部拒否するようになっている。

ネームタグ、グループ名は同じ好きな名前で。

インバウンドとアウトバウンドというルールを追加できて、その名の通り、

インバウンド:こっちに来るどんな通信を許可するか

アウトバウンド:こっちから送るどんな通信が許可されるのか

となっている。

今回はインバウンドにSSH通信とHTTP通信を許可したい。

SSHはタイプにSSHとし、送信元を自分のグローバルIP/34に設定する。

HTTPはタイプをHTTPとし、送信元を0.0.0.0/0とする。

これでSSHは自分のPCからEC2を操作するとき用に通信ができて、

HTTPは誰でも自分が作ったサーバーにHTTP通信できるようになった。

これを後にEC2を作成したとき、それに適応させる。

RDSの前準備

RDS用のサブネットを作る。

DBは外部と通信させたくないので、それ専用のサブネットを作り、EC2とだけ通信することで安全なDBを作ることができる。

EC2用のサブネットと、RDS用のサブネットはAZを別にし、それをサブネットグループでまとめる。

(AZを別にしなければサブネットグループを作れない。)

DBのパラメーターグループを設定する。

これはDBのパラメーターの設定をテンプレートとして登録するもの。

RDSのパラメーターグループから新規作成、どのデータベース向けなのかを選択し、あとは名前を説明を入力する。

作成したら、名前をクリックするとパラメーターを設定できる。

項目
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_server utf8
character_set_system utf8

とすると文字コードの設定が完了する。

RDS用のセキュリティグループを作る。

インバウンドに下記を追加。これでVPC内からだけDBにアクセス可能にした。

Type Protocol Port Range Source
Mysql TCP 3306 10.0.0.0/16

RDSの作成

RDSを作成する。

無料枠として使うを選択したら基本そこまで変えるところはない。

インスタンスサイズはdb.t2.micro

ストレージの自動スケーリングは無効。マルチAZも無効。

EC2の作成

自動割当パブリックIPは有効

タグにはNameに適当な名前を付けておく。

セキュリティグループには予め設定しておいた、HTTPとSSHを許可したものを適応する。

鍵は後で接続に使うのでわかりやすい場所に保存しておく。

ElasticIPの設定

EC2ダッシュボードからElasticIPへ。

選択し、割り当てる。

作成したものをアクションから関連付けへ、対象のEC2インスタンスを選択肢、関連付けを押す。

各種インストール

SSHでEC2に接続。ec2-userという名前で接続。

$ sudo su - #rootユーザーになる
$ yum -y install git
$ git --version

$git clone https://github.com/rbenv/rbenv.git /usr/local/rbenv
vi /etc/profile.d/rbenv.sh
export RBENV_ROOT=/usr/local/rbenv
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"

$ source /etc/profile.d/rbenv.sh
$ rbenv --version

$ git clone https://github.com/rbenv/ruby-build.git /usr/local/rbenv/plugins/ruby-build

$ rbenv install -list

$ yum -y groupinstall "Development Tools"
$ yum -y install gcc-c++ glibc-headers openssl-devel readline libyaml-devel zlib zlib-devel libffi-devel libxml2 libxslt libxml2-devel libxslt-devel mysql-devel readline-devel
$ yum -y install ImageMagick ImageMagick-devel

$ rbenv install バージョン
$ rbenv versions
$ rbenv global バージョン
$ rbenv exec gem install bundler
$ rbenv rehash

gitを入れて、Rubyを入れ、bundlerまでの導入メモ。

その後、対象のアプリをgit cloneするまでは別の記事でまとめた。

https://tkmrtech.hateblo.jp/entry/2019/10/27/000000

Unicorn

アプリケーションサーバーのUnicornのインストール。

group :production, :staging do
    gem 'unicorn', "5.4.1"
end
$ vi config/unicorn.conf.rb

gemに追加し、bundle。

設定ファイルを新規作成し、

  # set lets
  $worker  = 2
  $timeout = 30
  $app_dir = "/var/www/rails/アプリケーション名"
  $listen  = File.expand_path 'tmp/sockets/.unicorn.sock', $app_dir
  $pid     = File.expand_path 'tmp/pids/unicorn.pid', $app_dir
  $std_log = File.expand_path 'log/unicorn.log', $app_dir
  # set config
  worker_processes  $worker
  working_directory $app_dir
  stderr_path $std_log
  stdout_path $std_log
  timeout $timeout
  listen  $listen
  pid $pid
  # loading booster
  preload_app true
  # before starting processes
  before_fork do |server, worker|
    defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!
    old_pid = "#{server.config[:pid]}.oldbin"
    if old_pid != server.pid
      begin
        Process.kill "QUIT", File.read(old_pid).to_i
      rescue Errno::ENOENT, Errno::ESRCH
      end
    end
  end
  # after finishing processes
  after_fork do |server, worker|
    defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
  end

上記のように設定する。

Nginx

$ amazon-linux-extras install nginx1.12
$ nginx -v
$ service nginx start
$ sudo chkconfig nginx on #nginxの自動起動

今回やった手順で、普通にNginxを入れようとするとエラーが出たので、上のようにして導入する

$ cd /etc/nginx/conf.d/
$ sudo vi アプリケーション名.conf

Ningxの設定をする。

# log directory
error_log  /var/www/rails/アプリケーション名/log/nginx.error.log;
access_log /var/www/rails/アプリケーション名/log/nginx.access.log;
# max body size
client_max_body_size 2G;
upstream app_server {
  # for UNIX domain socket setups
  server unix:/var/www/rails/アプリケーション名/tmp/sockets/.unicorn.sock fail_timeout=0;
}
server {
  listen 80;
  server_name アプリケーションのElasticIP;
  # nginx so increasing this is generally safe...
  keepalive_timeout 5;
  # path for static files
  root /var/www/rails/アプリケーション名/public;
  # page cache loading
  try_files $uri/index.html $uri.html $uri @app;
  location @app {
    # HTTP headers
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://app_server;
  }
  # Rails error pages
  error_page 500 502 503 504 /500.html;
  location = /500.html {
    root /var/www/rails/アプリケーション名/public;
  }
}
$ cd /var/lib
$ sudo chmod -R 775 nginx

その後、上のコマンドを実行し、設定完了。

Mysql

$ yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm -y
$ yum-config-manager --disable mysql80-community
$ yum-config-manager --enable mysql57-community
$ yum install mysql-community-client.x86_64 

これでMysqlのインストールも完了。

EC2からRDSへ接続

RDSのダッシュボードから対象のDBのエンドポイントを確認し、

$ mysql -u ユーザー名 -p -h エンドポイント

パスワード入力を促されるので、RDS作成時に設定したものを入力。

ここで接続が成功するかどうかを確かめておく。

config/database.ymlを編集する。

とりあえず、defaultだけ設定しておいて、developmentやtestはdefaultを引き継がせ、database名だけ独自もものを設定しておく。

default: &default
  adapter: mysql2
  encoding: utf8
  reconnect: false
  pool: 5
  username: root #RDS作成時に設定したもの
  password: <%= ENV["DATABASE_PASSWORD"] %> #RDS作成時に設定したもの
  socket: /var/lib/mysql/mysql.sock
  database: データベース名 #RDS作成時に設定したもの
  host: エンドポイント
  #RDSのダッシュボードから確認できるエンドポイント

development:
  <<: *default
  database: データベース名
test:
  <<: *default
  database: テスト用のデータベース名

DBのパスワードは直接書いてはいけないので、環境変数などで設定しておく。

Nginxのコマンド

nginx #起動
nginx -s stop #停止
nginx -s reload #再起動

something went wrongが表示されたら

大体Unicornが起動していないせい。

unicorn -c /var/www/rails/アプリ名/config/unicorn.conf.rb -D

で起動。

また、unicornのバージョンは5.4.1以下じゃないと設定ファイルがエラーを起こすので(Gemfileに指定したから大丈夫だと思うけど一応)確認しておく。