AWS CloudFormationでWebシステムを構築

# 概要
- この記事は、KDDI Engineer&Designer Advent Calendar 2022の14日目の投稿です。
- 内容は、AWSが提供している””[AWS Hands-on for Beginners] AWS環境のコード管理 AWS CloudFormationでWebシステムを構築する””の紹介記事です。

> 引用：AWS,"AWS Hands-on for Beginners - AWS環境のコード管理 AWS CloudFormationでWebシステムを構築する",https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-cfn-2022-reg-event.html?trk=aws_introduction_page 

# お品書き
- 本ハンズオンで何をしたか
- IaCとは
- なぜコードで管理する必要が？
- AWS CloudFormationとは
- CloudFormationでWebシステムを構築

# 本ハンズオンで何をしたか
- AWS CloudFormationについて学びました。
- リソースを定義したテンプレートから、VPC/ELB/RDB/EC2(WordPressをホスティング)から成るWebシステムを構築しました。

# IaCとは
- IaC(Infrastructure as Code)は、手動のプロセスではなく、コードを使用してインフラストラクチャの管理とプロビジョニングを行うことと定義されています。
- IaCを使用すると、インフラストラクチャ使用を含む設定ファイルが作成され、設定の編集と配信が容易に、また、毎回同じ環境をプロビジョニングすることが可能です。

# 何故、コードで管理する必要があるのか
構成がコードで管理されていない場合のデメリットを考えてみましょう。
コード管理されていないと・・・
- 構成に時間がかかり、再現性に乏しく複製が困難
- アプリケーションを含むワークロード全体の品質を保つことが困難
- イベントへの対応がコード管理されていないと、人為的ミスの発生や対応内容の一貫性を担保できていないなどの問題が発生

というように様々な部分でアーキテクチャをコード管理した方が良い理由が見えてきます。解消したいですよねこれらの問題は。では、次にWell-Archetectedフレームワークにも構成のコード管理をすべきであろう理由について記載があるので少し見てみましょう。

### AWS Well-Architected Frameworkとは
クラウド上でワークロードを設計および実行するための主要な概念、設計原則、アーキテクチャのベストプラクティスについて説明したもの。
全ては割愛しますが、その中に、運用の優秀性というものがあります。これは、ビジネスの価値を提供するための監視の機能と継続的なサポートプロセスの改善機能と定義されています。さらに、この運用の優秀性を形作るものの一つとして、運用をコードとして実行するというものがあります。コードを使った運用のポイントは以下となっています。
1. コードで全ての構成を定義
   →同じ環境を迅速に、繰り返し作成可能
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754596/981283fa-c99c-2096-018f-562f1938f915.png)

2. イベントに対してスクリプトで対処
   →自動的に同じ処理を繰り返し実施可能
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754596/4cb7fedb-fbc6-2c2f-b05a-e81ba2f5e1ad.png)

3. アプリケーションと同じ手法でコードを管理
   →コードと作成した環境の品質を担保
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754596/a31070db-ce0e-7c2a-6194-70163c8a7be7.png)


これらの理由から、構成をコード管理する妥当性が見えてきました。

### AWSにおけるIaCを実現するサービス
下記のもの以外にも似たようなサービスはありますが、本ハンズオンでは、AWS CloudFormationに着目しています。次章よりCloudFormationの概要を説明しつつ、Webシステムの構築に入っていきます。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754596/80cdda73-a3a3-bbb5-2313-0d02eca6a3f3.png)


# AWS CloudFormationとは
簡単にCloudFoamationの説明をすると以下になります。
- AWS環境のコードによる管理を実現するサービス
- テンプレートとして定義した環境を作成/変更/削除できる
    →テンプレート：リソースやパラメータを定義、スタックの設計図
                 例) EC2の起動設定やDBの通信先情報など
- JSONもしくはYAML形式でスタックの情報を記載する
    →スタック：AWSリソースの集合、スタック単位でリソースを管理可能
- リソースに依存関係がある場合は、CloudFormationが自動的に解決してくれる
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754596/14bd28c9-0042-c94a-de49-5aab42365b13.png)

# AWS CloudFormationでWebシステムを構築
実際にCloudFormationを活用してWebシステムを構築していきます。
#### 概要
- AWS Cloud9(クラウドベースのIDE)でスクリプト編集およびデバッグ
- 以下のアーキテクチャを手動ではなく、CloudFormationにより構築
- 単純なweb2層構造
- 単一リージョン

最終的にはこれを作ります。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754596/4f91e0e1-e716-6f11-4a47-4a01fac5d5b0.png)

#### 手順
1. VPC用のスタックを作ります。東京リージョンにVPCを展開できるようにパブリックサブネットとプライベートサブネットを定義します。
2. テンプレートを定義し、ELB、RDSをデプロイします。ELBはアベイラビリティーゾーン内の登録済みのリソースにリクエストをルーティングするようになります。
3. EC2インスタンス用のスタックを作成し、EC2インスタンスをパブリックサブネットにデプロイし、WordPressをホスティングします。（本ハンズオンでは、EC2インスタンスとRDSは1台構成となります）スタックはテンプレートを編集することで作成します。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754596/c103d889-e10e-d116-5f62-c3a544b91618.png)

テンプレートは、統合開発環境であるCloud9でyaml形式で定義していきます。テンプレートを作成できたらAWS CLIでスタックを作成/更新するコマンドを叩いてあげます。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754596/c3bc4fd4-0bf4-9b15-b1c6-b4976a24cbb5.png)

これで、CloudFormationでWebシステムを構築することができました。

####

# むすび
- 今回はアドカレの14日目の記事として、AWSハンズオンにおけるAWS CloudFormationを用いたWebシステム構築について紹介しました。
- 他にも様々なハンズオンを受講しているので、紹介していきたいです。

# 引用
1. AWS,"AWS Hands-on for Beginners - AWS環境のコード管理 AWS CloudFormationでWebシステムを構築する",https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-cfn-2022-reg-event.html?trk=aws_introduction_page 
2. RedHat,"IaC (Infrastructure as Code) とは", https://www.redhat.com/ja/topics/automation/what-is-infrastructure-as-code-iac
3. AWS, "AWS CloudFormationベストプラクティス", https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/best-practices.html