EC2(AmazonLinux2)環境でのRails6.0/MySQL構築手順


# はじめに
本記事ではAWSのEC2,VPC,RDSを用いた基本的な構成でRailsアプリケーションを動作するまでの手順を記述しています。
現時点では最終的に `http://パブリックIP:3000`でアクセスできるまでの手順となっています。
本番を想定した設定に関しては随時記載していきます。

# VPC作成
1 VPCダッシュボードを開き、「VPCを作成」を押します。
![スクリーンショット 2021-12-20 23.01.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/d621074d-a481-cbe9-6faf-ca547966eb36.png)

「VPC作成」画面から名前タグ、IPV4CIDRブロックを入力し、「VPCを作成」を押してください。
- 名前タグ: rails-vpc
- IPv4 CIDR: 10.0.0.0/16

![スクリーンショット 2021-12-20 23.05.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/0c361b0d-2c6b-9e85-6783-d1f61bb7bf15.png)


  VPCを作成する際、プライベートIPv4アドレスの範囲は下記範囲内で作成します。

| クラス | 範囲 |
|:--|:--|
| クラスA | 10.0.0.0 ~ 10.255.255.255 (10.0.0.0/16) |
| クラスB | 172.16.0.0 ~ 172.31.255.255 (172.16.0.0/16) |
| クラスC | 192.168.0.0 ~ 192.168.255.255 (192.168.0.0/16) |

[IPv4 用の VPC とサブネットのサイズ設定](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Subnets.html#:~:text=%E3%81%AE%E3%82%B5%E3%82%A4%E3%82%BA%E8%A8%AD%E5%AE%9A-,IPv4%20%E7%94%A8%E3%81%AE%20VPC%20%E3%81%A8%E3%82%B5%E3%83%96%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E3%82%B5%E3%82%A4%E3%82%BA%E8%A8%AD%E5%AE%9A,-VPC%20%E3%82%92%E4%BD%9C%E6%88%90)

# サブネットの作成
## パブリックサブネットの作成
VPCダッシュボードを開き、「サブネット」画面から「サブネットを作成」を押します。
![スクリーンショット 2021-12-21 19.23.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/907824a0-d0ee-8224-4cfd-658548ca56ff.png)

「サブネットを作成」画面から必須入力項目を設定し、「サブネットを作成」を押します。
- VPC ID: 先ほど作成したVPC
- サブネット名: rails-public-subnet01
- アベイラビリティーゾーン: ap-northeast-1a
- IPv4 CIDR ブロック: 10.0.10.0/24


![スクリーンショット 2021-12-21 19.27.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/1ff5882f-6015-4daa-0871-f2f4ee909a3e.png)
![スクリーンショット 2021-12-21 19.32.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/4181c538-5f3e-164e-f28d-abb4fb91c122.png)

## プライベートサブネットの作成

VPCダッシュボードを開き、「サブネット」画面から「サブネットを作成」を押します。
![スクリーンショット 2021-12-21 19.23.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/907824a0-d0ee-8224-4cfd-658548ca56ff.png)
「サブネットを作成」画面から必須入力項目を設定し、「サブネットを作成」を押します。
- VPC ID: 先ほど作成したVPC
- サブネット名: rails-private-subnet01
- アベイラビリティーゾーン: ap-northeast-1a
- IPv4 CIDR ブロック: 10.0.20.0/24


![スクリーンショット 2021-12-21 19.27.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/1ff5882f-6015-4daa-0871-f2f4ee909a3e.png)
![スクリーンショット 2021-12-21 21.49.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/07dc0fd5-73e8-9020-1bea-d0e7b9b6860c.png)

# インターネットゲートウェイにアクセスできるよう設定する
## インターネットゲートウェイの作成
1 「インターネットゲートウェイ」から「インターネットゲートウェイの作成」を押します。
![スクリーンショット 2021-12-21 22.46.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/7f0295f4-8070-b4ef-4ac2-464b51638487.png)

2 「インターネットゲートウェイの作成」画面にて名前タグを設定し、「インターネットゲートウェイの作成」を押します。
![スクリーンショット 2021-12-21 22.48.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/f0533b58-31c3-f3f7-d5fb-3c2c21f627d6.png)

3 作成されたインターネットゲートウェイを選択し、「VPCにアタッチ」を選択します。
![スクリーンショット 2021-12-21 22.53.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/986aef06-3537-3103-5157-253ed3283829.png)
「VPCにアタッチ」画面にて作成したVPCを選択し、「インターネットゲートウェイにアタッチ」を押します。
![スクリーンショット 2021-12-21 22.52.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/fd7c6ac1-f86e-91bf-3dec-9d7cc42b52cc.png)

## パブリックサブネット用のルートテーブルの設定
1 作成したパブリックサブネットに紐づいているルートテーブルを押します。
![スクリーンショット 2021-12-21 22.59.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/dabcd9af-8da7-cacb-4754-2de831ce1d34.png)

2 「ルートテーブル」画面に遷移するので「ルート編集」を押します。
![スクリーンショット 2021-12-21 23.01.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/6cfe4047-67b5-2873-9740-bfb9d3e787b8.png)

3 「ルート編集」画面にて作成した「インターネットゲートウェイ」を設定します。
- 送信先: 0.0.00/0
- ターゲット: 作成したインターネットゲートウェイ

![スクリーンショット 2021-12-21 23.06.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/b75d56fb-b982-29f0-855e-cac5d644681a.png)

## プライベートサブネット用のルートテーブルの設定
1 「ルートテーブル」から「ルートテーブルを作成」を押します。
![スクリーンショット 2021-12-21 23.08.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/b6de910c-d8fd-44fa-e244-2c734cc994f6.png)

2 「ルートテーブルを作成」画面にて対象項目を設定し、「ルートテーブルを作成」を押します。
- 名前: rails-private-subnet01
- VPC: 作成したVPC

![スクリーンショット 2021-12-21 23.10.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/bc8069dc-c9ac-73af-4f98-df29b37be274.png)

3 「サブネット」から作成したプライベートサブネット選択し、ルートテーブルの関連付けを編集します。
![スクリーンショット 2021-12-21 23.49.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/22c4a5b6-23d2-db6e-c8c0-dddfc04c7667.png)

4 「ルートテーブルの関連付けを編集」画面から作成したプライベートサブネット用のルートテーブルを選択し、「保存」を押します。
![スクリーンショット 2021-12-21 23.51.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/d41fc275-282e-930b-9d5e-cd1e8f42d821.png)


# EC2作成

1 EC2ダッシュボードから「インスタンスを起動」を押します。

![スクリーンショット 2021-12-21 22.08.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/1fd37951-94c4-b0ce-90b6-2e52372d51ba.png)

2 「AMIの選択」画面にて 「Amazon Linux2」を選択し、「選択」を押します。
![スクリーンショット 2021-12-21 22.10.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/a00dced8-746f-f27f-6e79-a94f0f95d8fe.png)

3 「インスタンスの設定」画面にて、ネットワーク、サブネットに作成したVPC,パブリックサブネットを設定します。
![スクリーンショット 2021-12-21 22.14.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/2f72f53d-e4a4-0998-8797-856d0aa6aa8d.png)

4 「ストレージの追加」画面では特に変更は不要のため「次のステップ:タグの追加」を押します。
![スクリーンショット 2021-12-21 22.23.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/a899d715-2fdc-5d11-8836-791069a70e48.png)

5 「タグの追加」画面では、Nameタグを追加し、「次のステップ:タグの追加」を押します。![スクリーンショット 2021-12-21 22.26.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/814a3903-136c-a2c3-1d2f-ffdd317d951c.png)

6 「セキュリティグループの設定」画面にて、　SSH,HTTPのプロトコルの通信できるよう新しくセキュリティグループを作成設定します。
![スクリーンショット 2021-12-21 22.29.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/0eceee95-5e36-b448-33e5-bfaeb025e81e.png)

7 「インスタンス作成の確認」画面にて設定内容を確認し、「起動」を押してください。
![スクリーンショット 2021-12-21 22.34.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/6233aece-6174-7993-a242-d6ac151e7457.png)

その後、「既存のキーペアを選択するか、新しいキーペアを作成します。」の画面が表示されるので、すでに作成されている場合は作成したキーペアを設定して　「インスタンスの作成」を押してください。
![スクリーンショット 2021-12-21 22.36.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/7717cc9e-f338-4771-8ded-c8a89c8531ed.png)

「インスタンス」画面にて、「インスタンスの状態」が「実行中」であり、「ステータスチェック」が「2/2のチェックに合格しました」と表示されましたら作成完了です。

# EIPの作成
1 「Elastic IPアドレス」から「Elastic IPアドレスを割り当てる」を押します。
![スクリーンショット 2021-12-21 23.56.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/796656aa-b3f8-d7c9-4505-173717ae686c.png)

2 「Elastic IPアドレスを割り当てる」画面から「割り当て」を押します。
- タグ: rails-webserver-eip
![スクリーンショット 2021-12-22 0.02.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/8421c5a6-fc3b-a155-6e98-ee3b0d4e9e10.png)


3 作成されたEIPを選択し「Elastic IPアドレスの関連付け」を選択します。
![スクリーンショット 2021-12-22 0.05.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/515239e4-e110-3176-3d20-8ae299edff15.png)

4 「Elastic IPアドレス関連付け」画面から対象のEC2インスタンスを選択し、「関連付ける」を押します。
![スクリーンショット 2021-12-22 0.05.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/6d71e339-428f-7c7f-4eba-9a8c6a9d162d.png)

5 パブリックIPv4アドレスにてSSH接続ができるか確認します。

```bash
ssh -i 'SSHキー' ec2-user@IPアドレス
```
# RDSの作成
すでに作成したサブネットを参考に別のリージョンにサブネットを作成します。

## パブリックサブネットの作成
VPC: 作成したVPC
サブネット名: rails-public-subnet02
アベイラビリティーゾーン: ap-northeast-1c
IPv4 CIDR: 10.0.30.0/24

![スクリーンショット 2021-12-22 0.16.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/1929412e-77d1-4aef-f14a-df156bac35e8.png)

## プライベートサブネットの作成
VPC: 作成したVPC
サブネット名: rails-private-subnet02
アベイラビリティーゾーン: ap-northeast-1c
IPv4 CIDR: 10.0.40.0/24

![スクリーンショット 2021-12-22 0.21.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/6cd90a1c-1d77-fa12-8368-7d6822ceb144.png)

## サブネットグループの作成
1 RDSから「サブネットグループ」を押し、「DBサブネットグループを作成」を押します。
![スクリーンショット 2021-12-22 0.24.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/642673d7-c1dd-b45a-614e-eadd4ddeac3b.png)

2 　「DBサブネットグループ」から対象の入力項目を設定します。
- 名前: RailsSubnetGroup
- 説明: RailsSubnetGroup
- VPC: 作成したVPC
- アベイラビリティゾーン: ap-northeast-1a, ap-northeast-1c
- サブネット: 各AZのパブリックサブネット

![スクリーンショット 2021-12-22 0.27.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/9640f7fd-7563-100a-c5f6-d8a8c2c74f78.png)
![スクリーンショット 2021-12-22 0.27.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/c7d0baee-f287-f122-4af8-af92917982db.png)

## DBの作成
1 データベースから「データベースの作成」を押します。
![スクリーンショット 2021-12-22 0.33.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/8851019c-8cf4-e884-dedb-f00b9e5d2330.png)
 
2 DB作成画面から対象項目を設定します。
- エンジンのオプション: MySQL
- ユースケース: 開発/テスト
- DBインスタンスのクラス: db.t2.micro
- DBインスタンス識別子: rails-db
- マスターユーザー名: 任意のユーザー名
- パスワード: 任意のパスワード
- VPC: 作成したVPC
- サブネットグループ: 作成したサブネットグループ
- アベイラビリティーゾーン: ap-northeast-1a
- データベース名: 任意のDB名

## セキュリティーグループの修正
1 作成したDBの「VPCセキュリティグループ」を押します。
![スクリーンショット 2021-12-22 1.04.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/5066ec81-58cb-0b19-b6cb-0234f44e0f94.png)

2 RDSセキュリティグループの修正
- Nameタグ: RailsDB
- インバウンドルール
    - タイプ: MYSQL/Aurora
    - ソース: Webサーバーのセキュリティグループ
![スクリーンショット 2021-12-22 1.09.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/45181180-d5e8-065a-0444-b525c6b584b6.png)

# Railアプリケーションのセットアップ

```bash
# 既存のプログラムアップデート
sudo yum -y update

# 環境構築に必要なパッケージインストール
sudo yum  -y install git make gcc-c++ patch libyaml-devel libffi-devel libicu-devel zlib-devel readline-devel libxml2-devel libxslt-devel ImageMagick ImageMagick-devel openssl-devel libcurl libcurl-devel curl wget

# nodenvのインストール
git clone git://github.com/nodenv/nodenv.git ~/.nodenv
echo 'export PATH="$HOME/.nodenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(nodenv init -)"' >> ~/.bash_profile

# シェルの再起動
exec $SHELL -l

# node-buildのインストール
git clone https://github.com/nodenv/node-build.git ~/.nodenv/plugins/node-build
# nodeのインストール
nodenv install 15.14.0
nodenv rehash
nodenv global 15.14.0
# yarnのインストール
sudo wget https://dl.yarnpkg.com/rpm/yarn.repo -O /etc/yum.repos.d/yarn.repo
sudo yum -y install yarn

# rbenvのインストール
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

# ruby-buildのインストール
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
rbenv rehash

# Rubyのインストール
rbenv install 3.0.1
rbenv global 3.0.1
rbenv rehash

# Rubyのバージョン確認
ruby -v

# MariaDBのアンインストール
yum list installed | grep mariadb
sudo yum remove mariadb-libs.x86_64

# MySQL8.0のリポジトリ追加
sudo yum localinstall -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

# MySQL8.0リポジトリの有効可
sudo yum-config-manager --disable mysql57-community
sudo yum-config-manager --enable mysql80-community

# クライアントツールのインストール
sudo yum install -y mysql-community-client mysql-devel

# MySQLのバージョン確認
mysql --version

# RDSの接続確認
mysql -h rdsのエンドポイント -u root -p
```

## Gitの設定
```bash
# GitHubの設定
ssh-keygen
# 鍵が生成されたか確認
ls -la ~/.ssh
# 公開鍵の表示、値をGitHubにアクセスし登録を行う
cat ~/.ssh/id_rsa.pub

# Railsアプリケーションの取得
git clone 対象リポジトリのgiturl
```

## 環境変数の設定
```.bash
export DATABASE_DEV_USER="ユーザー名"
export DATABASE_DEV_PASSWORD="パスワード"
export DATABASE_DEV_HOST="RDSのエンドポイント"
```

```database.yml
default: &default
  adapter: mysql2
  encoding: unicode
  host: <%= ENV['DATABASE_DEV_HOST'] %>
  username: <%= ENV['DATABASE_DEV_USER'] %>
  password: <%= ENV['DATABASE_DEV_PASSWORD'] %>
```

## 初期セットアップ

```bash
# 環境の設定
bin/rails db:environment:set RAILS_ENV=development

# DB作成
bundle exec rails db:create
bundle exec rails db:migrate
bundle exec rails db:seed
```
## 3000番ポートの解放
Railsサーバーで使用するポート番号を解放します。
EC2Webサーバーのセキュリティグループのインバウンドルールにルールを追加します。
![スクリーンショット 2021-12-22 3.31.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/28bcd1e4-4a68-4c57-f78d-dee8e6e4036c.png)


## 起動
```
bundle exec rails s -b 0.0.0.0
```
下記URLにアクセスにRailsアプリケーションが起動することを確認します。

http://パブリックIP:3000

# 参考URL
[EC2インスタンスにRails + MySQL環境構築](https://qiita.com/yamato1491038/items/ec343a1bce41d3252473)
[【AWS EC2】Amazon Linux2にMySQLのclientだけをインストールしてRDSに接続する方法](https://qiita.com/tamorieeeen/items/d9b2af588f1dfd43120d)
[【AmazonLinux2】MySQL2のGemをインストールする際にエラー](https://qiita.com/akk_ayy/items/f43a1af5368d1570c6f3)