【AWS】CloudFormtionでブログサービスを構築してみた(概要編)

# 01.はじめに
マネジメントコンソールで構築したブログサービスをコード化したいと思い、構築してみた。
簡潔に言うとEC2にWordpressをインストールして、ブログサービスを公開するものである。
また、障害時にはSorryページを配信する。
なお、今回使用したEC2のAMIとRDSのスナップショットは[こちら](https://qiita.com/1k5/items/32bbe213596aabcf3a59)で取得したものを使用している。
一部コード化できていない部分はあるが(後述)、概ねCloudFormtionで構築している。
なお、一つの記事にすると長すぎるので下記要領で分割して記事を公開する。

・[【AWS】CloudFormtionでブログサービスを構築してみた(01.Network編)](https://qiita.com/1k5/items/d268697691ef2ef3dd0e)
・[【AWS】CloudFormtionでブログサービスを構築してみた(02.EC2,RDS,ALB編)](https://qiita.com/1k5/items/5acca0ee627ec37b56da)
・[【AWS】CloudFormtionでブログサービスを構築してみた(03.S3,CloudFront編)](https://qiita.com/1k5/items/a19cb65bb749b985970c)
・[【AWS】CloudFormtionでブログサービスを構築してみた(04.Route53編)](https://qiita.com/1k5/items/96c7874050e4bb9a5127)
・[【AWS】CloudFormtionでブログサービスを構築してみた(05.Waf編)](https://qiita.com/1k5/items/c36c719c8be2803f80bb)

上記に各CloudFormtionのテンプレートを記載する。
本記事では基本設計、セキュリティ要件、障害発生時の通信及びその他備考について記載する。
# 02.構成図
下記の通りである。
![構成図2-WAF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050566/f6f0734a-a3ed-c6a5-0eac-58bd8991fab4.png)



# 03.基本設計
`1. 通常時の通信`
1.クライアントからRoute53で取得したドメインのURLにアクセスする。

2.Route53のAレコードにALBのエイリアスレコードを登録している。
　フェイルオーバールーティングのプライマリレコードとして登録する。
　ALB→EC2に通信が流れるので、Wordpressサービスを返すことが出来る。

`2.障害時の通信`
1.EC2が片方ダウンした場合
　ALBのターゲットグループにヘルスチェックを入れてある。
　ヘルスチェックでレスポンスコード301が返らない場合はALBから切り離される。(縮退稼働)
　301にしているのはALBのリスナールールでhttp通信をhttps通信にリダイレクトしているためである

2.ALB、RDSの障害及びEC2が2台ともダウンした場合
　Route53のヘルスチェックでNGが出る。
　ALBのレコードと同一名のレコードをフェイルオーバールーティングのセカンダリレコードとして
　CloudFrontのエイリアスレコードを登録している。
　そのためS3に配置しているSorryページがCloudFront経由で配信される。

# 04.セキュリティ設計
`1.ユーザからのアクセス方法`

1.https通信のみアクセス可能でhttp通信はhttps通信にリダイレクトさせる。
　ALBのリスナールールで実装している。

2.ALBのIPアドレス直打ちのアクセスが来た場合WAFのWEB ACLを使用して遮断する。

3.wp-admin(wordpressのデフォルト管理画面ログインURL)へのアクセスはALBのリスナールールを使用して
　送信元IPが自宅のIPのみ接続可能でそれ以外は403レスポンスを返す。

4.Sorryページを配置しているS3はCloudFrontにOAIを実装しており
　CloudFrontを経由した場合のみアクセスを可能にする。
　また、ALBと同様にhttps通信のみアクセス可能である。
　(httpアクセスはCloudFrontでhttpsにリダイレクトさせる)

`2.EC2`
1.プライベートサブネットに配置しており、EC2に直接アクセスはできない。

2.SSM→VPCエンドポイント経由で管理者はEC2にログインすることが出来る。(SSHのポートは未開放)


`3.セキュリティグループ`
　下記の設計とする。アウトバウンドは全て許可するので、下記はインバウンドルールの表である。
|対象|プロトコル |Source   |
|:-:|:---------:|:-------:|
|ALB|https http     |0.0.0.0/0|
|EC2|http       |ALBのみ  |
|RDS|Mysql       |EC2のみ  |
|VPCエンドポイント|https       |VPCのCidrのみ  |
# 05.マネジメントコンソールで作業したところ
下記は以下の理由でマネジメントコンソールで実装している

`1.RDSのスナップショット復元`
　→方法自体はありそうだったが、その方法を習得することがどれくらい
　　費用対効果があるのか不明だったため

`2.S3コンテンツのアップロード`
　→バケット作成はCloudFormtionで実施するが、ファイルやフォルダのアップロードは手作業で実施する。
　
`3.usリージョンの証明書取得(CloudFront用)`
　→異なるリージョン同士だと純粋なImportValue関数等が使えず別途配慮がいるため。
　(S3とCloudFrontを同時に設定するテンプレートになっており、S3は東京リージョンで使用する)
　証明書取得自体はすぐ取得できるので今回はマネジメントコンソールであらかじめ取得することにした。

# 06.その他備考
・EC2のディストリビューションはAmazon Linux2を使用する

・RDSはMysqlを使用する

・CloudFormtionのスタック作成、更新はデフォルトVPCにEC2を別途用意して
　そちらからaws cliを用いて実行する

・RDSを冗長構成にすると料金がかなり高くなってしまうので今回はシングル構成にしている。　　

・ドメインはお名前ドットコムで取得している

# 07.所感
・CloudFormtionの関数をまだ上手く使いこなせていないので使いこなせるようにする。(可読性、運用性を高める)

・公式ドキュメントの読み方に慣れてきたら割と書けるようになってきた印象。
　見るコツみたいなのが分かってきた。
　[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html)

・どのくらいの分量を一つのテンプレートにまとめて記述すればいいのか塩梅が難しい。

★次回はこちら
[【AWS】CloudFormtionでブログサービスを構築してみた(01.Network編)](https://qiita.com/1k5/items/d268697691ef2ef3dd0e)