Console to Codeで作成したCloudFormationのテンプレートを検証してみた

**先月の10/10にAWSの新機能、Console-to-Codeが一般提供されました。**

https://aws.amazon.com/jp/about-aws/whats-new/2024/10/general-availability-console-to-code-generate-code/

作成されるCloudFormationのテンプレートに興味があり検証したので、備忘録を記録しておきます。

> 機能は ClassMethod 等で簡単な紹介が公開されています。

 https://dev.classmethod.jp/articles/console-to-code-general-available/

目次 
---
1. [Console-to-Code 機能](#1-console-to-code-%E6%A9%9F%E8%83%BD)
2. [Console-to-Code 料金](#%E3%82%B3%E3%83%BC%E3%83%89-cloudformation%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%81%BE%E3%81%9F%E3%81%AFcdk%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0)
3. [Console-to-Code IAM権限](#3-console-to-code-iam%E6%A8%A9%E9%99%90)
4. [実行手順 ①-1 操作の記録 からAWS CLIコマンドを作成](#4-%E5%AE%9F%E8%A1%8C%E6%89%8B%E9%A0%86--1-%E6%93%8D%E4%BD%9C%E3%81%AE%E8%A8%98%E9%8C%B2-%E3%81%8B%E3%82%89aws-cli%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E4%BD%9C%E6%88%90)
4. [実行手順 ①-2 ウィザード画面（設定画面）の内容 からAWS CLIコマンドを作成](#4-%E5%AE%9F%E8%A1%8C%E6%89%8B%E9%A0%86--2-%E3%82%A6%E3%82%A3%E3%82%B6%E3%83%BC%E3%83%89%E7%94%BB%E9%9D%A2%E8%A8%AD%E5%AE%9A%E7%94%BB%E9%9D%A2%E3%81%AE%E5%86%85%E5%AE%B9-%E3%81%8B%E3%82%89aws-cli%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E4%BD%9C%E6%88%90)
4. [実行手順 ② CloudFormationのテンプレートやCDKのコードを作成](#4-%E5%AE%9F%E8%A1%8C%E6%89%8B%E9%A0%86--cloudformation%E3%81%AE%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%84cdk%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E4%BD%9C%E6%88%90)
5. [Console to Codeの良い点](#5console-to-code%E3%81%AE%E8%89%AF%E3%81%84%E7%82%B9)
6. [CloudFormationテンプレートの問題点・課題](#6cloudformation%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%81%AE%E5%95%8F%E9%A1%8C%E7%82%B9%E8%AA%B2%E9%A1%8C)
7. [最後に](#7%E6%9C%80%E5%BE%8C%E3%81%AB)
[「辞書として使える」CloudFormationの本](#%E8%BE%9E%E6%9B%B8%E3%81%A8%E3%81%97%E3%81%A6%E4%BD%BF%E3%81%88%E3%82%8Bcloudformation%E3%81%AE%E6%9C%AC)
---
## 1. Console-to-Code 機能

**管理コンソールの操作**を**コードに変換**できます。
ここの「**コード**」とは **①AWS CLIコマンド**、**②CloudFormationテンプレートまたはCDKのプログラム**です。
###  **コード① AWS CLIコマンド**
 AWS CLIコマンド作成（管理コンソール操作の変換）には2種類の方法があります。
 + **①-1 操作の記録** から作成
 + **①-2 ウィザード画面（設定画面）の内容** から作成

①-1は実際にリソースを作成した記録からコマンドを作成します。
①-2は管理コンソールの「ウィザード画面」の設定内容からコマンドを作成します。①-1 と異なりリソースの作成が不要です。
 
 :::note info
①-2 管理コンソールの「ウィザード画面」の作成用リンク
現在「EC2インスタンスを起動」「VPCを作成」「Auto Scalingグループの作成」の３つのウィザードで利用可能ですが、実行用のリンクの表示名が異なります。

**EC2インスタンスを起動：『プレビューコード』**
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832079/55246cba-9419-118d-cb7b-bdf35930c472.png width="180">

**VPCを作成：『Preview code』**
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832079/f343ac36-1d46-5d3b-f8c2-683f04ebddf2.jpeg width="350">

**Auto Scalingグループの作成：『コードをプレビューする』**
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832079/5ef861be-fbde-02d8-fc5f-b8ca361c4df2.png>

以下説明では英語表記の **[Preview code]** で記載します。
:::
 
 詳しくは実行手順欄で説明しています。
 
### **コード② CloudFormationテンプレートまたはCDKのプログラム**
 こちらは①で作成したAWS CLIコマンドから作成します。
 ②のことを「infrastructure-as-code (IaC) コード」とも呼んでいます。
Console-to-Code は現在、次の言語と形式でIaCコードを生成できます。
+ CDK Java
+ CDK Python
+ CDK TypeScript
+ CloudFormation JSON
+ CloudFormation YAML

言語と形式はボタンのプルダウンから選択できます。
![q-code.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832079/1c9d0fb8-3f70-561a-42ca-1fe352e5bae8.png)

言語と形式のデフォルトはCloudFormation YAML(CFN YAML)です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832079/dbc877f5-8311-be0c-c10d-404e619de45b.png" width="300" alt="cfn-yml-button.png"><br>

生成AIの**Amazon Q**を利用しています。 

### Console to Code 対応サービス
コード①②の作成は下記サービスが対象です。
+ Amazon EC2
+ Amazon VPC
+ Amazon RDS

対象サービスでは、Web管理コンソール画面右上に「Preview Code」アイコン（矢印）が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832079/f51eae77-e272-bf1e-cd9a-fa06cfe8f462.png)

「**①-2 ウィザード画面（設定画面）の内容** から作成」は「EC2インスタンスを起動」、「VPCを作成」、EC2の「Auto Scalingグループの作成」の３つのウィザード画面が対応しています。

## 2. Console-to-Code 料金
「**①AWS CLIコマンド**」作成に料金はかかりません。
「**②CloudFormationテンプレートまたはCDKのプログラム**」利用はデフォルトではAmazon Q Developer Free 料金階層で動作します。
Free料金階層では回数制限があると記載されていますが、何回までできるかは現在のところ明記されていません。
Pro料金階層はユーザーあたり19USD/月です。IAM Identity CenterのIDで利用が必要です。

https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/console-to-code.html

下記説明引用（意訳）
> Console-to-Code は Amazon Q Developer の一部であるため、その使用は Amazon Q Developer サービスの料金階層に従います。
>
> Amazon Q Developer の料金階層にはFreeレベルとProレベルがあります。
> Free レベルでは、コンソールのアクションを記録し、それらのアクションに基づいて CLI コマンドを生成する操作に月間の固定回数制限はありません。
> ただし、記録したアクションに基づいてAWS CDK または AWS CloudFormation でコードを生成する操作は、月間回数に制限があります。
>
> Proレベルでは、AWS CDKまたはCloudFormationのコードを生成する月間回数に決まった制限はありません。
>
> AWS マネジメントコンソール にサインインすると（特に設定していなければ）Free 利用枠でアクセスします。毎月のコード生成制限に到達した後、さらにコードを生成するためには Pro 階層に認証する必要があります。
> 
> Pro 階層の利用は、IAM Identity Center に登録されたユーザーであり、IAM Identity Center の ID をAmazon Q Developer Pro に登録する必要があります。
> 詳細については、「Amazon Q Developer Pro サブスクリプションへの認証」または AWS 管理者に問い合わせてください。

https://aws.amazon.com/jp/q/developer/pricing/?nc1=h_ls

## 3. Console-to-Code IAM権限
 q:GenerateCodeFromCommands 権限を必要とします。

https://docs.aws.amazon.com/ja_jp/amazonq/latest/qdeveloper-ug/console-to-code.html#console-to-code-permissions

## 4. 実行手順 ①-1 操作の記録 からAWS CLIコマンドを作成

Web管理コンソール画面右上の「Preview Code」アイコン（矢印）をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832079/f51eae77-e272-bf1e-cd9a-fa06cfe8f462.png)

「記録を開始」ボタンで記録を開始します。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832079/b317d802-8d47-0750-7a22-c3bd63086ba5.png width=450>

記録が進行中の画面
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832079/ce9e319f-c19a-6e6a-1cee-318b96481826.png width=450>

記録中Console-to-Codeの画面は閉じることができます。
記録中はアイコンに赤い点が表示されます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832079/fa2e0a9c-0ffc-dfbc-8ef5-29d53b9ecae2.png)

:::note info
ブラウザのタブ内で記録されています。
記録中のブラウザタブを閉じると、記録は消えますのでご注意ください。
:::

#### CLIコマンドをコピー / 表示
Webコンソールで実際に操作すると、操作に相当するAWS CLIコマンドが記録されます。
記録されたアクションはフィルタできます。
+ 設定変更系は「書き込み」タイプ
+ 参照系操作は「読む取り」（？）タイプ
![235545.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832079/bf95a818-7390-36ed-4593-d9d4b339713a.png)

オペレーション（操作）をチェックボックスで選択すると、「CLIをコピー」ボタンでAWS CLIコマンドをコピーできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832079/f13835a7-31ba-d7fd-82f6-80c00ca14d38.png)

 デフォルトでは記録中の画面にコマンドは表示されませんが、オプションで「CLIコマンド」列が表示できます。
 記録画面右上の歯車アイコンから設定します。
![スクリーンショット 2024-10-16 020451.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832079/d89fc717-a0b6-3457-7309-71d5b9b6b314.png)

「CLIコマンド」列を表示した画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832079/553ce22b-5986-3502-27a8-0b1dfeffbbd7.png)

CLIコマンドを表示すると、一行を直接コピーが可能になります。
   ![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832079/263a40d8-efd1-d120-f38d-9abadf80be2b.png)

## 4. 実行手順 ①-2 ウィザード画面（設定画面）の内容 からAWS CLIコマンドを作成
ウィザード画面の設定内容からAWS CLIコマンドを作成します。
繰り返しになりますが、現在対応しているのは下記３つのウィザード画面です。

+ 「EC2インスタンスを起動」
+ 「VPCを作成」
+ 「Auto Scalingグループの作成」

各ウィザード画面の<b>[Preview code]</b>リンクをクリックすると表示します。

<details OPEN><summary><b>「EC2インスタンスを起動」ウィザードの例</b></summary>

「インスタンスを起動」ボタン下の<b> [プレビューコード] </b>リンクでAWS CLIコマンドを表示しています。
インスタンスを起動せずにAWS CLIコマンドが作成できています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832079/8c8477fa-4373-669e-9381-ce4e2ba551fc.png)

</details>

<details><summary> <b>「VPCを作成」 ウィザードの例</b> </summary>
リンクの表示名は <b>[Preview code]</b>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832079/8276394d-16ef-dceb-e4aa-72b01de031e6.png)

</details>

<details><summary> <b>「Auto Scalingグループの作成」ウィザードの例</b></summary>
リンクの表示名は <b>[コードをプレビューする]</b>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832079/3e108d11-6998-0a21-6fbe-be9a305cef89.png)

</details>

:::note info
[Preview code]は、なぜか1回ではうまく表示できず、「記録を開始」が表示されることがあります。
その場合は無視してもう1度[Preview code]リンクをクリックすると表示されます。
:::

## 4. 実行手順 ② CloudFormationのテンプレートやCDKのコードを作成

①-1または①-2 のAWS CLI コマンドからCloudFormationのテンプレートやCDKのコードを作成します。
作成にはアマゾンの生成AIサービス「Amazon Q」を利用しています。
![top](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832079/60af0141-9dde-0772-938f-f6786af9b7d2.png)

#### コードを生成
生成対象のオペレーションにチェックを入れ、「CFN YAMLを生成」ボタンを押します。
 ＊CFN YAML以外を作成する場合はプルダウンで選択

   ![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832079/263a40d8-efd1-d120-f38d-9abadf80be2b.png)
画面に警告がある通り、読み取りタイプのオペレーションにチェックを入れても、生成対象からは無視されます。

:::note info
初回利用時は同意（「許可」ボタン）が必要です。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832079/3ee74940-f23a-3c99-d45c-e4924b7f4e2e.png)
:::


コードが生成されます。1分程度待ちます。 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832079/427e39f3-31c4-41d8-dbb8-240142bc139f.png)

生成したコードはダウンロードも可能です。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832079/7c7580b7-e716-6933-23d7-ff10c33afa86.png)

:::note info
Reasoning: 行に説明が記載されています。
CloudFormation テンプレートでは Reasoning: 行を削除しないと動作しません。
:::
:::note info
時々最初の行に \```yaml 等と表示されることがあります。
これも削除する必要があります。
:::
:::note info
残念ながら、現在のところ②は間違いが多いです。
cfn-lint 等の併用をお勧めします。
*これについては別途記載予定。
:::

## 5.Console to Codeの良い点
#### AWS CLI コマンドの表示は便利
画面操作をAWS CLIコマンドに変換してくれるのは大変便利です。
AWS CLIコマンドオプションは勉強になりますし、AWS CLIコマンドを基にして、Amazon Q Agentとチャットでテンプレート作成させると、修正指示もできて楽です。
(Console to CodeでもAmazon Qへ修正が依頼できるとよいのですが。）

#### CloudFormationテンプレートファイルは可読性が良い
 Amazon Q で作成しているおかげと思われますが、自動で作成しているにも関わらずテンプレートが読みやすいです。
 + 論理ID（論理リソース名）をリソースタイプ等から作成する
 + Nameタグでリソースに名前を登録してくれる

 など、CloudFormation のIaCジェネレーターで作成したテンプレートは読みづらいことを思うと、ここは評価できると思います。
#### CloudFormationテンプレートファイルの設定内容を記載してくれる
 テンプレートファイルの設定概要が記載されており、確認と整理に役立ちます。

## 6.CloudFormationテンプレートの問題点・課題
 CDKは評価できるほど知識がないので、CloudFormationテンプレートのみ確認しました。
#### 1.テンプレートが不正確、不安定
 現時点では下記のような間違いが見つかります。また間違いもたまに出なかったり、と安定しません。
  1. **存在しないプロパティを指定する**
  EC2 instanceで実装されていないプロパティTagSpecifications,MetadataOptionsやインスタンス数のcountなどを設定してしまう。
  なおTagSpecifications,MetadataOptionsなど実装されていないプロパティは、代替策としてEC2の起動テンプレートを利用する等が必要です。<br><br>
  1. **プロパティの大文字小文字を間違える**
  PrivateDNSNameOptions など（"PrivateDnsNameOptions"の間違い）<br><br>
  1. **設定内容を Reasoning: 項目に記載するためエラーとなる**
  テンプレートの説明が Reasoning: 以下に記載されますが、テンプレートの文法上は許されないのでエラーとなります。
  Metadata: にしてほしいところです。<br><br>
  1. **"\```yaml" を先頭に入れてしまう**
  時々混入します。エラーとなります。<br><br>
  1. **AWS::EC2::VPCEndpoint にNameタグをつける**
  CloudFormationには（現状）AWS::EC2::VPCEndpoint にタグが未実装という問題があり、毎回失敗します。
 ＊CloudFormationには「VPCのメインルートテーブルが(Lambda等を利用しないと)設定できない」問題もありますが、これは個別にルートテーブルを作成して対応してくれます。

なお、いずれもフィードバックはしていますので、物によっては改善されているかもしれません。

#### 2. コード生成の上限
   1. **「CFN YAMLを生成」ボタンが無効になる**
  現在のところ、選択したオペレーション数（AWS CLIコマンド数）が多いとボタンが有効化されません。
  21件で「CFN YAMLを生成」ボタンが無効になります。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832079/daeff35f-522d-8abc-0475-68c9f1802a74.png)<br><br>
  1. **コード生成対象のアクション数が多いとエラーとなる**
  選択したオペレーション数（AWS CLIコマンド数）が21件未満で実行できても、数が多いと "Improperly formed request" エラーになることがあります。
  内部でAmazon Q の最大行数を超えた場合に発生するようです。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832079/87514d02-bc95-f2ae-dad9-9906461f2877.png)
  
  Console-to-Codeの画面上では、分けてテンプレートを作成するしかないようです。

これらはQ Developer Pro 料金階層を契約しても変わりませんでした。

### 7.最後に

:::note info
問題点・課題を記載すると、ダメダメなサービスと捉えられてしまう恐れがあるのでフォロー
:::

便利な機能です。特にConsole to Code で作成できるAWS CLIコマンドは色々と利用できます。
作成するCloudFormationテンプレートはまだ問題もありますが、生成AIの意欲的な活用方法であり、上の課題に留意すればたたき台としては充分使えると感じました。

蛇足ですが、Visual Studio Code上のAmazon Q アシスタントで同じことを実行させると、修正を指示でき正確なテンプレート作成が可能でした。
Amazon Qや生成AIの可能性を実感できた検証にもなりました。

---
個人的宣伝
## 「辞書として使える」CloudFormationの本

CloudFormationの辞書として使える本を **詳解 AWS CloudFormation** としてマイナビ出版様から出版していただいています。

https://book.mynavi.jp/ec_products_detail_html/id=143664

[Amazon](http://www.amazon.co.jp/o/ASIN/483998588X/mynavibooks-22/)、[Yodobashi](https://www.yodobashi.com/product/100000009003849795/)、[マイナビ出版](https://book.mynavi.jp/ec/products/detail/id=143664)

この本にはCloudFormationの<b>全機能</b>の説明、コマンドの説明、Webコンソール画面操作や仕様詳細、テンプレートファイル仕様、YAMLフォーマットの説明などを記載しています。
またよく見るエラーの一覧も付記しています。

### 本の補足ファイル等
本をより便利に使えるよう、下記を公開しています。
 - <b>テンプレートファイル</b>
本に記載したテンプレートはすべて[githubで公開](https://github.com/a-shiosalt/DefinitiveGuide2CloudFormation)</b>しています。

https://github.com/a-shiosalt/DefinitiveGuide2CloudFormation

 - [**詳細目次**](https://github.com/a-shiosalt/DefinitiveGuide2CloudFormation/blob/main/book-contents.pdf) <br><b>印刷して本に挟んで利用できる</b>ようにしています。<br>本の目次には章の一階層までしか記載できませんでしたが、この詳細目次には第三～第四階層まで記載しています。

https://github.com/a-shiosalt/DefinitiveGuide2CloudFormation/blob/main/book-contents.pdf

詳細目次は下記としても利用できます。
   - CloudFormationの機能一覧（2章 CloudFormationの機能とコンソール画面）
   - コマンド一覧（3章 コマンド操作）
   - 各一覧表の一覧（8章 シートシート集）

### 本の正誤情報
詳解 CloudFormation の正誤情報です。すみません。
- ネストの説明ページ（[差し替えPDF](https://book.mynavi.jp/files/user/support/9784839985882/9784839985882_171_173p.pdf)）<br>項目 "2-15-7 ネストの更新" ～ "2-15-9 ネストの変更セット：ルートスタックのみ更新" まで更新です。<br>更新ページの[差し替えPDF](https://book.mynavi.jp/files/user/support/9784839985882/9784839985882_171_173p.pdf) をマイナビ出版社で公開していただいています。
- 586ページ ForEachのサンプルで記載ミスがありました。
 githubでは[訂正版を公開](https://github.com/a-shiosalt/DefinitiveGuide2CloudFormation/blob/main/Chapter-4/4-6-2_2-ForEach.yaml)しています。