Cloud Formation IaC generator で既存環境を自動でテンプレート化してみた

## 最初に
今回はCloudFormation Template を作成したものの、インポートしてスタックを作成するところまでやってません。
### 参考にした投稿者様
取り組むにあたって以下の投稿を参考にしています。
リリース直後に投稿してくださる投稿者様、いつも大変感謝しております。
https://qiita.com/kanuazut/items/bcc648e33181db35cc6b
## 業務的な背景
　私はAWS上にサービスを構築して数年間運用しており、たびたび検証環境など類似環境構築の機会があります。
　ただしサービスのインフラはコード化されておらず、構築のたびに手順書を使ってAWSコンソール上でポチポチと作業していました。
　これが非効率な上に既存環境との差異も分かりづらく、同じことの繰り返しであるため知識としても得るものは薄いです。
　IaC化した方がいいとは思っていたものの、スケジュールの都合もありノウハウのない私がチャレンジするにはハードルが高くて悩んでいました。
 ## Cloud Formation IaC generatorとは
　2024年1月末にCloudFormation IaC generator が公開されていました。
> CloudFormation IaC generator allows you to scan existing resources in your account and select resources to generate a template for a new or existing CloudFormation stack.

https://awsapichanges.info/archive/changes/bb886d-cloudformation.html

どうやらAWSアカウント内の既存リソースからCloudFormation テンプレートを逆起こししてくれるようです。
これまでもFormer2などの外部サービスで実現されていましたが、今回はAWS公式が機能を用意してくれました。

　IaC generator を使って既存リソースをTemplate化して使うには、大きく以下の流れになるようです。
 1. 既存リソースのスキャン
 2. テンプレートの作成
 3. テンプレートのインポート（スタックの作成）
 ## やってみる
　 直近で検証環境を構築していました。ざっくりした構成は以下の通りです。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759852/5f5d2958-26fc-7b54-dd66-d3cc2b983bfa.png)

 今回は上記検証環境をTemplate化します。
 
とりあえずAWSコンソールを見ると「IaCジェネレーター」の表示がありました。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759852/52b73c91-55dd-2995-161a-5c1ac9404578.png)

まずは既存リソースをスキャンする必要があるので「新しいスキャンを開始」を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759852/003805db-cb63-ed6b-f431-ca58b2dea89d.png)

数分待てばスキャンが完了しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759852/e55229ef-c942-b609-ee34-780d79abb67b.png)

リソース数234。必要最低限の検証環境でもこんなにあるのかとぞっとしました。
とはいえ、問題なく読み取ってくれたようなのでテンプレートの作成に進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759852/31f63ec1-e0e4-c66c-09ca-f5edc73d5741.png)

適当にテンプレート名を入れて「次へ」。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759852/a16dc71a-da24-4d91-3d23-1da84b877a47.png)

スキャンされた全リソースから、テンプレートに含めるリソースを選択させてくれるようです。
必要なものが明確であれば取捨選択するべきですが、構成のうち不要なものもパッと思いつかなかったのでとりあえず全部選んでみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759852/050bf62c-c9af-1a20-fb9f-29c305e618c0.png)

恒例の最終確認画面です。
確認して「テンプレートを作成」を押下すると、IaCジェネレータの画面に戻って進捗状況が見れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759852/5b4c7d9d-54c3-a6f6-b416-a95172f00be1.png)
    
待ってると数分でできました。
簡単すぎて怖いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759852/b197e302-2f94-8b57-d833-595fd45a7a97.png)

テンプレートはファイル出力できるのでダウンロードしてみました。
※YAML形式とjson形式が選べます。
すると5,000行オーバーの広大なファイルが落ちてきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759852/a9a197aa-297a-6f4f-c152-04f403f4811c.png)

恐ろしく長いコードを眺めながら、軽い気持ちで「IaCチャレンジするか～」とか言って手書きでやり始めなくて良かったなと思いました。
慣れてる人なら完全手書きじゃなくて何かしら効率化できるんでしょうか。CDKとか使って短くするんですかね。

とにかく、自動でテンプレートを作成することができました。

## 内容を確認
テンプレートの構文はほぼ知らないんですが、気になる点がいくつかありました。
※「最初に」で記載した参考投稿と重複してます。完全にパクった形になりました。すみません。
### リソースIDの表記揺れ
リソースIDの指定が物理IDの部分と論理IDの部分があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759852/8f536a2f-b994-520c-bf0d-b0a30f53565c.png)

論理IDに揃えてほしいですね。理由があるんでしょうか？
別のAWSアカウントで利用するには物理ID部分は書き換える必要があるようです。
驚いたのは同じVPCを指定する部分でも論理IDと物理IDの2種で表示されていました。
定義順の都合かもしれませんが少なくとも最大限論理IDに寄せるような動きはしてなさそうに見えます。

 ### デフォルト作成されるリソースを2重定義している
ルートテーブル作成時に自動作成されるlocalルートがテンプレート上で定義されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759852/8ed37e97-74cc-6a99-a6e3-b104cdc83aa6.png)

参考投稿でも触れられていましたが、重複エラーになるようです。

 ## 所感
 めっちゃ簡単でした。
 作成したテンプレートをそのまま即本番運用に使えるとは思わないですが、ゼロから書き起こすよりは圧倒的に効率良く構築できます。

 特に既存環境をIaCに載せるには理想的な機能だと思います。
 逆に、別アカウントに展開する際には手動修正が必要な部分は割とありそうです。

 ピュアなCloudFormation テンプレートで管理するとコードも長くなりますが、
 CDKへの変換も用意されていました。すごい。
 terraformへの変換などはAIさんに頼ればある程度できたりするのかな。
 
 課題もあるようですがクラウドサービスはアップデートありき。今後にも期待しています。
 むしろ100%文句を言われない状態になる前に公開してくれるマインドが大好きです。

 ありがとうございました。