CloudFormationについて（1）-CloudFormationの概要-

こんにちは。
この記事は、[株式会社日立システムズ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/hisys)の20日目の記事です。

今回、CloudFormationを利用しリソースを構築する機会がありましたので、
以下の3回に分けて学習したことをまとめていきたいと思います。

　[1. CloudFormationについて（1）-CloudFormationの概要-](https://qiita.com/k-suto-hisys/items/6cf3f42b725387898b90)
　[2. CloudFormationについて（2）-【実践】CloudFormationテンプレートの作成-](https://qiita.com/k-suto-hisys/items/76bed78c9f13507d8f68)
　[3. CloudFormationについて（3）-【実践】ネストスタックの作成-](https://qiita.com/k-suto-hisys/items/1d788175650604565b8d)

第1回の今回は「CloudFormationの概要」についてまとめていきます。

# 目次
[1.CloudFormationとは](#1-CloudFormationとは)
[2.CloudFormationテンプレートの構成要素](#2-CloudFormationテンプレートの構成要素)
[3.まとめ](#3-まとめ)

# 1.CloudFormationとは
## 1.1 CloudFormationの概要
AWS リソースを記述するテンプレートを作成することで
自動でAWS環境を構築できるサービス・IaC（Infrastructure as Code）ツールです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3024510/8573e5b2-bb0e-672d-9114-3ee810c72ff6.png)
- [AWS CloudFormation とは](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/Welcome.html)

## 1.2 メリット
同様のAWS環境を短時間で構築できるようになります。（作業工数の削減）
削除する際は一括削除が可能です。（作業工数の削減）
また、構築作業を自動化できます。（人為的な設定ミスの削減）


## 1.3 利用手順
### （１）テンプレートの作成
まず、テンプレートを作成します。作成方法は主に以下の通りです。

- クイックスタート
AWSのベストプラクティスに基づいてセキュリティや可用性を考慮しているテンプレートを利用する。

- サンプルテンプレート・テンプレートスニペット
既存のサンプルを利用し、テンプレートを作成する。

- 自らテンプレートを作成
JSONまたはYAML形式で０からテンプレートを作成する。

- AWSCloudFormationデザイナー
AWS CloudFormation テンプレートを作成、参照、および変更するためのグラフィックツールを利用し作成する。
[AWS CloudFormation デザイナー とは](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/working-with-templates-cfn-designer.html)

### （２）スタックの作成
CloudFormationのページから「スタックの作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3024510/e37f7eef-b490-b86e-7a57-313c1cea2421.png)

「スタックの作成」画面に遷移します。
「テンプレートの指定」では、すでにS3にテンプレートを格納している場合は「Amazon S3 URL」を選択し、格納先のURLを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3024510/2f14f315-8e8a-cc98-a5d9-0b096b4eaa51.png)

また、「テンプレートファイルのアップロード」を選択し、「ファイルの選択」からテンプレートをアップロードすることもできます。ファイルを選択したら、「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3024510/12b99dbc-bc1b-c19e-d8d4-fcfb87d3cc9a.png)

「スタックの詳細を指定」画面に遷移します。
ここではスタックの名前やパラメータを入力し、ページ右下の「次へ」をクリックします。
パラメータに関しては後述します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3024510/3b6bf192-ac51-62e1-5c31-0981760144a0.png)

「スタックオプションの設定」画面に遷移します。
ここでは各オプションを選択または入力し、ページ右下の「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3024510/b0d70d91-1840-97f3-8eab-fb077115e405.png)

最後に「レビュー」画面に遷移します。
ここでこれまでのステップで選択または入力した情報を確認します。
確認し終わりましたら、ページ右下の「送信」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3024510/b84690bb-ad29-fb4d-592d-26f00e4b866c.png)

以下の画面に遷移しスタックの作成が始まります。
作成中のステータスは「CREATE_IN_PROGRESS」です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3024510/d460bb9e-720e-7540-fc4c-b244a4e11413.png)

しばらく経ち、以下の画面のように「CREATE_COMPLETE」になりますと、スタックの作成が成功したことが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3024510/193198df-b677-4656-1ab8-b46c6b4efc49.png)

実際にリソースが作成できているか確認しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3024510/43afe8c3-db75-5462-7e72-f6b8e5608f26.png)

# 2.CloudFormationテンプレートの構成要素
## 2.1 セクション
CloudFormationテンプレートでは以下のセクションを記述していきます。
必須のセクションはResourcesになります。

|#|セクション|要否|記載内容|
|:--|:--|:--|:--|
|1|[AWSTemplateFormatVersion](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/format-version-structure.html)|任意|テンプレートが準拠している AWS CloudFormation テンプレートバージョン。|
|2|[Description](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/template-description-structure.html)|任意|テンプレートの説明。|
|3|[Metadata](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html)|任意|テンプレートに関する追加情報。|
|4|[Parameters](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html)|任意|スタックを作成または更新時に、テンプレートに渡すことができる値。|
|5|[Rules](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/rules-section-structure.html)|任意|スタックの作成またはスタックの更新時に、テンプレートに渡されたパラメータまたはパラメータの組み合わせを検証できる。|
|6|[Mappings](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/mappings-section-structure.html)|任意|条件パラメータ値の指定に使用できる、キーと関連する値のマッピングできる。|
|7|[Conditions](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/conditions-section-structure.html)|任意|スタックの作成または更新を制御する条件。|
|8|[Transform](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/transform-section-structure.html)|任意|サーバーレスアプリケーションの場合に、使用するAWS SAM のバージョンを指定。|
|9|[Resources](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resources-section-structure.html)|必須|構築するリソースとプロパティ。|
|10|[Outputs](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html)|任意|スタック構築後に出力させたい値（別のスタックに渡したいリソースの値）を記述。|

- [テンプレートの分析](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/template-anatomy.html)

## 2.2 Resourcesの形式
必須のセクションであるResourcesでは以下の形式で記述していきます。

```yaml:Resourcesの形式
 Resources:
  Logical ID:
    Type: Resource type
    Properties:
      Set of properties
 ```
Logical IDではテンプレート内でのリソースの論理名を記述します。
また、テンプレート内で一意である必要があります。
Typeではリソースタイプを記載し、Propertiesではリソースのプロパティを記載します。
Propertiesではリソースによって、値の指定が必須な項目（Required:Yes）や条件付きで必須な項目（Required: Conditional） もありますので以下を参照し、記述していきます。

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

# まとめ
今回のポイントは以下の通りです。
- CloudFormationテンプレートはJSONまたはYAML形式で作成します。
- CloudFormationを利用することで
・同様のAWS環境を短時間で構築できるようになります。（作業工数の削減）
・削除する際は一括削除が可能です。（作業工数の削減）
・構築作業を自動化できます。（人為的な設定ミスの削減）
- CloudFormationテンプレートではResources等のセクションごとに記述する。

次回は実際にテンプレートを作成し、内容を説明していきます。

※本記事は2022/12/13時点での内容になります。
　最新の情報に関しては公式ドキュメントを参照ください。