AWS CloudFormation Master Class を受けてみた⑤「Resources と Mappings について」

##はじめに
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)

##CloudFormation Resources
###CloudFormation Resources について
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/75499f5d-353b-103d-38f8-b0514470ad21.png)リソースとは、CloudFormation のテンプレートにおけるコアの部分です。以下の特徴があります。

- テンプレートにおいて、AWS で扱われるサービスを構成する要素である
- AWS によって、リソースの追加や削除、更新が常に行われている
- 224種類以上のリソースタイプが用意されている
- リソースタイプは「 AWS::aws-product-name::data-type-name 」と表現される（例：「 AWS::EC2::Instance 」）

リソースは実に224種類以上あるので、その全てを網羅するのは困難です。
AWS より、CloudFormation でサポートされている全リソースタイプの情報が紹介されてるので、そちらを参照しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/5cdfb031-00b3-0ea6-281b-814a4f11088d.png)
下記のリンクから、AWS リソースが紹介されている先に飛ぶことができます。

- [AWS リソースおよびプロパティタイプのリファレンス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html)
- 例：[EC2 インスタンスのリソース](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html)

###Hands On
それでは、実際にリソースの中身を見てみましょう。ダウンロードしたコードから、「 0-ec2-with-sg-eip.yaml 」YAML ファイルを開きます。ファイルを開くと、4つのリソースが記述されているのが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/5bf33f4e-ae21-114f-4e79-062d3913dcbf.png)
リソースのコードにおいて、重要な項目は以下の2つです。

- Type：リソースのタイプ
- Properties：リソースに対する追加要素（Properties 以下の内容が、そのリソースの追加要素）

※4つのリソースそれぞれについての詳しい内容は、下記のリンク先を参照ください

- [MyInstance ( EC2 リソース )] (https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html)
- [MyEIP ( Elastic IP リソース ) ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-eip.html)
- [SSHSecurityGroup/ServerSecurityGroup ( Amazon EC2 セキュリティグループリソース )](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-eip.html )

リソースの内容は、CloudFormation Designer でも確認してみましょう。CloudFormation Designer を開いて、リソースのコードをコピペすることで、図で確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/3b255228-3995-61eb-2d65-b8ad5b181a67.png)

###Optional 
リソースには、追加の動作や関係を制御するためにリソースに追加ができる属性というものが存在します。ここではその主な4つを紹介します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/0cd47a0b-3c28-f0c0-b752-e89dab0b6cdf.png)

- DependsOn
 - 2つのリソースの依存関係を描くのに適している
- DelectionPolicy
 - リソースを削除から保護する（CloudFormation が削除されたとしても保護が可能） 
- CreationPolicy
 -  CFN-init のセクションに詳細な設定を加えることが可能
- MetaData
 -  リソースに YAML や JSON 形式のデータの追加や、関数の組み込みなどが可能

##CloudFormation Mappings
###Mappings
次に、Mapping について紹介します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/73397082-dca7-ca46-cffd-4489c50ba63a.png)
Mapping は CloudFormation のテンプレートに組み込む変数のことを指します。
Mapping を使うことで、デベロップとプロダクトといった異なる環境、または Region といった異なる利用目的や異なる環境を区別しやすくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/95a6db80-1391-cc9e-eb58-443e0088ae30.png)
また、以下のコマンドを使うことで、キーと関連付けた値を呼び出せます。

 - !FindInMap [ MapName, TopLevelKey, SecondLevelKey]

###Pseudo Parameters
最後に、疑似パラメータについて紹介します。
AWS では、疑似パラメータがCloudFormation のテンプレートに用意されております。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/14131e6b-6278-093a-0813-09f2151b41ab.png)

- AWS::AcountId
 - スタックが作成されているアカウントの AWS アカウント ID を返す
- AWS::NotificationARNs
 - スタックの通知 ARN を返す
- AWS::Value
 - 値を返さない
- AWS::Region
 - リージョンを返す
- AWS::StackId
 - 図の様にコマンドで指定されたスタック ID を返す
- AWS::StackName
 - スタック名を返す   

##おわりに
CloudFormation の Resources と Mappings については以上です。次回では、CloudFormation の Conditionals や Metadata について紹介していきますので、お楽しみに！