AWS CloudFormation 理解メモ

## ３つの要素
- Templates (テンプレート)
    リソースを定義したファイル。JSON(.json), YAML(,yaml), TXT(.txt)から選べる。

- Stacks (スタック）
    テンプレートで定義され、CloudFormationによって作成されたリソース群。テンプレートを変更しCloudFormationでデプロイすることでリソースの変更が可能。
- Change sets (変更セット)
    デプロイ済みのスタックに対してテンプレートを修正した際にCloudFormation側が差異を表示してくれる。

## 基本的な挙動
1. テンプレートを作成し、ローカルかS3に保存
2. AWSコンソールかAPIかCLIでテンプレートを指定して実行
3. CloudFormationがテンプレートを読み込んでリソースを作成
4. （テンプレートを変更した場合）作成中にエラーが起きればそれまで作成したものを削除して、変更実施前の状態にロールバック

## 注意点
- アカウントのサービス上限数(quota)や変更不可のサービス、権限の不足等はCloudFormationは考慮せずデプロイを実行する。エラーがあればエラーを吐き出す。
- 更新する際は既存のリソースの運用やリソースの存在そのものに影響がないか十分注意する。

## 他サービスとの連携
- Git
    テンプレートファイル(CloudFormation template file)とスタックデプロイメントファイル(stack deployment file)を用意する。これらに変更があればCloudFormationは自動的にスタックを更新する。Gitを使えばプルリクエストやバージョン管理の集中管理ができるようになる。AWS公式ドキュメントではGit syncってのを使えばできると書いてあった。Git syncはCodeConnectionsでアクセスできると書いてあった。GitHub, GitHub Enterprise, GitLab, BitBucket, GitLab self-managedのリポジトリをサポートしてると書いてあった（2024年9月18日時点）。
   ```
    https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/git-sync.html
    ```

## テンプレートの作成手段
```
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-guide.html
```
- [AWS Application Composer](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/app-composer-for-cloudformation.html)
    AWSの物理設計図か論理図を作る感じで、視覚的に設計図を作れる。コンソールで見た感じだと、ビジュアルエディタでポチポチ作ったものはjsonやyamlで同期的に見れるようになってた。
- [AWS CloudFormation Designer](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/working-with-templates-cfn-designer.html)
    Application Composerがこれの改良版なので基本的にApplication Composerを使えばいいっぽい。
- テキストエディタ
    jsonかyamlで、テキストエディタで作る。
- [IaC generator](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/generate-IaC.html)

## 自分がやりたいこと
ネットワークはネットワークスタック、プロキシサーバとそのサブネットやルートテーブルはプロキシサービススタックみたいに、機能ごとに管理スタックを分けて変更管理しやすくしたい。ネストってのがあったからそれが使えるかも。

## テンプレートについて
テンプレートのうち`Resources`セクションのみ必須項目。

### テンプレートの保管場所
- S3バケット
    スタック作成・変更時にS3URLを指定できる。コンソールやCLIでローカルのテンプレートを指定（CloudFormationにアップロード）した場合、自動的にS3バケットが作成されてそこに保管される。また、実行ユーザに権限があることが前提。
- Gitリポジトリ
    Git syncを使う。本記事の[他のサービスとの連携](#他のサービスとの連携)を参照。

### テンプレートのバリデーション
CLIで`validate-template`コマンドを使うかコンソールでテンプレートを指定すれば、テンプレートのJSON又はYAML構文バリデーションができる。
リンター（[CloudFormation Linter (cfn-lint)](https://github.com/aws-cloudformation/cfn-lint)）やフォーマッター（[CloudFormation Rain (rain fmt)](https://github.com/aws-cloudformation/rain)）がある。

## テンプレート作成に役立つページ
- [Template formats](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-formats.html)
    フォーマット概要ページ。
- [Template sections](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html)
    テンプレートで設定するセクションの詳細が書いてあるページ。
- [Template snippets](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-snippets.html)
    テンプレのスニペット集。
- [Working with Microsoft Windows stack templates](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-windows-stacks.html)
    SharepointサーバスタックなどMicrosoft関連で使えるテンプレ集。
- [AWS resource and property types reference](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html)
    全AWSリソースのプロパティが載ってる。

## まだ読んでないページ
[Get values stored in other services using dynamic references](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html)

[Get exported outputs from a deployed CloudFormation stack](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-exports.html)

[Define parameter input with CloudFormation-supplied parameter types](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-supplied-parameter-types.html)

[Use CloudFormation-supplied resource types in stack templates](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-supplied-resource-types.html)

[Managing AWS resources as a single unit with AWS CloudFormation stacks](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacks.html)

[Security in AWS cloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/security.html)

[Monitoring CloudFormation and Git sync events with EventBridge](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/eventbridge-integration.html)

[Continuous delivery with CodePipeline](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/continuous-delivery-codepipeline.html)

[Managing extensions with the CloudFormation registry](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/registry.html)