AWS CloudFormationとは

インフラストラクチャをコードとして管理するためのサービスであり、インフラの自動化、管理、標準化に役立つさまざまな機能を提供します。

## 主要な機能一覧
### スタック
- 概要: CloudFormationスタックは、CloudFormationテンプレートを使用して作成したAWSリソースの集合です。スタックは一つのユニットとして管理され、リソースの作成、更新、削除が可能です。スタックを使用することで、AWSリソースの変更履歴や状態を一元的に管理できます
- 使用例: サンプルテンプレートでEC2インスタンス、S3バケット、RDSインスタンスを一括でデプロイする場合、これらは全て一つのスタックとして管理されます

- [スタックとスタックセットとの違い](https://qiita.com/gongguyiji/items/1b1517ccc629d15d5470)


 ### テンプレート
 - 概要: CloudFormationテンプレートは、AWSリソースの構成を定義するJSONまたはYAML形式のファイルです。このテンプレートにより、手動でリソースを作成する代わりに、コードとしてインフラを定義し、自動化できます
 - 使用例: EC2インスタンスやRDSインスタンス、VPCを作成するための設定をテンプレートで定義し、そのテンプレートを元にスタックを作成します





<details><summary>サンプルコード（json）</summary>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "A sample CloudFormation template that creates an S3 bucket and EC2 instance",
  "Resources": {
    "MyS3Bucket": {
      "Type": "AWS::S3::Bucket",
      "Properties": {
        "BucketName": "my-s3-bucket-example"
      }
    },
    "MyEC2Instance": {
      "Type": "AWS::EC2::Instance",
      "Properties": {
        "InstanceType": "t2.micro",
        "ImageId": "ami-0c55b159cbfafe1f0",
        "KeyName": "my-key-pair",
        "SecurityGroupIds": [
          "sg-12345678"
        ],
        "SubnetId": "subnet-12345678"
      }
    }
  }
}
```

</details>

### リリース
- 概要: テンプレート内で定義する具体的なAWSリソースです。これには、EC2インスタンス、S3バケット、Lambda関数、RDSインスタンスなどが含まれます。CloudFormationはこれらのリソースを自動的に作成、更新、削除します
- 使用例: Resourcesセクションで、例えばAWS::EC2::Instanceリソースを定義し、EC2インスタンスを作成します
## パラメータ（Parameters）
- 概要: CloudFormationテンプレート内で定義されたパラメータを使用することで、スタック作成時に動的に値を入力することができます。これにより、再利用可能なテンプレートを作成し、環境ごとに異なる設定を行うことができます
- 使用例: InstanceType（インスタンスタイプ）やKeyName（EC2のSSHキー）をパラメータとして定義し、スタック作成時にそれらの値を指定します

### 出力（Outputs）
- 概要: スタックの作成後に生成された値を出力するために使用します。これにより、スタック内で作成したリソースの情報（例えば、EC2インスタンスのIDや、S3バケットのURL）を他のスタックやユーザーに渡すことができます
- 使用例: スタックで作成したEC2インスタンスのIDを出力し、他のスタックや管理者がそれを使用できるようにします
- 使用例: スタックで作成したEC2インスタンスのIDを出力し、他のスタックや管理者がそれを使用できるようにします

### 条件（Conditions）
- 概要: スタックの作成や更新時に、特定の条件が満たされた場合にのみリソースを作成するように定義できます。これにより、異なる環境や設定に基づいて異なるリソースをデプロイできます
- 使用例: Conditionsを使って、Environmentがproductionの場合にのみ特定のリソース（例えば、RDSインスタンス）を作成する設定を行います


### 変更セット（Change Sets）
- 概要: スタックを更新する前に、どのリソースが変更されるかを事前に確認できる機能です。これにより、リソースに意図しない変更が加えられることを防げます
- 使用例: スタックのテンプレートを更新した際に、変更セットを確認し、更新によって変更されるリソースを事前にチェックします

### リソース依存関係
- 概要: CloudFormationはリソース間の依存関係を管理し、リソースを適切な順序で作成、更新、削除します。これにより、依存関係があるリソースを誤って削除したり、作成順序が誤って実行されることを防げます
- 使用例: VPCを先に作成し、その後EC2インスタンスを作成する場合、VPCリソースが作成されるまでEC2インスタンスの作成を待機させます

- [ ] TODO: CDK、Teraformでリソースの依存関係の解消機能が実装されているか調査する

### 更新ポリシー
-  概要: リソースの更新時にどのようにリソースを変更するかを定義するポリシーです。特にAuto ScalingグループやElastic Load Balancerなど、特定のリソースに対する更新手順を管理できます
-  使用例: Auto Scalingグループを更新する際に、インスタンスの強制終了を防ぐような更新ポリシーを設定します

### 自動ロールバック（Automatic Rollback)
- 概要: スタックの作成や更新が失敗した場合、CloudFormationは自動的に変更を元に戻します。これにより、失敗した場合でもインフラストラクチャが不整合な状態になるのを防ぎます
- 使用例: スタック作成時にリソース作成が失敗した場合、CloudFormationはその時点で変更を元に戻し、以前の安定した状態を保ちます

###  リソースの作成、更新、削除の順序の制御
- 概要: DependsOn属性を使用して、リソース作成、更新、削除の順序を制御できます。これにより、リソース間の依存関係を明示的に指定し、順序通りに処理を行うことができます
- 使用例: あるリソースが他のリソースに依存している場合、そのリソースが先に作成されるようにDependsOnで順序を指定します

### Stack Policies
- 概要: スタックポリシーは、スタックの更新時に特定のリソースを保護するために使用します。これにより、重要なリソースが誤って変更されるのを防げます
- 使用例: RDSインスタンスや重要なデータベースのインスタンスを保護し、誤って更新されないようにします


## 類似サービス比較


| 特徴                     | **AWS CloudFormation**                | **AWS CDK**                             | **Terraform**                              |
|--------------------------|--------------------------------------|-----------------------------------------|--------------------------------------------|
| **タイプ**               | 宣言型（Declarative）                | 命令型（Imperative）                    | 宣言型（Declarative）                      |
| **サポートクラウド**      | AWS専用                              | AWS専用                                 | AWS、Google Cloud、Azure、その他のクラウド|
| **インフラ定義方法**      | JSONまたはYAMLテンプレート           | プログラムコード（Python、TypeScript等）| HCL（HashiCorp Configuration Language）   |
| **使いやすさ**            | テンプレート記述が必要、やや複雑    | プログラミングが得意な人には非常に便利| シンプルな記述、マルチクラウド対応       |
| **状態管理**             | 自動的に管理                        | CloudFormationで管理される             | 状態ファイル（.tfstate）で管理            |
| **カスタマイズ性**        | 限定的                               | 高い                                    | 高い                                       |
| **マルチクラウド対応**    | なし                                 | なし                                    | あり                                       |
| **学習曲線**             | やや急な学習曲線                    | 開発者向けの学習が必要                  | HCLの理解が必要                           |