Rails アプリを EC2 にデプロイしよう！（準備編）

Rails アプリを Amazon Web Service を使ってデプロイするまでの手順をまとめました。
次の順番でデプロイまで持っていきます。

1, 準備編
2, EC2インスタンス用意編
3, nginx、MySQL、node.js、rubyインストール編
4, サーバー起動編

今回は「準備編」です。


# 準備編の前に
この記事では初めて AWS を使用して、Rails アプリをデプロイする方向けに書いています。
また、この記事では既に AWS アカウントを作成しているものとして解説していきます。

AWSアカウントを作成したばかりの方は、始める前に[AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ](https://qiita.com/tmknom/items/303db2d1d928db720888)を読んだ方がいいです。

AWS にサービスを設置する方は、
**あなたが必要としている機能が全て提供されているリージョン**で作業を行ってください！
リージョンについてよく分からない！という方は[こちらの記事](https://www.t3a.jp/blog/infrastructure/aws-best-region/)を読んでください。
今回は `ap-northeast-1` で作業していきます。

今回用意した Rails アプリの仕様を次に記載します。

アプリ名：SampleApp
Ruby: 2.6.5
bundler: 1.17.3

|gem|version|
|---|---|
|Rails|~> 5.2.2|
|Puma|~> 3.7|
|mysql2|'>= 0.4.10', '< 0.5'|


# VPC の作成
VPCとはVirtual Private Cloudの略です。
AWSというネットワークの中に自分専用のプライベート空間を作って、その中にコンピュータをレンタルして使用していきます。
<img width="500" alt="Virtual Private Cloud［図］" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530541/7acd0ad0-ca32-ad0b-cd07-ea9ac4328eab.png">

早速作っていきます。
1, コンソール画面から検索するなりして「VPC」をクリックしてください。
2, 左のメニューバーから「VPC」をクリックしてください。
3, 左上辺りにある[VPCの作成]をクリックしてください。
4, 必要な項目の入力画面が出てきます。意味は次の通りです。

|名称|意味|
|---|---|
|名前タグ|作成したいVPCの名前|
|CIDR(サイダー)ブロック|このVPCが使用できるIPの範囲を決める|
|テナンシー|VPCを作る際にハードウェアを占有するか選択できる。占有すると追加料金がかかる。|

5, 今回は次のように入力します。
<img width="800" alt="Virtual Private Cloud［入力例］" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530541/d78f2bc3-e4b9-ca9e-5b29-ada142d8131f.png">

※今後「名前タグ」は次の規則で書いていきます。
`(アプリ名)_(サービス名)_(アベイラビリティーゾーン|ローカルIPアドレス|グループ名)`

# サブネットの作成

次はサブネットを作成していきます。
サブネットは、大きなネットワークを分割した際の、それぞれの小さいネットワークのことです。
<img width="500" alt="サブネット［図］" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530541/1b459774-96ac-7de7-e44b-ec786f2a8764.png">
VPC の中に役割の異なるいくつかのサブネットを作成することで、グループ毎に管理することができます。
では早速作成していきましょう。

1, 左のメニューバーから「サブネット」をクリックしてください。
2, 左上辺りにある[サブネットの作成]をクリックしてください。
3, 必要な項目の入力画面が出てきます。意味は次の通りです。

|名称|意味|
|---|---|
|名前タグ|作成したいサブネットの名前|
|VPC|作成元のVPCを選択する。先ほど作成したVPCをプルダウンで選択しましょう。|
|アベイラビリティーゾーン|AWSのリージョンの中で仮想的に分けられているグループ|
|IPv4 CIDR ブロック|作成元のVPCから、このサブネットが使用できるIPの範囲を決める|

今回は一番単純な形でアプリケーションをデプロイしたいので、
外部と通信するサブネットのみを作成します。

4, 今回は次のように入力します。
<img width="800" alt="サブネット［入力例］" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530541/40676252-eaaa-4f77-7d90-668c62208057.png">

これにてサブネットの作成は完了です。

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

次はインターネットゲートウェイを作成していきます。
VPCはあくまでAWS内での占有領域なので、外部との接続を行う際はその領域から出るための窓口が必要になります。
その窓口を担うのが、今回のインターネットゲートウェイです。
<img width="500" alt="インターネットゲートウェイ［図］" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530541/b4954390-ae83-933b-8d8a-11bf818a856e.png">
では早速作成していきましょう。

1, 左のメニューバーから「インターネットゲートウェイ」をクリックしてください。
2, 左上辺りにある[インターネットゲートウェイの作成]をクリックしてください。
3, 必要な項目の入力画面が出てきます。意味は次の通りです。

|名称|意味|
|---|---|
|名前タグ|作成したいインターネットゲートウェイの名前|

今回は「名前タグ」をこのように設定しました。
<img width="800" alt="インターネットゲートウェイ［入力例01］" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530541/4aa08c84-0fba-27a5-4a50-c69542106592.png">
作成すると「detached」という状態になります。
これから先ほど作成したVPCに「SampleApp_IGW」をアタッチしましょう。

4, 左上辺りにある「アクション」から「VPCにアタッチ」を選択してください。
<img width="800" alt="インターネットゲートウェイ［操作例］" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530541/2aa24042-1652-c040-b8eb-b5f76e0d4910.png">

5, 必要な項目の入力画面が出てきます。意味は次の通りです。

|名称|意味|
|---|---|
|VPC|アタッチ先のVPCをプルダウンで設定します|

6, 先ほど作成したVPCを設定しましょう。
<img width="720" alt="インターネットゲートウェイ［入力例02］" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530541/a334a85f-2c22-28a2-4dfa-d245d6f6a167.png">
下の方に「AWS コマンドラインインターフェイスコマンド」というものがありますが、
今回の設定に関係がないので、説明を割愛します。

「アタッチ」ボタンを押して「attached」という状態になっていればOKです。

# ルートテーブルの作成

次はルートテーブルを作成していきます。
ルートテーブルとは、VPC内での通信のルールを定めたものです。
<img width="500" alt="ルートテーブル［図］" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530541/11936c8a-20f2-9e9c-7f1a-27262af3c422.png">
この通信ルールが定まってないと通信ができないので、
早速作成していきましょう。

1, 左のメニューバーから「ルートテーブル」をクリックしてください。
2, 左上辺りにある[ルートテーブルの作成]をクリックしてください。
3, 必要な項目の入力画面が出てきます。意味は次の通りです。

|名称|意味|
|---|---|
|名前タグ|作成したいルートテーブルの名前|
|VPC|作成元のVPCを選択する。先ほど作成したVPCをプルダウンで選択しましょう。|

4, 今回は次のように入力します。
<img width="800" alt="ルートテーブル［入力例01］" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530541/d784c012-eb7c-e4ee-41e2-0da19861a8f7.png">
これで作成できたので、このルートテーブルにいくつか設定を追加していきます。

まずは、「インターネットゲートウェイをルーティングするというルール」を記載します。
これを記載しないと外部との接続ができません。

5, 下のナビゲーションメニューの中から「ルート」を選択してください。
6, 「ルートの編集」をクリックしてください。
<img width="800" alt="ルートテーブル［ボタンの場所01］" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530541/a7a4ffb9-dedc-6b22-07d1-c05995ead4cb.png">
7, 「ルートの追加」をクリックして、次のように入力してください。
<img width="800" alt="ルートテーブル［入力例02］" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530541/90ed4da1-bc7a-1812-ea19-53b0bee76251.png">
ルートが保存されるとOKです。

次にルートテーブルとサブネットとを関連付ける作業を行います。
これを記載しないとサブネットに通信が届きません。

7, 下のナビゲーションメニューの中から「サブネットの関連付け」を選択してください。
8, 「サブネットの関連付けの編集」をクリックしてください。
<img width="800" alt="ルートテーブル［ボタンの場所02］" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530541/82f3bdf1-53d2-7e1e-1762-07c0311209f9.png">
9, 先ほど設定した「SampleApp_Subnet_ap-northeast-1a_AppServer」を選択して紐付けを行います。
<img width="800" alt="ルートテーブル［入力例03］" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530541/da9d078b-fe30-b6b0-9de4-ac40073cb300.png">
保存されるとOKです。

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

準備編の最後の作業です。
セキュリティグループを作成していきます。

セキュリティグループとは「この通信は許可」「この通信は拒否」といった具合に通信の制限をかけることができる機能です。
<img width="500" alt="セキュリティグループ［図］" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530541/dbbe7619-7632-6a65-9707-eb3153eb2340.png">
今回は誰でもブラウザを介してサーバーにアクセスするための「http」と、
コマンドラインからサーバーにアクセスするための「ssh」を設定していきます。

まずは早速作成していきましょう。

1, 左のメニューバーから「セキュリティグループ」をクリックしてください。
2, 左上辺りにある[セキュリティグループの作成]をクリックしてください。
3, 必要な項目の入力画面が出てきます。意味は次の通りです。

|名称|意味|
|---|---|
|セキュリティグループ名|作成したいセキュリティグループの名前|
|説明|このセキュリティグループの用途などを入力しましょう|
|VPC|作成元のVPCを選択する。先ほど作成したVPCをプルダウンで選択しましょう。|

4, 今回は次のように入力します。
<img width="800" alt="セキュリティグループ［入力例01］" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530541/0e52420e-0c5a-9699-3c94-016b5142a813.png">

次に「インバウンドルール」を記載します。
これを記載しないと外部との接続ができません。

5, 下のナビゲーションメニューの中から「インバウンドのルール」を選択してください。
6, 「ルールの編集」をクリックしてください。
<img width="800" alt="セキュリティグループ［ボタンの場所01］" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530541/e7067f83-6cd8-8a8e-17a6-fef28b5b1eea.png">
7, 「ルールの追加」をクリックして、次のように入力してください。
<img width="993" alt="スクリーンショット 2020-03-14 2.51.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530541/71784269-b0bb-2ef1-6543-2d07237ce249.png">
「ソース」の選択肢で「マイIP」を設定すると、
あなたが使用しているWifiのグローバルIPが設定されます。

プロトコルの説明については割愛します。
[こちらのサイト](https://www.web-knowledge-info.com/posts/web_basic_knowledge2.html)が結構わかりやすかったです。

以上で「準備編」設定は完了です。

# 最後に

今回は「準備編」でした。
まだコマンドラインが出てきてないですが、後々出てきます...

それでは次回「[サーバー構築編](https://qiita.com/tao066/items/11575932e6aa05c3afdd)」お楽しみに。

# 謝辞

自分が初めて AWS にデプロイした際、このサイトを軸に作業を進めました。

* 世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで
    * [下準備編](https://qiita.com/naoki_mochizuki/items/f795fe3e661a3349a7ce)
    * [DB・サーバー構築編](https://qiita.com/naoki_mochizuki/items/22cfbf4bf7ec95f6ac1c)
    * [デプロイ編①](https://qiita.com/naoki_mochizuki/items/814e0979217b1a25aa3e)
    * [デプロイ編②](https://qiita.com/naoki_mochizuki/items/5a1757d222806cbe0cd1)

しかし、その時にデプロイする Rails アプリケーションの仕様が、
上記のサイトと異なっていたため、次のサイトを活用しながら進めました。

* [EC2サーバにRuby環境構築](https://qiita.com/tisk_jdb/items/61025d32862555846865)
* [AWS EC2でNodeを動作させる](https://qiita.com/oishihiroaki/items/bc663eb1282d87c46e97)

また、Nginx の設定やコマンドに関しては次のサイトを参考にしました。

* [nginx起動、再起動](https://qiita.com/Kaisyou/items/dadf6fe9ee93fb69e76c)
* [Nginx導入時やること](https://qiita.com/kidach1/items/985efebba639713c562e)

また、アプリケーションサーバーとして Puma を採用した際には、
次のサイトにお世話になりました。

* [RackサーバーのPumaについて調べてみる](https://arakaji.hatenablog.com/entry/2015/08/03/200502)
* [railsでpumaが走らない時に怪しむべきtmp以下](https://qiita.com/itosys/items/30a48f50ce376f5ca2fd)

その他、次のサイトにお世話になりました。

* [EC2インスタンス＆GitHubにSSH接続できない時に見直してほしいセキュリティーグループ](https://qiita.com/yukihirop/items/2b192284fdfb3b448bd3)
* [EC2 T2インスタンスにswapファイルを追加する方法](https://www.checksite.jp/ec2t2-add-swapfile/) 
    * `assets:precompile` が失敗した際に、swap ファイルを追加することで解決できました。
* 本記事の執筆にあたり、参考元として取り上げたサイト

この場を借りて深く御礼申し上げます。