AWS CloudFormation Master Class を受けてみた⑥「Conditions・Metadata・Init について」

##はじめに
Udemy にて Stephane Maarek 氏 が提供している「 [AWS CloudFormation Master Class](https://www.udemy.com/aws-cloudformation-master-class/) 」コースについて紹介していきます。今回の内容は、「 CloudFormation Resources 」と「 Mappings 」についてです。

- これまでの AWS CloudFormation Master Class の記事
 - [その①「 CloudFormation について 」](https://qiita.com/Yoshiyuki03/items/ad21f72dbfb9c9eb32fa) 
 - [その②「 CFnを利用したS3環境の構築 」](https://qiita.com/Yoshiyuki03/items/3ad97bbb8b9d905fa9d9)
 - [その③「 CloudFormation Designer でテンプレートの作成 」](https://qiita.com/Yoshiyuki03/items/0a07133a24fc6806de15)
 - [その④「 Parameters について 」](https://qiita.com/Yoshiyuki03/items/c7506864cf8f6558dc5f)
 - [その⑤「 Resources と Mappings について 」](https://qiita.com/Yoshiyuki03/items/7bf27292df560a0fde6f)


##Conditionals
###Conditionals とは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/9bd583ee-dc22-bc6f-ae8b-24e39afad506.png)
Conditionals は、condition を元に作成されたリソースやアウトプットの構築をコントールすることができます。そして、condition は他の condition やパラメータに影響を与えることができます。

主な Conditions として以下があります。

- 構築環境（開発/検証/本番 など）
- AWS リージョン
- パラメータ値

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/e5e95fd5-be1a-e9ac-eef3-a66f38073093.png)
図のように、Logical ID は、Condition のことを表しており、そして Intrinsic function は以下のように表します。

 - Fn::And
 - Fn::Equals
 - Fn::If
 - Fn::Not
 - Fn::Or

###Hands-On
ダウンロードしたファイルの中にある [0-mappings-ec2.yaml] を開いて、Conditons のコードを見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/c0109fe3-c626-3bf7-056a-e43ddbbc2c84.png)
ここに書かれている内容から、以下のことが分かります。

 - Conditions は「CreateProdResources」である
 - 「CreateProdResources」は「EnvType」が「prod」の場合のみ、「true」であることを表している

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/dbb1c3eb-68cb-9aa4-0e93-82d82a8e9105.png)
この図の内容から、以下のことが分かります。

- EC2 は特に Condition が設定されてないので、設定通りに作成される
- Condition は 「CreateProdResources」である
- 「true」の場合にのみ 「MountPoint」、「NewPoint」、「Outputs」の3つが作成される

###Conditions Functions
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/a1f65997-44f5-51cc-af27-e6d826da904f.png)
以下の5つの条件関数は、CloudFormation でコードを書く際にとてもお世話になるので、この5つについては把握しておきましょう。
条件関数については、AWSの公式より詳しく記載されてますので、[こちらも](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-conditions.html)参照下さい。

- Fn::And
 - 指定された全ての条件が「true」の場合「true」を返す（それ以外は「false」）
- Fn::Equals
 - 指定した2つの値が同じ場合「true」を返す（それ以外は「false」） 
- Fn::If
 - 指定された条件が「ture」・「false」に評価された場合、それぞれに対応する値を返す 
- Fn::Not
 - false と評価された条件に対して「true」を返す（その逆に対しては「false」を返す） 
- Fn::Or
 - 指定された条件のいずれかが「true」に評価された場合「true」を返す（条件が全て「false」と評価された場合は「false」）

また、これ以外で重要なのものとして、「Fn::GetAtt」があります。

- Fn::GetAtt
 - テンプレートのリソースから、属性の値を取得する


##CloudFormation Metadata
###Metadata
Metadata というセクションを使うことで、リソースやテンプレートに対して、それぞれの詳細を加えることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/879b89b2-7ae0-61d7-2da8-237767b37a4c.png)
以下の3つの Metadata key はとても重要なので見ておきましょう。

- AWS::CloudFormation::Designer
 - テンプレート上のリソースがどうレイアウトされているかを記述し、AWS Designer で自動的に追加される
- AWS::CloudFormation::Interface
 - インプットパラメータが AWS Console に表示された際にグループ化とソート化をする
- AWS::CloudFormation::Init
 - cfn-initの構成タスクを定義している

###AWS::CloudFormation::Init
上記の3つの Metadata key の中でもとりわけ重要な AWS::CloudFormation::Init について説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/b6b9dc55-c304-8375-0fa8-677b90e5d306.png)
AWS::CloudFormation::Init の中には Config が用意されており、以下の内容が順番に書かれております。

- Packages
 - Linux OS 上のパッケージリストをインストールする 
- Groups
 - ユーザグループを判別する
- Users
 - ユーザと、その所属グループを判別する 
- Sources
 - アーカイブファイルをダウンロードし、EC2インスタンスに置く
- Files
 - EC2インスタンス上にファイルを作成する 
- Commands
 - コマンドを実行する
- Services
 - sysvinit サービスを起動する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/21ed3b9b-53f3-d0bf-3955-2db2006189ac.png)
AWS::CloudFormation::Init の特徴についてまとめると、以下となります。

- AWS::CloudFormation::Init の中に複数の config を用意することができる
- 複数の config から configset を作成することが可能
- EC2 ユーザのデータから、config セットを呼び出し可能

###Packages
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/a02adba2-9442-0c58-649d-6d21eb6b40e0.png)
Packages の特徴は以下となります。

- package は、apt、msi、python などのリポジトリからインストールが可能
- package は rpm、yum/apt、rubygems、python の順番で作成される
- package はバージョンの指定も可能

###Groups and Users
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/bdea117f-1e4c-3eff-9333-4a198cae68b2.png)

- CloudFormation Init Metadata に groups と users を入力することで、複数のグループとユーザの登録が可能
- 特定のグループを指定すといった設定も可能
- ユーザの所属グループの指定や、ユーザの指定といった設定も可能

###Sources
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/e272a039-4b19-712d-b109-2fa3d483dd04.png)

- web からアーカイブを直接ダウンロードして、インスタンスに入れることが可能
- URL があれば、S3 や github からでも取ってくることが可能

###Files
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/62d6cf13-b5b5-01bc-7d2a-0dad5e84c4c7.png)
- 全てのコンテンツに対してフル権限と操作が可能
- インラインや URL での指定も可能

###Function Fn::Sub
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/30e490b6-e02e-57e2-ae37-e93bea74c009.png)
- テキストに入力された変数の代わりになることが可能
- テンプレートのフルカスタマイズが可能
- AWS 疑似変数などと組み合わせることが可能

###Commands
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/988d819c-bf07-e07b-41a1-c1e631684943.png)
- アルファベット順にコマンドを1つずつ実行可能
- 環境変数や作業ディレクトリの設定も可能

###Services
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/465add97-1804-fe6f-df3a-053d2dc3f329.png)

- インスタンス起動時に紐付いているサービスを起動可能
- ファイルの変更やパッケージのアップデートがされた際、cfn-init による再起動の確保が可能

##Cloudformation ヘルパースクリプトリファレンス
CloudFormation には、スタックの一部として作成する EC2 インスタンスでソフトウェアをインストールしたり、サービスを開始したりするために使用できる Python ヘルパースクリプトが用意されております。そのいくつかを紹介していきます。

###cfn-signal
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/a142c403-0a1a-a3cf-2c1e-4d58f30247d1.png)
cfn-signal の特徴は以下となります。

- cfn-signal は、リソースの構築が無事に完了したことを CloudFormation に伝える為に利用する
- cfn-signal は、CreationPolicy と共に使用される

図の例の内容は、インスタンスが自動構築されてオンライン上に出るまでのタイムアウトは、最大5分の設定であることが分かります。もし5分経っても cfn-signal から通知が来ない場合は、CloudFormation はロールバックを行います。

###cfn-hup
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/7d0d5e37-ba13-83b5-975f-4151c7732d01.png)
cfn-hup の特徴は以下となります。

- cfn-hup は EC2 インスタンスに対して、 Metadata の変更点を15分毎に監視し、変更があれば再構成を行うよう指示することが可能


##おわりに
Conditions・Metadata・Init についての説明は以上となります。今回紹介した機能を使って、CloudFormation をより便利に活用していきましょう。