初めて利用するAWSサービスからCloudFormationテンプレート作成まで

## 背景
　AWS BackupサービスのCloudFormationテンプレート作成に取り組みましたが、AWS Backupを利用するのは初めてで、どこから学習を始めてどのようにテンプレートを作成すればいいのか分からず、開発に苦労しました。ネット上の情報でも、初心者向けのCloudFormationテンプレートの作成ステップが見つからなかったので、私が経験した学習から作成までの最短ルートを5つのステップで共有したいと思います。
　今回は私が取り組んでいたAWS Backupを例に挙げて説明しますが、このステップを他のAWSサービスに適応させて進めれば、基本的なCloudFormationテンプレートが作成できると思います。

## 5ステップ

1. [作成するAWSサービスの仕様について学習する](#step1)
2. [マネジメントコンソールからサービスを利用する](#step2)
3. [AWS CloudFormationのUser Guideから該当サービスのResourceとPropertyを確認](#step3)
4. [AWS CloudFormationテンプレート作成](#step4)
5. [AWS CloudFormationからスタック作成](#step5)

<a name="step1"></a>
### ステップ1: 作成するAWSサービスの仕様について学習する
　AWSサービスを使用してCloudFormationテンプレートを作成する際には、そのサービスの詳細まで理解するのが理想的ですが、最低限でもサービスの基本的な仕様を理解しておくことが必要です。

**例：AWS Backupサービスの基本的な仕様**
- まず、BackupPlanを使用してバックアップ計画を作成します。
- 次に、Backup Selectを使用してバックアップ対象のリソースを指定します。
- 最後に、BackupVaultを使用してデータを保管します。
など、基本的なサービスの仕様を把握することが必要です。
AWS Backupのようなサービスには多くの機能がありますが、その全てを最初から理解するよりは、基本的な仕様を把握しておくとが大切です。

**学習におすすめのリソース**:
　AWSサービスを調べる際にネットで検索すると多数の関連資料が出てくると思いますが、情報の正確性と信頼性を考慮して読みにくいかもしれませんが、できるだけ公式のドキュメントを利用することをお勧めします。

公式サイトのドキュメント: [https://docs.aws.amazon.com/](https://docs.aws.amazon.com/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330696/d61cb6cb-877b-fdb6-b0c7-4b3563362e97.png)


<a name="step2"></a>
### ステップ2: マネジメントコンソールからサービスを作成する

　CloudFormationテンプレートを直接作成する前に、まずはAWSマネジメントコンソールを利用してサービスを手動で作成することを推奨します。各パラメータの説明を読みながら設定を進めることもでき、作成したサービスの動作を直接観察し、理解を深めることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330696/045c1e9c-f81e-77aa-1beb-3dc469a33f7c.png)



**例: AWS Backupのマネジメントコンソール**
　AWSマネジメントコンソールを利用することで、該当サービスの入力項目を確認することができます。この確認により、CloudFormationテンプレート作成に必要なパラメータやリソースを理解し、どのような設定が必要かを把握することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330696/7ee017ba-1a86-e732-e5c2-a1146a18c084.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330696/198c0dab-d98c-f9ec-c8a1-5ea40c5c2520.png)

　各設定項目がどのように機能し、それが全体の設定や動作にどのように影響を与えるかを把握することが重要です。

<a name="step3"></a>
### ステップ3: AWS CloudFormationのUser GuideからサービスのResourceとPropertyを確認

　AWS CloudFormationを使用して特定のサービスを構築するためには、AWS CloudFormationのUser Guideを利用して必要なリソースとプロパティを確認することが必要です。
　User Guideは具体的なリソースの詳細とプロパティの説明があります。それらを参照してCloudFormationでサービスを作成する際に何が必要で、どのように設定を行うべきかを明確に理解することができます。

テンプレートリファレンス - AWS CloudFormation: [amazon.com](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html)
![03-01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330696/7d3fe123-a893-2bd0-2fde-68d30371a474.png)

**例：AWS BackupのUser Guide**
　AWS CloudFormationのResource Typesには、AWS Backupに関連する「AWS:Backup:BackupPlan」、「AWS:Backup:backupselection」、「AWS:Backup:backupvault」、「AWS:Backup:framework」、「AWS:Backup:reportplan」が含まれています。今回は、AWS Backupの基本的な仕様で確認した、「AWS:Backup:BackupPlan」、「AWS:Backup:backupselection」、「AWS:Backup:backupvault」を使用します。この３つでバックアップ計画の作成、バックアップ対象の選択、データの保管ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330696/2f0af284-0efc-01eb-be5d-acc7ea821f46.png)
　User Guide内のResource Typesをクリックすると、それぞれのリソースについてCloudFormationテンプレートで使用する構文がJSONとYAML形式で表示されます。これらの構文はテンプレート作成の際の基本的なフレームワークを提供し、どのように各リソースとプロパティを配置・記述すべきか確認ができます。これはテンプレート作成の初期段階における重要なステップとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330696/42ad1546-ce34-c326-38ba-d04d649cc3ac.png)
　各プロパティの説明を確認し、テンプレート作成に必要な内容を確認します。特に、「必須」と表示されているプロパティは、CloudFormationテンプレートが正常に動作するために作成するテンプレート内に必ず含まれている必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330696/7125bae6-c474-d88b-ba6a-8727aae5a26f.png)


<a name="step4"></a>
### ステップ4: AWS CloudFormationテンプレート作成
　サービス作成に必要なプロパティが確認できたら、実際のテンプレート作成に進みます。
まず、順番的には基盤となるセクションから作成をします。

CloudFormationテンプレートの構造とセクション: [Template anatomy - AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330696/02616498-3383-a531-7228-2ef0dbc2c8e6.png)
　最初に作成する各セクション作成するテンプレートに追加し、その後で各セクションの詳細を詰めていくという方法が効率的だと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330696/84e7de30-cb9f-9a7a-1f44-80058cc623cd.png)
　次は、AWS CloudFormationのUser Guideから各サービスのリソースとプロパティを確認し、それに基づいて必要なリソースをテンプレートに作成します。これは、テンプレートがAWSサービスを適切に構築・管理するための重要なステップです。リソースとプロパティの詳細は、[AWS CloudFormationのテンプレートリファレンス](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html)に記載されています。これを参照しながらテンプレート作成を進めていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330696/dd441db6-0f2d-7106-3ac1-ba19c1d27311.png)
　User Guideからリソースとプロパティの情報を参考にして、必要なプロパティを作成しているテンプレートに追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330696/fe52a342-1237-c2f4-dffc-2be6996a1a79.png)

　リファレンスから追加したプロパティは値が設定されてないので次のステップではそれぞれのプロパティに適切な値を設定します。プロパティの説明をリファレンスから参照しながら、それぞれのプロパティが要求する適切な値を設定していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330696/6ddd8eaa-3b87-e25d-4a65-f444f15cfc24.png)


<a name="step5"></a>
### ステップ5: AWS CloudFormationでスタック作成
　テンプレートを作成した後は、そのテンプレートからスタックが正常に生成されることを確認します。スタックの作成を確認するためには、マネジメントコンソールやAWS CLIを利用することができますが、私はマネジメントコンソールを利用することが多いです。CLIでも同じ内容は表示されますが、一目で理解できる点がマネジメントコンソールの利点かんと思います。
　スタックの確認は2段階で行います。まず、1段階目ではテンプレートの構文エラーを確認します。次に、2段階目ではスタックの生成に関するエラーを確認します。
1. **テンプレートの構文エラーチェック**: テンプレートをAWS CloudFormationからアップロードし、スタックを作成する時に、構文エラーがある場合は、スタックの作成が進めない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330696/e10af921-6e51-f58b-030c-eed502cc349d.png)

2. **スタック生成時のイベントチェック**: スタックに対して生成されたすべてのイベントと、イベントのタイムスタンプが表示されます。このタブは、問題が発生した場合に何が起こっているのかを正確に把握するうえで非常に役立ちます。


## 終わり
　AWS BackupのCloudFormationを作成が終わり、次々とCloudFormationのテンプレートを作成しています。これまで触れたことのないAWSサービスも多いですが、上記の5つのステップを適用してテンプレートを作成しています。より詳細なテンプレートを作成するには、そのサービスを深く理解することが大切ですが、基本的なテンプレート作成に関しては、この5つのステップが非常に有用かと思います。

## チェックリスト

- [ ] **ステップ1**: 作成するサービスの仕様について学習する
  - 公式サイトのドキュメント: [https://docs.aws.amazon.com/](https://docs.aws.amazon.com/)
- [ ] **ステップ2**: マネジメントコンソールからサービスを作成する
- [ ] **ステップ3**: AWS CloudFormationのUser GuideからサービスのResourceとPropertyを確認
  - テンプレートリファレンス - AWS CloudFormation: [amazon.com](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html)
- [ ] **ステップ4**: AWS CloudFormationテンプレート作成
  - AWS CloudFormation テンプレートの構造とセクションを示します: [Template anatomy - AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html)
  - ステップ3のAWS CloudformationのUserGuideからサービスのResourceとPropertyを確認して必要なResourceを作成します: [テンプレートリファレンス - AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html)
- [ ] **ステップ5**: AWS CloudFormationでスタック作成