【AWS】EC2+RDSでRailsアプリを動かすメモ
あくまで学習の一環としてのメモ。
VPCの作成
まずはVPCの作成。
CIDRブロックは10.0.0.0/16で。
EC2用のサブネットを作成
EC2用なので、外部と通信できるサブネットを作る。
CIDRブロックは10.0.0.0/24
インターネットゲートウェイを作成
EC2用のサブネットがインターネットと通信できるようにゲートウェイを作成する。
ルートテーブルを作成
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のインストール。
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
その後、上のコマンドを実行し、設定完了。
$ 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に指定したから大丈夫だと思うけど一応)確認しておく。