AWS完全初心者がスケーラブルウェブサイトを構築してみた話

## はじめに
こんにちは。Tsukasaです！
今日はAWS公式ハンズオンのスケーラブルウェブサイトを構築してみた事について記事にしてみようと思います。
後程紹介しますが、AWS公式サイトでは無料のハンズオン学習サイトが約30個あります。
AWSの職員の方が動画で解説してくださり、それに合わせてハンズオン学習を進めていく形になります。
動画ですので、わからないところがあったら、戻ったり、止めることもできるので便利ですね。
それでは、早速見ていきたいと思います！

## 今回やること
今回やることはスケーラブルウェブサイトを構築することになります。
ハンズオンの資料としては以下のものを使用しました。

https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-Scalable-2022-confirmation_386.html

今回は下記の構成図のようなスケーラブルウェブサイトを構築することがゴールとなります。
VPCを作成して、EC2とRDSを2つ作って、可用性を上げる。
認定試験でもよく出てきそうな内容ですよね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/2f65aadc-1576-4f84-a300-49e86571b2a2.png)

今回やることは主に以下の通りとなります。
**VPCの作成**
**EC2の作成**
**RDSの作成**
**ロードバランサーの作成**
それでは1つずつ見ていきたいと思います。

## VPCの作成
まずはVPCを作成します。
VPCとはVirtual Private Cloudの略です。
VPCはAWS上に自分専用の仮想ネットワークを作るための仕組みです。
EC2やRDSなどの基盤サービスを配置するために必要になります。

コンソールからVPCを検索し、開いたら、中央付近上側にあるVPCを作成というボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/9e6c0853-9346-4208-a754-b1c984bcda8f.png)

開いたら、必要事項を記入していきます。
基本的にはこちらのキャプチャの通り入力していただければ大丈夫です。
VPC名などはわかりやすいものが良いと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/62316c35-c729-406e-942f-c7c67eb8791e.png)

画面をスクロールしていくと、アベイラビリティーゾーンの数を選択できます。
今回は2つです。
その際に第1アベイラビリティーゾーンと第2アベイラビリティーゾーンを選択します。
東京リージョンを使う人が多いと思うので、それぞれap-northeastを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/23abbca8-866a-4e87-a339-013384e6f7b9.png)

その後、サブネットのCIDRブロックをカスタマイズします。
今回はパブリックサブネットとプライベートサブネットが２つずつ、合計で４つ必要になるので、
10.0.0.0/24~10.0.3.0/24まで設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/51a72147-a670-49f2-997d-87bc78ef6665.png)

その他はデフォルトの設定のままで、一番下まで行き、VPCを作成ボタンを押し、VPCを作成します。
作成されると以下の画像のようにVPCの詳細が見れます。
サブネットが４つできている事がわかると思います。
これで、EC2とRDSを置くための土台が完成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/663a15d3-ab96-4192-accf-4da8521b87c9.png)

## EC2の作成
次はEC2を作成します。
EC2は一言で言えば仮想サーバーです。
Webアプリを管理し、DBなどと連携する役割を持ちます。

コンソールからEC2を検索したら、下記のインスタンスを起動をクリックして、インスタンスの作成を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/ff7752ee-4402-4fb8-92a5-c6ade063aacc.png)

まずは名前です。こちらもVPCと同様でわかりやすいものを付けてください。
マシンイメージ(AMI)ですが、今回はAmazon Linux2 AMIを選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/9aa399b5-689d-4f34-a0b2-c060432d8d15.png)

VPCは先程作ったVPCを選択します。
パブリックIPの自動割り当てですが、下記キャプチャでは無効になっていますが、有効にします。
セキュリティグループ名もわかりやすい名前を付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/173c0640-01d4-42c4-9b63-fe264c6a4979.png)

インバウンドセキュリティグループのルールですが、こちらはデフォルトでSSHが指定されています。
セキュリティグループルールを追加をクリックして、HTTPを追加します。
この際のソースは0.0.0.0/0を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/5f2bcf33-9ae4-4a04-9bc4-086bf503b32e.png)

高度なネットワーク設定を開いて一番下のユーザーデータに今回使用するWordpressのコードを入力します。
こちらはハンズオン資料にありますので、そちらでご確認をお願いします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/d53081ad-9d11-4f09-bce3-3dc97e1a3776.png)

必要事項を全て入力して、インスタンスを起動をクリックすると、インスタンスが起動されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/265fc603-82f0-4629-91d5-3f6e5fa6025c.png)

## RDSの作成
RDSを作成する前にまずはセキュリティグループの作成を行います。
そもそも何故セキュリティグループが必要かと言うと、RDSはプライベートサブネットにあります。
これはRDSをインターネットから直接アクセスさせないための基本的なセキュリティ対策です。
ですが、アプリ側からの接続は必要ですよね？
今回WebアプリはEC2にあり、EC2はパブリックサブネットにあるため、アプリから接続できるようにするためにセキュリティグループの作成を行います。
セキュリティグループの作成はEC2の画面から作成が可能です。
左側にセキュリティグループというタブがありますので、そこをクリックして、右上にあるセキュリティグループの作成をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/4cabfaa5-1a4f-4df6-beed-f36ac988f3b4.png)

セキュリティグループ名を付けて、説明を書きます。
内容は下記のキャプチャを参考にしていただけたらと思います。
VPCは既に作成済みのものを選択します。
インバウンドルールは、今回はMySQL/Auroraを選択します。
ソースは、先程EC2で作成したセキュリティグループ名を選択します。
後は全てデフォルトのままで、一番下まで行き、セキュリティグループを作成ボタンを押して、セキュリティグループができたことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/ee4c2134-acd5-4016-9d7a-df72b9faafd6.png)

セキュリティグループが完成したら、ここからRDSの作成を行います。
コンソールからRDSと検索して、開いたら、右上のDBサブネットグループを作成をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/d8758398-4af2-4b2b-838d-5e6e1802b8f3.png)

厳密にはここではDBの作成ではなくDBサブネットの作成になります。
DBサブネットとはRDSを使用する際にDBインスタンスをどのネットワーク上に配置するかを決めるサブネットの集合となります。
その上で下記の設定を行います。
名前を付けて、説明を記入します。
VPCは作成済のものを選択します。
サブネットを追加からアベイラビリティーゾーンを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/d2509f9c-babf-4b63-90d4-27d8d9b2422e.png)

サブネットはプライベートサブネットの2つを選択します。
後はデフォルトの設定で。作成ボタンを押して、DBサブネットグループを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/5c8069b3-1d5b-4891-877f-1d8b39398325.png)

DBサブネットグループが確認できましたね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/2f98a7c3-9392-4112-b931-aa43c90d2fe3.png)

そしたらここから実際のDBの作成に入ります。
画面左側のデータベースを選択して、画面右上にある、データベースの作成をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/d61aef03-2f70-4dd9-9852-9fd438e53f7f.png)

今回はMySQLを使用しますので、MySQLを選択します。
![スクリーンショット 2025-05-06 17.43.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/8c0f628f-594e-4239-977f-74ec77f3f2c6.png)

エンジンバージョンはデフォルトのままで大丈夫です。
テンプレートでは今回はハンズオンなので一番右の無料利用枠を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/01af2e9f-1963-4f0a-b4f6-368555efa88f.png)

設定は下記のようにしていただければ大丈夫です。
DBインスタンス識別子とマスターユーザー名も自由に付けて大丈夫です。
パスワードを設定する必要があるので、忘れずに覚えられるものにしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/841470f1-388a-4ed9-b184-5fb1cb811a24.png)

セキュリティグループとアベイラビリティーゾーンを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/9e733b09-4ca5-4872-97ec-fa92f2efb232.png)

データベース名を付けます。
今回はWordpressにしました。
後はデフォルトの設定で大丈夫です。
一番下まで行き、データベースの作成ボタンをクリックして、データベースを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/82aea514-87e8-479b-8f89-ea1dc79f27f6.png)


## ELBの作成
ELB(Elastic Load Balancer)とはアプリケーションへのアクセス(リクエスト)を複数のサーバーに分散させることで、負荷を軽減し、可用性やスケーラビリティを高めるための機能です。
今回はEC2サーバーを２つ作成しますので、ELBを作成することで２つのEC2サーバーに負荷を分散させることができます。
ELBを作る前にELBのセキュリティグループを作成する必要があります。
セキュリティグループの作成はEC2の画面からできるんでしたよね。
セキュリティーグループの画面で必要事項を記入していきます。
インバウンドルール実際にアクセスするポート番号とIPアドレスを指定します。
HTTPを選択して、ソースはAnywhere-IPv4を選択します。
後はデフォルトで大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/8c125e17-5a75-4c98-b5c2-7fa33ea2526a.png)

セキュリティグループが完成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/fe17c432-c253-41ec-b5d9-e571067b5aaf.png)



続いてターゲットグループを作成します。
ターゲットグループとは、ELBがトラフィックを分散する対象のEC2インスタンスやサービスのグループのことです。
ターゲットグループ = ELBの送り先リストのことです。
ELB自体はどこにリクエストを送るかを知りません。
そこで、「このグループに属するサーバーたち（ターゲット）に振り分けてね」という設定をするのがターゲットグループです。ここで言うサーバーとはEC2インスタンスのことになります。
要するに振り分けるためのEC2インスタンスをここで登録するのです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/bea7e58b-a2f9-4206-ab45-4ad82665b07a.png)

下記のように必要事項を記入します。
VPCは作成済のものを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/9917bba1-0423-44c2-a239-5f15ecad5e39.png)


ヘルスチェックパスはハンズオン資料に添付ファイルとしてありますので、そちらをご確認ください。
![スクリーンショット 2025-05-06 18.03.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/6fd3e44d-b44e-476d-bfc8-4a9c1a1e4fc9.png)

紐付けたいEC2インスタンスを選択します。
選択したら、ターゲットグループの作成ボタンをクリックして、ターゲットグループを作成します。
![スクリーンショット 2025-05-06 18.04.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/c2dee68c-aeda-4ee4-84fb-b03962bbd8a9.png)


セキュリティグループとターゲットグループが完成したらロードバランサーを作成します。
![スクリーンショット 2025-05-06 18.05.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/2d1d46f1-c0b3-49ba-ac00-3bb371eb9638.png)


今回はALBになりますので、一番左のApplication Load Balancerを選択します。
![スクリーンショット 2025-05-06 18.06.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/4886892c-e23c-4c9b-bd67-31fd100fa557.png)

下記のように必要事項の記入と選択を行なってロードバランサーを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/f9a51f13-fb4b-41cc-a412-2edc821dcc64.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/2fdd2b7a-8b50-4106-85f1-2dab406b9250.png)


## Wordpressの初期設定
こちらはハンズオン上ですと、初期設定をする必要がありますが、こちらでは割愛させていただきます。

上記の設定が全てうまくいくとこのようなWordpressのサイトにアクセスできるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/e8f1bcae-1a32-4386-8f61-6af7edf10ff3.png)


## AMIの作成と作成したAMIから2つ目のEC2インスタンスの作成
AMI（Amazon Machine Image）は、EC2インスタンスのテンプレート（ひな形）です。
言い換えると、OSやアプリの状態を丸ごと保存して再利用できる仕組みです。
この仕組みを使って、2つ目のEC2インスタンスを作成しようと思います。
先程EC2とRDS、ELBを作成しましたが、現状では下記のような状況です。
EC2インスタンスが2つないといけないのですが、まだ1つしかありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/4762fd0c-675b-4f5f-8745-9d82732525e2.png)



EC2インスタンスの画面を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/e16bf30a-1722-4f2f-b9b8-44610b411b76.png)

既に作成済のEC2インスタンスを選択し、インスタンスの状態から、イメージとテンプレートを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/d67611dc-d16b-42c1-93a6-e3d1063c07fb.png)

必要事項を記入して、イメージを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/ca3c04c7-1444-4dae-8a0c-5d0426e4103b.png)


画面左側からAMIを選択すると先程作成したイメージが表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/8381af52-b940-4fdf-9615-986da9210844.png)

イメージを選択して、AMIからインスタンスを起動をクリックします。
これで2つ目のEC2インスタンスが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/8a26fd77-4ce7-4837-a352-3837f10e7a49.png)

1つ目のEC2インスタンスを作成した時と同じように必要事項を記入していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/d7e4e461-9a09-4b86-8b64-7276ae892046.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/93df3211-97ac-4a08-9887-b8cb3742ec4d.png)

1つ目のEC2インスタンスを作成した時には、ユーザーデータにWordpressのコードを入力しましたが、今回は不要となります。何故なら1つ目のEC2インスタンスの情報を持ったAMIからインスタンスを作成するので、既にWordpressのコードは登録済だからです。
一番右下のインスタンスを起動をクリックしてインスタンスを起動させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/27283898-e107-45d3-8f36-34bf27736bd9.png)

これで2つ目のEC2インスタンスが完成しました。
しかし、これだけでは、せっかく作ったEC2インスタンスが使えません。
どうすれば良いのでしょうか？
そうです。ターゲットグループを作成して、ELBに紐づける必要があるんですよね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/8b72f128-cd74-4972-bec7-b4dd4b3e84cc.png)

ターゲットグループの作成方法は上記で紹介したので、こちらでは割愛いたします。
成功すると下記のようになります。
![スクリーンショット 2025-05-06 20.26.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/2603b9a7-a02e-4d1a-b30e-de34eb2b5c4c.png)


## RDSのマルチAZ配置
EC2インスタンスも2つできましたが、何か物足りないですよね？
そうです。RDSがまだ1つしかありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/8b72f128-cd74-4972-bec7-b4dd4b3e84cc.png)

ここでは下記の図のようにRDSをマルチAZ配置にする必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/c4a026a8-a2b9-40de-858e-42bc7833b852.png)

RDSを検索して、データベースから先程作成したデータベースを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/3027db79-3a01-4260-b11f-26d747c6fd4e.png)


可用性と耐久性の項目で
スタンバイインスタンスを作成するを選択します。
デフォルトではスタンバイインスタンスを作成しないでくださいにチェックが入っているので、それを変えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/2167bce3-a2cb-4d4b-a497-a5b69b88f1be.png)

変更のスケジュールの項目ですぐに適用にチェックを入れます。
その後右下のDBインスタンスを変更ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/ea42e901-6c28-42cb-bf4b-c4d2b92bbb8a.png)

適用されるまで数分かかります。
マルチAZの項目がありとなれば、成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/a50eb662-183c-47f4-bd82-e85181c48659.png)


## Webシステム全体の可用性の確認
最後に可用性の確認を行います。
今回EC2インスタンスが2つあるので、片方を停止した上でWordpressが稼働しているかどうかの確認を行いたいと思います。

EC2インスタンスの画面から、停止したいインスタンスを選択して、インスタンスの状態からインスタンスを停止をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/da06611a-048a-4346-b322-c994892a22fd.png)

インスタンスが停止済となりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/56ceb537-82d5-4996-a162-5743c58aa1f3.png)

その上でWordpressが動くか確認します。
おーー！！しっかり動いています！
今は一時的に敢えてEC2インスタンスを停止しましたが、もし何らかの理由でサーバーが停止しても
2つのアベイラビリティーゾーンに展開しているので、問題なく動きそうですね。
可用性の高いシステムの完成です！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/71c40b31-f123-41c2-9b11-780fb3b1a7a9.png)


## 終わりに
いかがでしたでしょうか？
やっていることとしては難しいことではありませんが、設定したり、インスタンスを作ったりとやることは沢山ありました。
ハンズオンでは動画を見ながら進める形ですが、正直手を動かしている時は、そっちに夢中となっていたので、全てを理解することはできませんでした。
しかし、今こうやってアウトプットを言語化することで、曖昧だった部分も理解できたように思えます。
セキュリティグループの作成やターゲットグループの作成等は今まで曖昧な理解でしたが、今こうやって記事にすることで何故それが必要なのか？を理解できました。
AWSを理解する上でハンズオンは必須ですが、ハンズオンの後に何かしらの形でアウトプットすることが更なる知識の定着に繋がると感じました。これに認定試験の勉強までやればもう鬼に金棒ですね！
特に初心者の方はこの無料のハンズオンに是非挑戦してみてください！