AWSで基本的なブログサービスを構築する

<h2>記事の目的</h2>
　AWS CloudTechでEC2,VPC,RDSについて学びました。
　そこで基本的なブログサービスを構築(シングル構成)して、より理解を深めようと思います。

<h2>構成図</h2>
　構成図は以下の通りです。
　![AWS-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2111855/4b89ced3-9d0d-b8a9-4c10-2662331ca1a4.png)

<h2>大まかな手順</h2>
　手順の流れとしては以下となります。

　1. VPCの作成(サブネットも作成する)
　2. 作成したPublicサブネット内に、EC2インスタンスを作成する。
　3. ACLやルートテーブルを適切に設定する。
　4. VPCにインターネットゲーウェイを作成、アタッチ。
　5. SGを作成し、PrivateサブネットにRDS(エンジン:MySQL)を設置。
　6. EC2インスタンスにPHPやWordpressといった必要なものをインストールする。
　7. ブラウザよりIPアドレスで接続し管理画面が閲覧できることを確認する。

<h2>注意事項</h2>
　以下のことに注意する。
　・AWS操作時には、RootアカウントではなくAdministratorアカウント(Root以外のアカウント)で作成のこと。
　・事前にCloudWatchで利用料金のモニタリングができるように設定しているが、作成したインスタンスなどをそのままと放置すると無駄に利用料金がかかるため、不要になったものは都度削除する。

<h2>実際に作成していく</h2>
■VPCの作成
　今回サブネットを4つ作成するため、ネットワークアドレスのレンジは10.0.0.0/21とする。
　作成したVPC内に、サブネットを作成する。
　作成するサブネットは下記の計４つで、PublicとPrivateのペアを同じAZ内に作成する。
　(今回はAZ1aとAZ1cの2つのAZにサブネットを作成した)
　・Public Subnet
　　　10.0.0.0/24
　　　10.0.1.0/24
　・Private Subnet
　　　10.0.2.0/24
　　　10.0.3.0/24
　ここで複数AZにサブネットを作成する理由としては、後工程のRDSの作成時に必要となるから。

■PublicサブネットにEC2インスタンスを作成
　以下がEC2作成時のポイント
　- 作成するインスタンスを設置するネットワークは、先ほど作成したPublicSubnet
　- 自動割当パブリックIPは有効
　- SGは、デフォルトのSSH 22番ポートに追加して、HTTP 80番ポートを許可する設定をつける
　
■インターネットゲートウェイを作成
　　インターネットゲートウェイを作成し、先程作成したVPCにアタッチする。
　　EC2インスタンスを設置してあるPublicサブネットのRouteTableの設定を確認し、VPCにアタッチしたインターネットゲートウェイに「0.0.0.0/0」でデフォルトゲートウェイを設定する。(デフォルトではLocalの宛先があり、宛先IPがLocalのより細かいものが指定されている場合はこちらのルートが利用される。)
　　※PrivateSubnetの方にもさっき設定したRouteTableが適用されてしまうため、新たにRouteTableを作成しこちらをPrivateに適用し直すことが必要。(これをしないとPrivateSubnetが直接インターネットゲートウェイを通って通信できてしまう。)

■一旦EC2への接続が可能か確認
terminalから以下のコマンドでssh接続し、接続可能かを確認する。

```bash
ssh -i 利用するPemキーのパス ec2-user@EC2のパブリックIPアドレス
```

また、Pemキーはファイルの権限が適切(400)でないと、利用できない。(調べた記事だとセキュリティの観点からこうなっているみたいです。)
そのため、以下のコマンドで設定を変更する。

```bash
chmod 400 Pemキーのパス
```

■RDSの作成
　RDSの作成には以下の条件下であることが必要
　- サブネットグループが必要(複数のサブネットをグルーピング)
　- サブネットグループが複数AZにまたがっていること
　そこでサブネットは作成しているため、RDS作成前にサブネットグループを作成する。
　1. 対象のAZを選択。(今回はAZ1aとAZ1c)
　2. 両サブネットのPrivateSubnetを選択し作成する。

　RDSを作成する。(ここでの設定はWordpressの設定時にも必要な情報)
　1. エンジンオプションはMySQL
　2. テンプレート：開発/テスト
　3. マスターユーザー名：wordpress
　4. パスワード設定
　5. DBインスタンスサイズ：バースト可能クラス(db.t2.micro)
　6. 設置するVPCとサブネットグループはさっき作成したものを選択。
　7. パブリックサクセスはなし。(セキュリティ面の問題で基本的にDBを公開することはない)
　8. SGの新規作成を選択しておく。
　9. DBの名前については任意のものをつけておく。
　※今回はシングル構成のため、スタンバイインスタンスは作成しない。
　※RDSのコストについては、月間の概算コストが表示される。(RDSは停止しても大丈夫だが、7日経つと自動起動されてしまうため、注意しておくこと)

　さっき新規作成したSGを編集する。
　・EC2インスタンスからのみの接続を許可する設定にする。
　・インバウンドルールの設定より、EC2のあるSGからのみの接続を許可する設定する。

　このとき以下のようなエラーメッセージがでた。
![スクリーンショット 2021-10-14 0.02.38.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2111855/9826ca3e-0465-53b0-1caa-9dfdd8eb6ac0.jpeg)

　そこでSGを新規作成(設定は上記のもの)し、SGをこちらに適用し直す。

■Wordpressが正しく動作する環境をEC2に作成
　以下のコマンドを入力し、PHPやWordpressをインストールする。

```bash
#ルートユーザーになる
sudo su -

#EC2インスタンスにインストールされているソフトウェア（パッケージ）を最新に
yum -y update

#PHPのインストール
#amazon-linux-extrasコマンドはAmazonLinux2で特定パッケージを管理する時に利用
amazon-linux-extras install php7.2 -y

#その他必要なものを随時インストールする
yum -y install mysql httpd php-mbstring php-xml gd php-gd

#EC2インスタンスがWebサーバーとして起動するようにsystemctlで設定
systemctl enable httpd.service
systemctl start httpd.service

#Wordpressパッケージのダウンロード
wget http://ja.wordpress.org/latest-ja.tar.gz ~/

#tarボールを展開し、展開したフォルダを特定ディレクトリ(/var/www/html/)へコピーする
tar zxvf ~/latest-ja.tar.gz
cp -r ~/wordpress/* /var/www/html/

#権限の変更(ユーザーとグループ)
chown apache:apache -R /var/www/html
```

■実際にちゃんと動作するかを確認
　Webブラウザを立ち上げてEC2インスタンスのパブリックIPを指定して接続。
　Wordpressの初期設定画面が開くため、必要情報を入力すると完成。

<h2>感想</h2>
 実際に構築するとそれぞれのサービスの繋がりがみえやすくて、やってよかったと思いました。
 まだ理解のあまいところがあるため今後構築していく中で、AWS Well-Architectedに沿った構築ができるようにしていきます。
 また今回エラーがでましたが、対応方法などを調べて解決できたのは素直にうれしかったです。

<h2>さいごに</h2>
___
　この記事はAWS初学者を導く体系的な動画学習サービス
　「AWS CloudTech」の課題カリキュラムで作成しました。
　https://aws-cloud-tech.com
___