AWSで1からWebサイトのインフラ構成を構築してみた

こんにちは。
Web・iOSエンジニアの三浦です。

今回は、業務で使ったことのまとめも兼ねて、AWSを使ったWebサイトのインフラ構成を1から構築してみます。
なおここでは、ドメインの取得まではしないのであらかじめご了承ください。

# 構成
まずは構成を考えていきます。
今回は以下のような構成とします。

|<img width="100%" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/7fd7ee24-6996-3101-49ed-f81c59dc7e2c.png">|
|:-:|

説明していきます。

## VPC

サーバーやDBなどのAWSのサービスは、そのまま使うこともできますが、例えるならそれは雑居ビルのランダムな部屋を使用しているようなものです。
それでも問題があるわけではありませんが、セキュリティ周りをより厳密に設定するなどしたい場合は、 `VPC` （Virtual Private Cloud）というサービスを使うことができます。
このサービスは、例えるならビルの1フロアを丸々借り上げるようなものです。

|<img width="100%" alt="VPC構築" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/15eab6bc-6965-17eb-1c46-7b0e14985fd5.png">|
|:-:|

さらに `VPC` の中を `サブネット` という形で分けることができます。
これは借り上げたフロアの中を更に区切るもので、基本的にはこの `サブネット` の中にサーバーやDBを作っていくことになります。
`サブネット` には、外部からインターネットでアクセスできる `パブリックサブネット` と、直接インターネットからアクセスできない `プライベートサブネット` があり、外部とつながる必要のないサービスを `プライベートサブネット` に入れ、直接ユーザーがアクセスする必要のあるサービスを `パブリックサブネット` の中に入れる、といった使い方をします。

ちなみに `VPC` を作成する際は、「リージョン」というものを選択します。
リージョンには「東京」や「オハイオ（アメリカ）」など様々な地域があり、物理的にAWSの施設がある地域のことです。
例えば日本で使うのであれば「東京」リージョンのほうが「オハイオ（アメリカ）」リージョンよりも物理的に距離が近いので、通信時間が短くなります。
またリージョンの中にはアベイラビリティゾーン（AZ）というものがあります。
東京リージョンには3つのAZがあり、このAZの住所に実際にAWSの施設が存在します。
AZが複数存在するのは、地震や停電などでいずれかのAZの機能が停止したとしても、他のAZでサービスを停止させることなく続けられるようにする、などの可用性の向上のためです。

`サブネット` を作成する際は、どのAZに `サブネット` を作成するかを選択します。

|<img width="100%" alt="サブネット構築" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/1db51575-4072-16ef-5330-d34b65d7cef2.png">|
|:-:|

ちなみに `プライベートサブネット` が直接インターネットからアクセスできないとは言っても、サーバーへ必要な設定をダウンロードするなどインターネットとつながっている必要があります。
「インターネットからはアクセスできない」が「インターネットとつながっている」状態を実現するため、`NATゲートウェイ` （Network Address Translation Gateway）という、 `VPC` 内部のIPアドレス（プライベートIPアドレス）とインターネットのIPアドレス（グローバルIPアドレス）を相互に変換してくれるサービスを使用します。
`NAT ゲートウェイ` を `パブリックサブネット` 内に配置し、 `プライベートサブネット` がインターネットと何らかのやり取りをする際にそれを経由することで、セキュリティを保ったままインターネットに接続することができるようになります。

|<img width="100%" alt="NATゲートウェイ作成" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/70638041-8251-fa9b-6c0b-32199775c244.png">|
|:-:|

`NAT ゲートウェイ` はすべての `パブリックサブネット` においてもいいのですが、今回は1つの `パブリックサブネット` にのみ置きます。
これは、実際に今回使用する `サブネット` は `パブリックサブネット` と `プライベートサブネット` それぞれ1つずつのためです。
今回使用しない `サブネット` を作るのは、後述するRDSやALBを使用するためには最低でも2つのAZに `サブネット` が存在する必要があるためです。


## EC2

Webサイトを作成するには、サーバーが必要です。
AWSのサーバーは `EC2` （Elastic Compute Cloud）と呼ばれます。

|<img width="100%" alt="アプリケーションサーバー作成" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/54f62a21-dd95-911b-b3e9-b343076bc29b.png">|
|:-:|

先程の説明だと、この `EC2` は直接ユーザーがアクセスするものなので `パブリックサブネット` に置くはずだ、と思うかもしれませんが、今回は `ALB` というサービス（後で説明します）を使うため、 `EC2` は `プライベートサブネット` に入れます。

またもう一つ、サーバーに開発者が直接ログインするため、ログイン中継用の `EC2` を作成しておきます。
こういったサーバーは「踏み台サーバー」と呼ばれます。

|<img width="450" alt="踏み台サーバー作成" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/4dc2baf8-ec77-0b4f-0c42-a11b46f2a8ce.png">|
|:-:|

## RDS

Webサイトを構築する場合、DBを使用することも多いでしょう。
このとき、`EC2` の中にDBを構築してもいいですが、AWS側が管理してくれる `RDS` （Relational Database Service）を使うという手もあります。

|<img width="450" alt="RDS作成" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/655071c7-552b-b9a3-3c85-a10204718a07.png">|
|:-:|

こちらに関してはユーザーが直接アクセスする必要がないので、 `プライベートサブネット` の中に入れます。

## ALB

ユーザーが自分のPCからWebサイトにアクセスする場合、そのアクセスを受け付けるものが必要になります。
`EC2` を `パブリックサブネット` に置き、それで直接アクセスを受け付けることもできますが、ここでは `ALB` （Application Load Balancer）というものを使います。

|<img width="450" alt="ALB作成" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/a8e2a7bc-ff30-25f8-d77d-5180b87f50e1.png">|
|:-:|

`ALB` は Load Balancer 、すなわち負荷均衡化のためのサービスで、複数のサーバーを `ALB` に紐付けることでアクセスの流し先を自動的に分散し、サーバーごとの負荷を減らすことができます。
またそれだけでなく、 `ACM` （AWS Certificate Manager）というサービスを使うことで、自動で更新される証明書を使ってWebサイトをHTTPSにすることができます。

## Route 53

最後に、ユーザーがこちらで指定するURLからアクセスできるようにするため、 `Route 53` を使用します。
`Route 53` は、ドメイン名（URLが `https://***/index.php` のような形だった場合、 `***` の部分）を購入したり、そのドメインを `ALB` や `EC2` に紐付けることができます。

|<img width="100%" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/7fd7ee24-6996-3101-49ed-f81c59dc7e2c.png">|
|:-:|

ここまでできれば、あとは `EC2` や `RDS` に必要な設定をすればWebサイトを構築することができます！
それでは実際にAWS上で構築してみましょう。

# 手順
## 1. アカウント作成

まずは[こちら](https://portal.aws.amazon.com/billing/signup?redirect_url=https%3A%2F%2Faws.amazon.com%2Fregistration-confirmation&language=ja_jp#/start)からアカウントを作成します。

|<img width="100%" alt="アカウント作成" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/a221feab-287f-7d17-0d80-d32cbb0403ac.png">|
|:-:|

アカウントの作成が完了したら[こちら](https://aws.amazon.com/jp/console/)の「コンソールにサインイン」からログインしてください。

|<img width="100%" alt="ログイン前" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/bda249c3-b486-f9b0-9d7e-9aa7bc9dd191.png">|
|:-:|

先程作成したアカウントを使用します。

|<img width="100%" alt="ログイン画面" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/e9a0949f-8b8c-8684-fab1-ac313bed1fa8.png">|
|:-:|

無事コンソールに入ることができました！

|<img width="100%" alt="コンソール" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/9c1f6eaa-67a3-c7ef-a459-315e94272427.png">|
|:-:|

なお右上に出ているように、デフォルトでは「オハイオ」リージョンのEC2などを使用するようになっていますが、「東京」リージョンが良ければ変更してください。

## 2. VPC

では、VPCを作っていきます。
まずはコンソール画面の検索ボックスに「VPC」を打ち込み、クリックします。

|<img width="100%" alt="コンソール（VPC打ち込み）" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/315e748e-5be5-076d-2205-e518beccdf55.png">|
|:-:|

VPCの画面に行ったら、まずは左下にある「Elastic IP」に進みます。

|<img width="100%" alt="VPCコンソール（Elastic IP指し）" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/0a552709-3673-22ec-1b28-955e7c7b7122.png">|
|:-:|


`Elastic IP` とは、AWSから取得できるグローバルIPアドレスです。
今回はNAT ゲートウェイに必要なため作成します。
「新しいアドレスの割当」からIPアドレスを作成しましょう。

|<img width="100%" alt="VPC・Elasitc IP" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/4596b79e-6343-0e43-101f-5268d50ad10e.png">|
|:-:|

|<img width="100%" alt="新しいアドレスの割り当て" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/3b56c789-3703-6a24-fdf6-ba297c18d10b.png">|
|:-:|

IPアドレスの作成が完了したら、以下のような画面が表示されるはずです。

|<img width="100%" alt="新しいアドレスの割り当て完了" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/d7c7bbe3-4345-7ef2-eb07-7e8fcdea1cf0.png">|
|:-:|

「閉じる」で画面を戻します。

続いて、VPCを作っていきます。
画面左上の「VPCダッシュボード」をクリックします。

|<img width="100%" alt="スクリーンショット_2020-02-23_20_48_29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/b57dd069-7771-90b3-f212-dbcd20dba4b6.png">|
|:-:|

ダッシュボード画面から「VPC ウィザードの起動」に進みましょう。

|<img width="100%" alt="スクリーンショット_2020-02-23_20_49_50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/0772a382-1a9e-7006-e82a-292522d85300.png">|
|:-:|

ステップ1では、「パブリックとプライベートサブネットを持つVPC」を選択します。

|<img width="100%" alt="スクリーンショット 2020-02-23 20.51.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/f76cc9df-08d9-f697-66fe-216183817fbe.png">|
|:-:|

ステップ2では、以下のものを設定していきます。

**VPC名**

VPCにつける名前です。
なんでも良いですが、わかりやすいものにしましょう。

**パブリックサブネットのアベイラビリティゾーン**

パブリックサブネットを入れるAZです。
こちらはどこでも大丈夫です。

**パブリックサブネット名**

こちらもなんでもいいですが、「public」などの文字やAZのタイプ（a,c,d）などを入れるとわかりやすいです。

**プライベートサブネットのAZ**

プライベートサブネットを入れるAZです。
こちらもなんでもいいですが、パブリックサブネットと同じAZに入れることで、通信時間やコストをわずかでも減らすことができます。

**プライベートサブネット名**

こちらもなんでもいいですが、「private」などの文字やAZのタイプ（a,c,d）などを入れるとわかりやすいです。

**Elastic IP 割当 ID**

先ほど作成したElastic IPのIDを入力します。

その他はそのままで大丈夫です。
入力完了後に「VPCの作成」を押せば、VPCが作られます！

|<img width="100%" alt="スクリーンショット_2020-02-23_21_04_54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/7e5e685e-b771-bdf4-eaab-930df8deb690.png">|
|:-:|

少し待つと、こんな画面が表示されます。

|<img width="100%" alt="スクリーンショット 2020-02-23 21.18.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/ed5d8b24-b855-8493-ea11-4693f7d81878.png">|
|:-:|

作成が完了したら、続いて残りのAZ用のパブリック・プライベートサブネットを作成します。

まずは「サブネット」へと行きます。

|<img width="100%" alt="スクリーンショット_2020-02-24_15_56_42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/8ed5fd41-dc5f-919a-58e0-3080f3365442.png">|
|:-:|

サブネットで「サブネットの作成」をします。

|<img width="100%" alt="スクリーンショット_2020-02-24_15_56_29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/2177f31b-3db7-cdf2-a0c7-bf98243371c0.png">|
|:-:|

以下のように作っていきます。

**名前タグ**

何でも大丈夫ですが、先程のように「public/private」や「a/c/d」が入っているとわかりやすいです。

**VPC**

先程作ったものを選びます。

**アベイラビリティゾーン**

パブリック・プライベートサブネットで1つずつ選ぶようにします。

**IPv4 CIDR ブロック**

何でも大丈夫ですが、他のものとかぶらないようにしましょう。

|<img width="100%" alt="スクリーンショット 2020-02-24 15.49.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/7ad5421b-82fc-9e94-3741-39f02b7452fd.png">|
|:-:|

|<img width="100%" alt="スクリーンショット 2020-02-24 15.49.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/2a5bb471-e4ae-5ffb-8972-7d15df204e07.png">|
|:-:|

|<img width="100%" alt="スクリーンショット 2020-02-24 15.50.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/3dd909ef-f5b1-17a7-2d52-ed24168f786b.png">|
|:-:|

|<img width="100%" alt="スクリーンショット 2020-02-24 15.51.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/ee83f9b1-73e4-3cbc-d581-73bfe0921dae.png">|
|:-:|

作成が完了したら、パブリックサブネットのみルートテーブルを変更します。

パブリックサブネットの一つを選択し、下の「ルートテーブル」を押して、「ルートテーブルの関連付けの編集」をします。

|<img width="100%" alt="スクリーンショット_2020-02-24_16_04_31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/13825063-c31a-c9a9-abc3-17fe3d7ad4b6.png">|
|:-:|


`igw-***` が表示される方のルートテーブルIDを選択し、「保存」します。
なお `igw-***` はインターネットゲートウェイと呼ばれるもので、パブリックサブネットに必要なゲートウェイとなっています。

|<img width="100%" alt="スクリーンショット_2020-02-24_16_06_21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/1f3a0aae-0b85-6e57-5ab0-485bce34a3d1.png">|
|:-:|

他のパブリックサブネットについても同様に設定してください（なお、最初にVPCと一緒に作成したパブリックサブネットは最初から正しい設定になっています）。

設定が完了したら、「ルートテーブル」「インターネットゲートウェイ」「Elastic IP」「NAT ゲートウェイ」に移り、作成したVPCに紐付いた各データに名前をつけると良いでしょう。
デフォルトのものもあるので、紐付いているVPC IDを見て判断してください。
こちらも適当な名前で大丈夫です。

|<img width="100%" alt="スクリーンショット_2020-02-23_21_22_17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/425f9f05-5bdd-5670-9d83-b675a2b4f019.png">|
|:-:|

|<img width="100%" alt="スクリーンショット 2020-02-23 21.27.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/59408057-f451-5d2d-fc1e-28dd5f394df3.png">|
|:-:|

|<img width="100%" alt="スクリーンショット 2020-02-23 21.27.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/1d446166-fb2d-42af-605a-39145221bc45.png">|
|:-:|

|<img width="100%" alt="スクリーンショット 2020-02-23 21.28.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/af9000e7-db75-2dff-db9a-eea197f7eb74.png">|
|:-:|

|<img width="100%" alt="スクリーンショット 2020-02-23 21.28.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/364fde00-57b4-31cb-29a9-acde1c4e4613.png">|
|:-:|

これでVPCの作成は完了です！


|<img width="100%" alt="NATゲートウェイ作成" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/70638041-8251-fa9b-6c0b-32199775c244.png">|
|:-:|

## 3. EC2

では次に、EC2を作成します。
まずは踏み台サーバーを作りましょう。

まずは左上のAWSのロゴからコンソール画面に戻ります。

|<img width="100%" alt="スクリーンショット_2020-02-23_21_33_58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/591765ff-1ec1-dcf6-cf8f-cd33dc20cfbb.png">|
|:-:|

コンソール画面でEC2を入力し、移動します。

|<img width="100%" alt="スクリーンショット 2020-02-23 21.43.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/b3204326-9212-3028-31ed-4029676d67ef.png">|
|:-:|

踏み台サーバーには外部からアクセスする必要があるので、まずはElastic IPを作成します。

|<img width="100%" alt="スクリーンショット_2020-02-23_22_17_29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/42648bba-0dd5-708d-2cd3-88ccbca85324.png">|
|:-:|

「Elastic IPアドレスの割り当て」から作成します。

|<img width="100%" alt="スクリーンショット_2020-02-23_22_56_53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/dc39a037-9a83-6e07-5718-d27dc2b4f7bf.png">|
|:-:|

そのまま「割り当て」をクリックしてください。

|<img width="100%" alt="スクリーンショット 2020-02-23 22.58.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/53107496-6ad3-a830-13bc-8b6ae1622889.png">|
|:-:|

以下のようになるはずです。

|<img width="100%" alt="スクリーンショット_2020-02-23_22_58_59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/42c67ca4-4953-9739-e207-0f242f979083.png">|
|:-:|

作成が完了したら、EC2を作っていきましょう。
まずは「インスタンス」の画面へ行きます（ちなみにAWSでは、サーバーのことをEC2インスタンス、インスタンスなどと言ったりします）。

|<img width="100%" alt="スクリーンショット_2020-02-23_23_00_33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/1c2b4a3f-55cf-eab9-d94b-09244e8839e7.png">|
|:-:|

インスタンスの画面にて、「インスタンスの作成」を行います。

|<img width="100%" alt="スクリーンショット_2020-02-23_23_01_28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/700f2314-c794-4621-7e79-690e45eae606.png">|
|:-:|

まずはAMI（Amazon Machine Image）を選択していきます。
これによってサーバーのOSなどが決まってきます。
必要性に応じて選べば問題ありませんが、ここは一番上にある「Amazon Linux 2 AMI (HVM), SSD Volume Type」を選択します。

|<img width="100%" alt="スクリーンショット 2020-02-23 23.02.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/43b7e02c-d333-9c88-e18a-c8b81d128cb3.png">|
|:-:|

次にインスタンスタイプを選びます。
インスタンスタイプは、サーバーのCPUやメモリなどのスペックに関わってきます。
サーバーにかかる負荷によって選択する必要がありますが、もしまだアカウントを作って1年以内であれば `t2.micro` が無料枠で使用できるので、今回はそちらを選びます。
選択後は、「次のステップ：インスタンスの詳細の設定」をクリックします。

|<img width="100%" alt="スクリーンショット 2020-02-23 23.04.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/1b92c1db-9ae7-4a95-bbe5-c2275827e00c.png">|
|:-:|

インスタンスの詳細設定では、以下を設定します。

**ネットワーク**

最初に作成したVPCを選択します。

**サブネット**

パブリックサブネットのどれかを選択します。
なお今回はすべてのサービスを同じAZのサブネットで作成するので、どのAZで作ったかを覚えておいてください。

ちなみに、より詳細にサーバーの属性を設定できるIAMと呼ばれるものもありますが、今回は簡易的に行うため設定しません。
選択後、「次のステップ：ストレージの追加」をクリックします。

|<img width="100%" alt="スクリーンショット_2020-02-23_23_08_55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/b03acb62-e644-c2e5-c948-ff3d846282ac.png">|
|:-:|

ストレージの追加では、サーバーのストレージを決定します。
今回は何もせず、「次のステップ：タグの追加」を選択します。

|<img width="100%" alt="スクリーンショット_2020-02-23_23_15_49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/6337f528-e607-54d0-3fc5-463d8ca852c6.png">|
|:-:|

タグの追加では、作成するインスタンスにタグを追加できます。
これによりコスト確認などがより便利にできるようになりますが、今回は何もせず「次のステップ：セキュリティグループの確認」を選択します。

|<img width="100%" alt="スクリーンショット_2020-02-23_23_17_08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/c01b246b-63dd-67c9-eb9f-b118d0e16753.png">|
|:-:|

セキュリティグループは、インスタンスのセキュリティを担保するファイアウォールです。
以下を設定します。

**セキュリティグループの割当**

「新しいセキュリティグループ」を作成します。

**セキュリティグループ名**

適当なものを設定します。

**説明**

適当なものを設定します。

**SSH**

SSHでサーバーにログインするために必要な設定です。
自分のPCのIPアドレスを「ソース」に設定することで、自分のPCのIPアドレス以外からはSSHでアクセスできなくなります。

**すべてのICMP - IPv4**

`ping` コマンドなどで確認できるようにするための設定です。
今回は `0.0.0.0/0` でどこからでも確認できるようにしていますが、ここのIPアドレスを絞っても良いかもしれません。

踏み台であれば以上で十分でしょう。
入力後、「確認と作成」を押します。

|<img width="100%" alt="スクリーンショット_2020-02-23_23_20_42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/9f056638-e7b2-6fcf-88df-8e73aa37b4fb.png">|
|:-:|

確認画面が問題なければ「起動」します。

|<img width="100%" alt="スクリーンショット_2020-02-23_23_28_08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/62b2fc59-bcaf-b2f7-38a9-4255f3ede52f.png">|
|:-:|

起動するとキーペアについて尋ねられるので、ここでは「新しいキーペアの作成」をします。
名前は適当なものを設定し、ダウンロードしてください。
ダウンロードすると「インスタンスの作成」ができるようになります。
なおここでダウンロードしたキーペアをなくすとサーバーにログインできなくなるので、注意してください。

|<img width="100%" alt="スクリーンショット 2020-02-23 23.31.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/db5fa9b2-845b-815c-0b40-8e8bbb486a22.png">|
|:-:|

作成すると以下のような画面になります。必要に応じて「請求アラートの作成」をしてもいいでしょう。
問題なければ「インスタンスの表示」をします。

|<img width="100%" alt="スクリーンショット 2020-02-23 23.34.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/561b8752-cda2-140f-566b-fcf7a6b4bcbc.png">|
|:-:|

インスタンスを作成したら、先程のVPCのときと同じように名前をつけると良いでしょう。
また、Elastic IPとの紐付けで使うので、インスタンスIDとプライベートIPをメモなどに保存しておきます。
その後、Elastic IPへ進みます。

|<img width="100%" alt="スクリーンショット_2020-02-23_23_36_13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/b1a858c5-118c-b8d8-f262-e928caece937.png">|
|:-:|

先程作成したIPにチェックをし、「Actions」から「Elastic IPアドレスの関連付け」を選んでください。

|<img width="100%" alt="スクリーンショット_2020-02-23_23_37_45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/f28e6bb1-844f-f800-0afb-d4690cd87693.png">|
|:-:|

Elastic IPアドレスの関連付けでは、以下のように設定します。

**リソースタイプ**

EC2に紐付けるので、「インスタンス」を設定してください。

**インスタンス**

先程作成したEC2を選択してください。

**プライベートIPアドレス**

先程作成したEC2のプライベートIPアドレスを選択してください。
入力後、「関連付ける」を押してください。

|<img width="100%" alt="スクリーンショット_2020-02-23_23_39_37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/c3a98e62-fc51-73e8-1111-7731af113ac6.png">|
|:-:|

これでサーバーの作成は完了です！
実際にログインしてみましょう。

まずは先ほどダウンロードした鍵（秘密鍵）を、秘密鍵が通常存在するディレクトリへ移動させます。

```bash
mv ~/Downloads/test-bastion-key.pem ~/.ssh/
```

続いて、権限を変更します。

```bash
chmod 600 ~/.ssh/test-bastion-key.pem
```
準備ができたら、先程作成したElastic IP先に、今の秘密鍵を使ってログインしてみます。
ちなみにユーザー名は `ec2-user` です。

```bash
ssh -i ~/.ssh/test-bastion-key.pem ec2-user@{先程のElastic IP}
```

これで無事ログインできるはずです！
なおユーザーについては `ec2-user` を使いまわしたりせず、ちゃんと各ユーザー用のものを作成しましょう。

では次に、Webサイト用のEC2を作成します。
とは言っても、今の手順のうち一部を変更するのみです。
変更する手順は、

１. Elastic IP周りを設定しない
２. パブリックサブネット内に作成する

AZは踏み台サーバーと同じところにしてください。

|<img width="100%" alt="スクリーンショット_2020-02-24_13_51_22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/768f3a88-32a7-111c-b7c7-55736f734003.png">|
|:-:|

３. セキュリティグループは、VPC内からのみを考える

HTTPで受けるので、セキュリティグループは80番ポートを開けます。

|<img width="100%" alt="スクリーンショット_2020-02-24_13_50_52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/670d3600-901a-ab09-a00c-ed44c66ce662.png">|
|:-:|

４. 名前を適切につける

です。

これにてアプリケーションサーバーが作成され、踏み台サーバー経由でアプリケーションサーバーに入れるようになったはずです。
ダウンロードした秘密鍵を踏み台サーバーに入れることで踏み台サーバーからSSHログインしてもいいですが、ここでは `~/.ssh/config` にSSH設定ファイルをおいてログインしてみましょう。
なお今回の秘密鍵は `test-application-key` という名前で作成しました。

```bash
Host test-bastion
HostName {踏み台サーバーのグローバルIPアドレス}
User ec2-user
Port 22
IdentityFile ~/.ssh/test-bastion-key.pem

Host test-application
HostName {アプリケーションサーバーのプライベートIPアドレス}
User ec2-user
Port 22
IdentityFile ~/.ssh/test-application-key.pem
ProxyCommand ssh -W %h:%p test-bastion
```

こうして、

```bash
ssh test-application
```

とすることでアプリケーションサーバーにログインできるはずです！
これにて、EC2の作成は完了しました。

|<img width="450" alt="踏み台サーバー作成" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/4dc2baf8-ec77-0b4f-0c42-a11b46f2a8ce.png">|
|:-:|

## 4. RDS

では続いて、RDSの作成に移ります。
最初にRDS用のセキュリティグループを作ります。
EC2の画面から、そのまま「セキュリティグループ」に移動してください。

|<img width="100%" alt="スクリーンショット_2020-02-24_18_13_51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/a162e467-347d-2b26-23eb-67ef659b32a0.png">|
|:-:|

「セキュリティグループの作成」をします。

|<img width="100%" alt="スクリーンショット_2020-02-24_18_32_39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/0773947c-c63a-d8e7-f567-68cb23932af6.png">|
|:-:|

以下を設定します。

**セキュリティグループ名**

適当に設定します。

**説明**

適当に設定します。

**VPC**

作成したVPCを設定します。

**セキュリティグループのルール：インバウンド**

「MYSQL/Aurora」タイプ（3306番ポート）について、VPCのIPアドレスの範囲からのアクセスを許可します。
また、「ICMP」タイプは全許可します。

入力が完了したら「作成」をクリックしてください。

|<img width="100%" alt="スクリーンショット_2020-02-24_18_34_15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/70509b2a-6365-1076-7dcc-927511f6351e.png">|
|:-:|

続いてコンソール画面から、RDSの画面に移ってください。

|<img width="100%" alt="スクリーンショット 2020-02-24 14.26.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/712d930b-ffa5-87fe-06c7-80d165298516.png">|
|:-:|

まずは「サブネットグループ」を作成します。
サブネットグループとは、RDSが存在しうるサブネットをまとめたものです。

|<img width="100%" alt="スクリーンショット_2020-02-24_18_38_34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/f538107f-4a18-5b7c-714d-e83e03fa4e03.png">|
|:-:|

|<img width="100%" alt="スクリーンショット_2020-02-24_18_39_45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/af405a9c-12e9-125b-cf20-25f63df0f408.png">|
|:-:|

以下を設定してください。

**名前**

適当に設定します。

**説明**

適当に設定します。

**VPC**

作成したVPCを設定します。

|<img width="100%" alt="スクリーンショット_2020-02-24_18_41_52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/0aafc4c3-e565-51cd-439a-58278de02234.png">|
|:-:|


**サブネットの追加**

プライベートサブネットをすべて「サブネットを追加します」で追加してください。

|<img width="100%" alt="スクリーンショット_2020-02-24_18_42_53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/c044c2ad-48e0-8942-2f3f-6f81926521e9.png">|
|:-:|

完了したら「作成」を押します。

続いてパラメーターグループを作成します。

|<img width="100%" alt="スクリーンショット_2020-02-24_19_11_46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/d8b0a426-b707-83f3-7d65-330349192cb0.png">|
|:-:|

|<img width="100%" alt="スクリーンショット_2020-02-24_19_12_20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/af719720-9934-2a32-fb44-35346a0cb18b.png">|
|:-:|

以下を設定してください。

**パラメータグループファミリー**

今回は `Amazon Aurora MySQL` （AWSで開発されたクラウドに最適化されたDBで、MySQLと互換性があるもの）を使用する予定なので、 `aurora-mysql5.7` とします。

**タイプ**

`DB Parameter Group` とします。

**グループ名**

適当に設定します。

**説明**

適当に設定します。

完了したら「作成」を押します。

|<img width="100%" alt="スクリーンショット_2020-02-24_19_12_40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/2e0010a0-fb5a-23e9-bd82-0c17d434a05a.png">|
|:-:|

ここまでできたら、ダッシュボード画面から「データベースの作成」を選択してください。

|<img width="100%" alt="スクリーンショット_2020-02-24_19_21_10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/105e2043-e287-e093-a6dd-60a238f8dd04.png">|
|:-:|

<img width="1755" alt="スクリーンショット_2020-02-24_14_28_34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/79265234-8dd4-d15e-7675-1c1688b3c3e2.png">

以下のように設定します。

**エンジンのタイプ**

何でも大丈夫ですが、ここでは `Amazon Aurora` の、MySQLと互換性のあるものを選びます。


**バージョン**

好きなもので良いですが、ここでは最新のものにします。

|<img width="922" alt="スクリーンショット_2020-02-24_14_36_25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/b150a4f0-9fda-6af2-9d3b-3ec10772cba4.png">|
|:-:|

**DBクラスター識別子**

名前なので、適当につけてください。

**マスターユーザー名**

デフォルトのユーザー名です

**マスターパスワード**

ユーザーのパスワードとなります。
最初にログインするために必要なので、設定後は忘れないようにしましょう。

|<img width="816" alt="スクリーンショット 2020-02-24 14.36.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/cdfbb5c8-b448-9d58-3264-ca5b6bae57f2.png">|
|:-:|

**インスタンスサイズ**

とりあえず料金が最も安いdb.t2.smallを選びます。

**可能性と耐久性**

今回は「Auroraレプリカを作成しない」を選択します。
なお「別のAZでAuroraレプリカ/リーダーノードを作成する」にした方が安全性は増しますが、複数台のDBを作成する必要があります。

|<img width="100%" alt="スクリーンショット_2020-02-24_19_25_30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/c721558c-d878-d4ec-04b5-5574c7967cfa.png">|
|:-:|

**Virtual Private Cloud (VPC)**

作成したVPCを選択します。

その後「追加の接続設定」をクリックします。

**サブネットグループ**

先程作成したサブネットグループを選択します。

**VPCセキュリティグループ**

先ほど作成した、RDS用のセキュリティグループを選択します。

**アベイラビリティゾーン**

EC2を作成したのと同じAZを選択します。
完了したら、一番下の「データベースの作成」をクリックします。

しばらくするとDBが作成されます！

|<img width="100%" alt="スクリーンショット 2020-02-24 19.32.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/8d7b3d60-fa37-f362-cb56-775848a7000a.png">|
|:-:|

では、アプリケーションサーバーから接続してみましょう。
まずはアプリケーションサーバーにログインします。

```bash
ssh test-application
```

デフォルトではサーバーでmysqlコマンドが使えないので、インストールします。

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

これでログインできるようになりました！

```bash
mysql -u {ユーザー名} -p -h {RDSのエンドポイント}
```

ちなみに、RDSのエンドポイントは以下から確認できます。

|<img width="100%" alt="スクリーンショット_2020-02-24_20_11_48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/3b9b0cb6-2cff-cc11-3019-57a181dd9882.png">|
|:-:|

無事入れました！

|<img width="100%" alt="スクリーンショット 2020-02-24 20.13.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/5ca2099a-4b30-11bf-1df4-bdb269f6b0d0.png">|
|:-:|

|<img width="450" alt="RDS作成" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/655071c7-552b-b9a3-3c85-a10204718a07.png">|
|:-:|

## 5. ALB

次にALBを作成します。

コンソール画面から、またEC2の画面に飛びます。

|<img width="100%" alt="スクリーンショット 2020-02-23 21.43.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/b3204326-9212-3028-31ed-4029676d67ef.png">|
|:-:|

「ロードバランサー」へ進みます。

|<img width="100%" alt="スクリーンショット_2020-02-24_20_54_23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/7edbc632-b0d1-983a-5e41-8101ef0859d5.png">|
|:-:|

「ロードバランサーの作成」をしましょう。

|<img width="100%" alt="スクリーンショット_2020-02-24_20_58_06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/24bcd829-5aa3-60e5-7f37-f686161e48d0.png">|
|:-:|

今回はApplication Load Balancer(ALB)を「作成」します。

|<img width="100%" alt="スクリーンショット_2020-02-24_20_59_01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/cdbb1587-a65e-d58a-497f-c330169d267b.png">|
|:-:|

以下を設定していきます。

**名前**

適当に設定します。

**VPC**

作成したVPCを選択します。

**アベイラビリティゾーン**

すべてのAZに対してサブネットを作ったはずなので、すべてチェックを入れます。
ALBはインターネットから直接アクセスできる必要があるので、パブリックサブネットとします。

完了したら「セキュリティ設定」へ進みます。

|<img width="100%" alt="スクリーンショット_2020-02-24_21_27_38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/10b4fe9d-124b-c86c-0e75-8ef3f998a890.png">|
|:-:|

今回は先程の画面でHTTPSを選ばなかったのでここでは何もできませんが、もし選択した場合はこちらでいくつか設定をします。
Route 53などでドメインを作成して所有していると `ACM` というサービスで証明書を獲得でき、それを利用すればここでWebサイトをHTTPS化できます。
そのまま「次の手順：セキュリティグループの設定」に進みます。

|<img width="100%" alt="スクリーンショット_2020-02-24_21_05_38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/319580f3-3d32-187d-d5ea-b1d73d39c845.png">|
|:-:|

セキュリティグループの設定では、以下の設定をします。

**セキュリティグループの割当**

新しいセキュリティグループを作成します。

**セキュリティグループ名**

適当に設定します。

**説明**

適当に設定します。

**ルール**

HTTPとICMPの設定をします。
なお今回はALBがユーザーのアクセスを受け付けるところになるため、全IPアドレスから80番ポートへのアクセスを受け付けるようにします。

すべての設定が完了したら「次の手順：ルーティングの設定」へ進みます。

|<img width="100%" alt="スクリーンショット_2020-02-24_21_11_37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/ad200671-b125-3499-6c1d-2a826b705716.png">|
|:-:|

ルーティングの設定では、新しいターゲットグループを作成します。
名前は適当に設定してください。
その他はそのままで「次の手順：ターゲットの登録」に進みます。

|<img width="100%" alt="スクリーンショット_2020-02-24_21_14_56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/642ef767-b2a3-840d-507c-1e3991eba2fb.png">|
|:-:|

ターゲットの選択では、先程作成したアプリケーションサーバーを選択し、「登録済みに追加」を押します。
これにより、このALBへのアクセスが指定したEC2へ流れるようになります。
なおここに複数台のサーバーを設定すれば、自動で分散してアクセスを流してくれます。
設定が完了したら「次の手順：確認」へ進みます。

|<img width="100%" alt="スクリーンショット_2020-02-24_21_16_31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/6f2748af-2e68-ba40-fc8b-c8c4cf0ff6df.png">|
|:-:|

問題なければ作成します。

|<img width="100%" alt="スクリーンショット_2020-02-24_21_20_42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/704176e5-9f6c-eba1-c897-6832ecef7e7a.png">|
|:-:|

ALBができました！

|<img width="100%" alt="スクリーンショット 2020-02-24 21.21.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/3e52c0d1-6456-e47c-5248-0693b1cdfc88.png">|
|:-:|

実際にできているか確認してみましょう。

以下のDNS名を `host` コマンドで確認して、IPアドレスが確認できれば問題ありません！

|<img width="100%" alt="スクリーンショット_2020-02-24_21_32_50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/4564a55e-a240-abfa-deb3-f528f6991910.png">|
|:-:|

|<img width="100%" alt="スクリーンショット_2020-02-24_21_34_52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/aa55b222-7e08-7115-19de-22d8eb6bf1c6.png">|
|:-:|



|<img width="450" alt="ALB作成" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/a8e2a7bc-ff30-25f8-d77d-5180b87f50e1.png">|
|:-:|

## 6. Route 53

最後にRoute 53を使ってホストゾーンを指定します。
まずはコンソール画面からRoute 53の画面へ行きます。

|<img width="100%" alt="スクリーンショット 2020-02-24 21.41.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/6da3a5da-33a2-daa4-9f78-0fdfc1515f04.png">|
|:-:|

ドメイン取得をしたい場合は「ドメインの登録」をしますが、今回は「DNS管理」をします。
「今すぐ始める」を押してください。

|<img width="100%" alt="スクリーンショット_2020-02-24_21_43_09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/159cf4ec-56cf-282b-a525-c5c2820d0ae4.png">|
|:-:|

「ホストゾーンの作成」を行います。

|<img width="1765" alt="スクリーンショット_2020-02-24_21_44_34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/584fa0dd-fe72-650a-71f9-1526a399901f.png">|
|:-:|

遷移先で更に「ホストゾーンの作成」をクリックします。

|<img width="100%" alt="スクリーンショット_2020-02-24_21_45_16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/9dbd744a-7914-dda9-8c35-55ab62c28f11.png">|
|:-:|

「ドメイン名」には自分のサイトのドメイン名を、タイプには「パブリックホストゾーン」を選択します。
今回はドメイン名を取得していないので意味はありませんが、もしACMなどで取得していればここから指定したドメイン名に対するアクセスを制御できます。
入力したら「作成」します。

|<img width="100%" alt="スクリーンショット_2020-02-24_21_45_31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/7e1f9d5a-7f3d-2c23-539a-005601ceddb6.png">|
|:-:|

これでドメイン名に対するアクセスを制御する準備ができました。
次に、（もしドメイン名を取得していたら）ドメインにアクセスが来た際にアクセスを流す先を指定します。
「レコードセットの作成」をクリックします。

|<img width="100%" alt="スクリーンショット_2020-02-24_21_52_12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/9c238871-47cc-72dd-3a29-394b3f391c28.png">|
|:-:|

「名前」や「タイプ」はそのまま、「エイリアス」を「はい」にし、「エイリアス先」を先程作成したALBとして「作成」します。
これにより、ドメイン名を取得していれば、ドメイン名に対するアクセスが作成したALBに流れます。

|<img width="1764" alt="スクリーンショット_2020-02-24_21_55_48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/45e81bc5-5d6a-2ec4-a6cd-ede000961c31.png">|
|:-:|

これで今回の構成は完了です！

|<img width="100%" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/7fd7ee24-6996-3101-49ed-f81c59dc7e2c.png">|
|:-:|

# おわりに

業務ではほとんどTerraformというインフラ構成ツールを用いてAWSの構成を行っていたので、改めてコンソール上で構築していくのは逆に新鮮で、かつより深く理解することができました。
今回はIAMなどは使わなかったのでこれがベストプラクティスではないと思いますが、セキュリティグループなども用いてそれなりにセキュアには作れたかなと考えています。
AWSは今後も使っていく機会が多いと思いますので、色々と学んでいきたいです。

# 参考文献

以下のサイトを参考にさせていただきました。
ありがとうございました！

[AWSでWebサーバー構築！VPC設計に必要なIPアドレスとサブネットの基礎知識（第1回）](https://miyabi-lab.space/blog/8)
こちらの第1回 ~ 第5回

[AWSのEC2で行うAmazon Linux2（MySQL5.7）環境構築](https://qiita.com/2no553/items/952dbb8df9a228195189)

[RDSへEC2から接続する方法](https://hacknote.jp/archives/39927/)