2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rails: EC2とRDBでデプロイする際に使用した参考記事

Last updated at Posted at 2021-03-01

はじめに

AWS Cloudtechで一通り基礎を学んだ初心者が、
Rails のアプリをAWSでデプロイしさらに冗長化構成にする際に参考にした記事をまとめました。
AWSの基礎を学んで、WordPressの設定はできるけど、Railsアプリの場合はちょっと良く分からない。
AWSの記事はたくさんあるけど、どの記事が自分の設定にあっているか分からないという方もこの記事を読むと何か掴めるかもしれません。

最終的に以下の図のような設定ができました。

Image from Gyazo
環境は以下の通りです。
Rails 6
MySQL(RDS)

*この記事で冗長化の設定方法は書いてありません。

RailsのアプリをAWSでデプロイする際の参考記事の決め方と参考記事の紹介

データベースについて

  • EC2に直接インストールする方法
  • AWSのRDSを使う方法

データベースの使用方法は二種類あります。冗長化構成にしたいのであれば、AWSのRDSを使用するのが◎です。

違いは、EC2にMysqlサーバーをインストールするか否かです。

初心者向けの丁寧に解説されているほとんどの記事は、EC2にデーターベースサーバーを直接インストールしているということに注意しながら参考記事を探します。

冗長化構成にするための基盤の設定は、AWSのRDSを使用したシングル構成の環境構築です。
「マルチAZ」「シングル構成」「RDS」などをキーワドにして記事を探します。

これという記事はありませんが、AWS Cloudtechで学習することで簡単に作れるようになります。
下記の図のような構成で環境構築することが最初の目標になります。

ここでの注意点は、セキュリティグループのインバウンドルールを正しく設定することです。
EC2にhttp接続、ssh接続ができるように設定し、RDSはEC2から接続できるように設定します。

Image from Gyazo

上記の環境を構築できたら、EC2に接続しRailsが動く環境をインストールしていきます。

EC2の設定

EC2にインストールする内容はどの記事もほとんど同じです。
node.jsをインストールする際に出てくるメッセージにyarnもインストールしてくださいとあるのでインストールします。(yarnのことは書いていない記事も多いですが柔軟に)

注意することは、データベースのインストール時にmysql-devel、mysqlはインストールして

[ec2-user@ip-10-0-0-21 sample-app]$ sudo yum -y install mysql-devel
[ec2-user@ip-10-0-0-21 sample-app]$ sudo yum -y install mysql

mysql-serverをインストールしないということです。(RDSを使用するため)

sshでEC2への接続を試す(ターミナル)

[ダウンロードしたkeyがあるディレクトリ]$ chmod 600 key.pem
↑権限の変更をしています

$ ssh -i 〇〇.pem ec2-user@紐付けたElastic IP
↑ssh接続

EC2からRDSの接続を試す

[ec2-user@ip-10-0-0-21 sample-app]$ mysql -h <RDSのエンドポイント> -u rails -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 140
Server version: 8.0.20 Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

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

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sample ←           |
+--------------------+
4 rows in set (0.00 sec)

この記事がわかりやすそうです。

> show databases;

これを打つことでRDSで作成したデーターベースをみることができます。

ローカルのdatabase.ymlのproductionの設定

database.yml

production:
  adapter: mysql2
  encoding: utf8
  database: <%= Rails.application.credentials.db[:database] %>
  username: <%= Rails.application.credentials.db[:username] %>
  password: <%= Rails.application.credentials.db[:password] %>
  host: <%= Rails.application.credentials.db[:host] %>
  port: <%= Rails.application.credentials.db[:port] %>

参考にした記事

環境変数の設定方法

credentials.yml.encとmaster.keyを使う方法を試してみました。
環境変数が設定してあるcredentials.yml.encは暗号化されてGithubに、master.keyは.gitignoreに載っているため公開されないという仕組みです。EC2にgitcloneしたアプリにも同じmaster.keyを書いてあげることでcredentials.yml.encの暗号化が解け、環境変数がEC2上でも使えるようになるという仕組みです。

以下の記事を参考にしました。わかりやすいです。ありがとうございます。

こんな感じで設定しました。(ローカルで設定)

credentials.yml.enc
# aws:
#   access_key_id: 123
#   secret_access_key: 345

db:
  database: sample_app
  host:     database-1.csssssssd.ap-northeast-1.rds.amazonaws.com
  username: sample
  password: sample3456
  port:     3306

# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: asdfgfhaasdffg7as7gd78a9ha9ahdhnsg894ti9849
~                                  

ユニコーン、EC2のサーバにアプリのコードをクローン、Nginx、Capistrano

環境設定が終わったところでユニコーンの設定、Githubからアプリのコードをクローンしていきます。
クローンができたら、Nginx、Capistranoを設定します。

ユニコーンの設定からはこの記事が参考になりました。ありがとうございます。

gitcloneしたアプリでrubyがないと言わました。
$ rbenv global x.x.x
で効かなかったようです。下記を入力。

$ rbenv local x.x.x

環境変数の設定は、
設定したcredentials.yml.encに対応するローカルのmaster.keyを手動でEC2内のアプリにコピーするという方法で行います。
この記事が参考になりました。ありがとうございます。

master.keyのファイルの場所の関係でエラーが何度か出ましたが、環境変数が使えるようになればデーターベースには繋がりますし、エラーが出たらエラー文が教えてくれるので次に進めます。

複数のEC2に自動デプロイする方法(Capistrano設定後)

ローカルのproduction.rbにserverを付け加える

config>deploy>production.rb
server '54.65.157.240', user: 'ec2-user', roles: %w{app db web}
server '35.72.140.240', user: 'ec2-user', roles: %w{app db web}

AutoScallingで追加されたEC2に自動でデプロイする方法

この記事が参考になりそうです。まだ試していないのでわかりません。

最後に

エラーがたくさん出るとは思いますが、一つの記事をベースに、その他エラーが出る度に色々な記事を参考にしながら理解を深めていけば解決方法は見つかります。

AWS Cloudtech、お勧めです。
herokuにデプロイできず2日間エラーに向き合って、基礎が全くわかっていないと気付きAWSを勉強し始めて約20日間。
全くインフラの知識がなかった自分でも、色々な記事を参考にエラーを解決していくことができるようになりました。

ありがとうございます☺️

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?