AWS CloudFormation Master Class を受けてみた①

##はじめに
今回は、 Udemy で Stephane Maarek 氏 が提供する「 [AWS CloudFormation Master Class](https://www.udemy.com/aws-cloudformation-master-class/learn/v4/overview) 」というコースを受講しました。
こちらのコースの概要を何回かに分けて紹介していきますので、よろしくお願いします。

##AWS CloudFormation Master Class

###About AWS and CloudFormation

AWS と CloudFormation は、それぞれ以下の特徴があります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/21ac12d3-3c1a-d170-aca1-614a896a9d57.png)

- AWS はクラウドコンピュータと呼ばれるもの
- 従量課金で簡単に利用できるサーバやサービスを提供している
- 世界中で利用されており現在は50以上ものサービスが用意されている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/49aa7547-2dc5-f0bf-8b87-87655e81f0f8.png)

- AWS インフラ環境について宣言的な記述が可能なサービス
- 例として以下の様な記述が可能
 - セキュリティグループを用意して欲しい
 - このセキュリティグループを使用している EC2 を2台用意して欲しい
 - これらの EC2 用に固定 IP を用意して欲しい
- そしてCloudFormation は上記の内容に対して正しい順番で正確に構築が可能


### CloudFormation のメリット

CloudFormation を利用するメリットとして、以下が挙げられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/65e68184-9bbf-bfbf-fa6c-0c240df0fc35.png)

- コードでインフラ環境を構築
 - 既存のリソースが特に無いため、ユーザ自身で自由にコントロール可能 
 - git を用いてコードのバージョン管理が可能
- コスト
 - 費用が一目で分かる
 - CloudFormation テンプレートを使用することでリソースに対するコストを試算可能


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/bf1a9f8e-c0a4-92a6-f163-c65e23ccff21.png)

- 生産性
 - クラウド環境でインフラの構築と破壊が可能
 - 宣言型プログラム（細かい指示が不要）
- 複数のスタックやアプリ、レイヤーを構築可能
 -  VPC スタック
 -  ネットワークスタック
- わざわざ1から作る必要なし
 - ウェブを探せばお目当てのテンプレを見つけられる   


###CloudFormation vs Ansible / Terraform

Ansible や Terrafform と比較した場合でも、以下の理由から CloudFormation を利用することをおすすめします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/9778db70-7b87-78d0-22b0-08f7a1a1f9b3.png)

- Ansible と Terraform は CloudFormation と比べてユーザのスタックを完全に利用できない
- Ansible と Terraform は新サービスや API の登場の度に長時間のアップデートが必要となる
- それに対して CloudFormation はAWS から常に最新のサービスや情報をアップデートしている


###Download the code
本コースでは、 Cloudformation を利用するにあたって事前にコードをダウンロードする必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/eff66c6c-0a71-4d6f-1759-b117ca2e42a6.png)
URLから飛んだ先でコードをダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/efae5928-bcb5-4b92-639d-bb7ea7306b55.png)
ダウンロードしたら完了です。
その他の項目は任意なので、必要であればそちらもどうぞ。


##Introductory Example
今回は、CloudFormation を使って以下の構築を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/2b8b674f-e033-fda4-3cae-2c7d6671ff73.png)

- EC2 インスタンスの作成
- 固定 IP を追加して作成
- 作成した EC2 にセキュリティグループを2つ追加


###EC2インスタンスの作成
それでは、始めましょう。
※コース内で Region を N.Virginia と指定しているため、ここでも Region は N.Virginia を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/6b822126-0586-adfc-3f00-e23439ba15a5.png)
AWS のコンソール画面より、CloudFormation を選択します。
「Create new stack」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/a065961f-47b1-b03d-7f5d-92681742cbe4.png)
CloudFormation のテンプレートの選択方法は、大きく分けて2通りあります。

- テンプレートのデザイン
- テンプレートの選択
 - サンプルを選択
 - Amazon S3 にテンプレートをアップロード
 - Amazon S3 URL を選択

今回は、Amazon S3 にテンプレートをアップロードします。
先ほどダウンロードしたコードから、「0-just-ec2-yaml」YMAL ファイルを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/8c6ed35c-38ca-bf7b-10dc-f3b877cc40f9.png)
ファイルを選択したら、スタックの名前を入力して次へ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/62c51a31-b8b2-d1ee-4f6d-549671a4c41a.png)

- Key に「 Course 」と入力
- Value に「 Udemy 」と入力

入力が完了したら、次へ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/70996e09-487f-1a19-56bc-c07218ec0bcb.png)
テンプレートの内容などを確認し、問題が無ければ「 Create 」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/2bbf9aa2-2d15-4dce-9f56-5d7711d37ae7.png)
作成が完了すると、スタックが追加されているのが分かります。
「 Event 」タブを選択するとイベントの履歴と詳細を知ることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/c91b6a63-ed81-2323-c5f7-2c5d1ae75379.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/ec01155f-5dfc-80d3-52d4-7e365867a899.png)
「 Resource 」タブを選択するか、EC2 サービスの画面に飛ぶことで、作成された インスタンスを確認できます。
ただ、今回のスタックでは固定 IP やセキュリティグループの設定ができておりません。
CloudFormation に戻り、固定 IP とセキュリティグループの設定も行いましょう。


###固定 IP とセキュリティグループの設定
固定 IP とセキュリティグループの設定をするため、作成したスタックを更新します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/41f0e8c7-9e6a-a687-8f09-830e3951cba4.png)
作成したスタックを選択した状態で、「アクション」→「スタックの更新」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/fccf97e5-e2b3-1ec5-e343-dd14ed91ccd3.png)
テンプレートの選択で、「 1-ec2-with-sg-eip-yaml 」のファイルを選んだら、確認画面にまで進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/be95ec04-1acb-b893-b757-9178bceb830c.png)
確認画面で、今回のスタックの更新による変更内容が表示されます。
内容を確認して、問題が無ければ「 Update 」を選択しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/2c489b74-b7f9-9287-17b1-41dcbf2b8131.png)
スタックのイベント履歴を確認すると、セキュリティグループなど、先ほどよりも履歴が増えているのが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/97d76ed0-4f1f-00c8-0fb2-3d83bc8d2b34.png)
リソースタグを選択すると、EC2 以外にも固定 IP などが作成されていることが確認できます。
※先ほど作成した EC2 インスンタンスは、スタックの更新によって削除されています（イベントログからも確認できます）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/37cbe47a-bd36-8dca-3a23-59d8ffbc468f.png)
スタックの削除を行うと、このスタックで作成した全てのリソースを削除することができます。


###まとめ
今回学んだ CloudFormation の内容についてまとめました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/5c71e297-235f-ea57-8fef-00107eb604b4.png)

- テンプレートを参照する際は、S3 にアップロードしている必要がある
- 既存のテンプレートを残した状態で、テンプレートの更新はできない
- スタックは名前で認識されている
- スタックを削除すると、スタックで作成したリソース全てを削除することになる

##おわりに
以上で、最初の CloudFormation についての簡単な説明とその機能についての説明は終了です。
今回の内容だけでも、CloudFormation の便利さを知って頂けたかと思います。
次回はより実践的な CloudFormation の活用になっていきます。