【AWS】CloudFormation IaC ジェネレーターを試してみた

# はじめに
今回は、AWSのCloudFormation IaC ジェネレーターを使って、既存のAWSリソースからテンプレートを作成する方法を試してみました。
というのも、個人の検証用AWS環境にあるリソースを簡単にコード化し、必要なときにリソースをすぐに起動・削除できないかと思った次第です。

# 検証方法の流れ
以下の手順で、CloudFormation IaC ジェネレーターを使って既存リソースからテンプレートを作成し、検証しています。
1. AWSリソースを作成する
2. CloudFormation IaC ジェネレーターでリソースをスキャンする
3. CloudFormation IaC ジェネレーターでテンプレートを作成する
4. テンプレートをCloudFormationスタックにインポートする
5. （検証後のお掃除に）リソース削除する

## 1. AWSリソースを作成する
以下画像のように、検証用にVPCとサブネット、NATゲートウェイなどをまとめて作成します。
![20241115_AWS_CloudFormation_000001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784723/ee819185-e518-e14d-b081-a99404e9eac1.png)

## 2. CloudFormation IaC ジェネレーターでリソースをスキャンする
CloudFormationコンソール画面から`IaC ジェネレーター`ページを開きます。
スキャン画面から`新しいスキャンを開始`をクリックします。※2回目以降は再スキャンと表示されます
![20241115_AWS_CloudFormation_000002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784723/ae2ee504-92d4-972e-065f-f79c94f5f609.png)

## 3. CloudFormation IaC ジェネレーターでテンプレートを作成する
`テンプレートを作成`をクリックします。
![20241115_AWS_CloudFormation_000003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784723/887cc50b-e932-b9d0-2f4d-3a8f1c01a211.png)

テンプレート名や削除ポリシー、置換ポリシーなど、リソース削除時の動作を設定します。
今回は検証用途であるため、どちらのポリシーも削除に設定しています。
![20241115_AWS_CloudFormation_000004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784723/3fd13c5a-601e-a9fe-5254-5ce5fd6a54c5.png)

次は、テンプレートに追加するリソースを追加します。
ここでは、リソース作成時に付与したタグでフィルターを設定し、該当するリソースのみを選択しています。
![20241115_AWS_CloudFormation_000005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784723/e24fac0a-6d5c-7e89-0a4a-a05655b3cbbe.png)

選択したリソースが表示されるので、そのまま`次へ`をクリックします。
![20241115_AWS_CloudFormation_000006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784723/98c96237-1bd6-d2df-2c50-e82cd25dccee.png)

関連リソースをすべて追加することが推奨らしいので、そのまま`次へ`をクリックします。
![20241115_AWS_CloudFormation_000007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784723/80fabce7-97e7-0fd1-3a7d-f9c13ffeca76.png)

最後のページで確認画面が表示されるので、問題がなければ`テンプレートを作成`します。

## 4. テンプレートをCloudFormationスタックにインポートする
「一部のオプションのプロパティがテンプレートに含まれていませんでした」という注意喚起が表示されますが、CloudFormationにインポートするのには問題ないので、そのまま`スタックにインポート`をクリックします。
![20241115_AWS_CloudFormation_000008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784723/5fc76d85-fa38-0bd4-e7f6-faf9a5baad77.png)

スタック名を設定し、`次へ`をクリックします。
![20241115_AWS_CloudFormation_000009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784723/fc4e3d88-cec6-89a6-35a2-b54412c16c2a.png)

そのまま`次へ`をクリックします。
![20241115_AWS_CloudFormation_000010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784723/4389a144-3728-67da-ead4-cf77a27e14d1.png)

そのまま`次へ`をクリックします。
![20241115_AWS_CloudFormation_000011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784723/b2316b17-11e7-27ba-941f-9fbfca29d81a.png)

最後のページで確認画面が表示されるので、問題がなければ`リソースをインポート`します。

CloudFormationスタックへのインポートができました。
![20241115_AWS_CloudFormation_000012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784723/b7dc7362-b8d2-1b91-4d34-91895133982b.png)

## 5. （検証後のお掃除に）リソース削除する
スタック画面から`削除`をクリックします。
![20241115_AWS_CloudFormation_000013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784723/caca41fc-e09b-20c3-fe89-8c7962b83557.png)

確認画面で、`削除`をクリックします。
![20241115_AWS_CloudFormation_000014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784723/52402410-4ff0-f236-dbb6-578671b88166.png)

今回、スタックの削除に失敗してしまったので、`削除を再試行`しています。
![20241115_AWS_CloudFormation_000015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784723/8174e084-a644-3529-1970-653a8aba4534.png)

削除が完全にできない場合に、`このスタック全体を強制削除`します。
![20241115_AWS_CloudFormation_000016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784723/ce51f371-db6c-f568-7175-8da9fdc0e790.png)

これでも完全に削除できていないリソースが数個あったので、それは個別で削除しました。

# さいごに
既存リソースをIac化できますが、コードが物理IDで書かれている部分があったりするので、それを修正する手間は必要だと思います。環境を複製したい場合などは今のままだと、利用できないかなと…
個人的には、コード修正するのめんどくさいと思うヒトなので、今後のアップデートでいい感じになることを期待しています。

# 参考ドキュメント
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/generate-IaC.html