[AmazonQ Developer]Console-to-Codeを試してみた。（RDS編）

## はじめに

JAWS-UG札幌にて、Amazon Q Developerのワークショップを開催して頂いたので、早速いくつか試してみます！

まずは、[@katzueno](https://x.com/katzueno)様、ありがとうございました！

https://jawsug-sapporo.connpass.com/event/330317/

今回はコンソールの操作を記録して、IaCツールのフォーマットへ変換してくれるConsole-to-Codeについてです。

## Console-to-Codeってなに？

> コンソールには、リソースの作成とプロトタイプのテストを行うためのガイド付きのパスが用意されています。同じリソースを大規模に作成する場合は、オートメーションコードが必要です。 Console-to-Code は、オートメーションコードの開始に役立つ Amazon Q Developer の機能です。 Console-to-Codeは、デフォルト設定や互換性のあるパラメータを含むコンソールアクションを記録します。次に、生成 AI を使用して、必要なアクションに任意の infrastructure-as-code (IaC ) 形式のコードを提案します。コンソールワークフローは、指定したパラメータ値が一緒に有効であることを確認するため、 を使用して Console-to-Code生成するコードには互換性のあるパラメータ値があります。このコードを出発点として使用し、特定のユースケースの本番環境に対応するようにカスタマイズできます。

https://docs.aws.amazon.com/ja_jp/ec2/latest/devguide/console-to-code.html

ユーザが操作していない初期値も含めて、IaCツールのフォーマットを作ってくれるツールみたいです。

今までは、とりあえずコンソール上で手動作成して、その後にIaCで作成し直す…なんでことがあり、それなりの工数が必要でしたが、それが不要になりそうです！

現在、IaC化可能な対象は以下の通りです。

* CDK Java
* CDK Python
* CDK TypeScript
* CloudFormation JSON
* CloudFormation YAML

対象リソースについては、以下の通り。（2024/11/1時点）

* Amazon EC2
* Amazon VPC
* Amazon RDS

## さっそく試してみる！

### まずはConsole-to-Codeの有効化。

画面右端の赤枠のところから操作可能。

![スクリーンショット 2024-11-01 5.18.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/8f53dbb6-a767-f12e-3dc2-83d7c550fa99.png)

「記録を開始」で、操作の記録が開始されます。

![スクリーンショット 2024-11-01 5.20.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/c62e6bf3-459b-a6b9-af4e-abf8c2a39f73.png)

### RDSインスタンスの作成

今回はSQLServerを別件で触る予定があったので、ほぼデフォルト設定で作ってみます。

マスターユーザの管理はSeacrets Managerを利用し、セキュリティグループは新規に適当に作成しました。

![スクリーンショット 2024-11-01 5.23.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/b767f5b2-14df-98c9-59a0-8520dfa46500.png)


### 記録の停止

一通り操作し終わったら「停止」を押下して、記録を止めます。

記録されたアクションには、DBインスタンス、セキュリティグループとのそのインバウンドルールを作ったことが記載されてました。

![スクリーンショット 2024-11-01 4.20.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/c13b679e-b21a-99d0-96b7-ef447e8e6eea.png)

### 作成対象を選択し、IaC化！

書き込み操作を全て選択し、`CFN YAMLを作成`ボタンでIaC化してみます！

![スクリーンショット 2024-11-01 4.24.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/ac7158a0-7218-6650-cada-8379db9cfb61.png)

初回だけ、同意が必要です。

![スクリーンショット 2024-11-01 5.31.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/83189cf9-00e0-0217-7dca-2328942fffba.png)

### 出来上がったyaml

こんなyamlができました。

```yaml
Resources:
  SQLServerSG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: SQLServerSG
      GroupDescription: Created by RDS management console
      VpcId: vpc-0497180e1b4818371
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 1433
          ToPort: 1433
          CidrIp: 60.69.219.227/32

  SQLServerInstance:
    Type: AWS::RDS::DBInstance
    Properties:
      Engine: sqlserver-ex
      EngineVersion: 15.00.4395.2.v1
      LicenseModel: license-included
      DBInstanceIdentifier: SQLServer
      MasterUsername: admin
      DBInstanceClass: db.t3.small
      DBSubnetGroupName: mori-vpc
      VPCSecurityGroups: 
        - !Ref SQLServerSG
      AvailabilityZone: ap-northeast-1a
      Port: 1433
      StorageType: gp3
      AllocatedStorage: 20
      BackupRetentionPeriod: 0
      PerformanceInsightsRetentionPeriod: 7
      MonitoringRoleArn: arn:aws:iam::111111111111:role/rds-monitoring-role
      MonitoringInterval: 60
      DBParameterGroupName: default.sqlserver-ex-15.0
      OptionGroupName: default:sqlserver-ex-15-00
      MaxAllocatedStorage: 1000
      NetworkType: IPV4
      CACertificateIdentifier: rds-ca-rsa2048-g1
```

あと、こんな説明についても、出力されています。

```
Reasoning: {The provided CLI commands create an EC2 security group named "SQLServerSG" with an ingress rule allowing TCP traffic on port 1433 from the IP 60.69.219.227/32. It also creates an RDS DB instance named "SQLServer" with SQL Server Express 15.00.4395.2.v1 as the engine, using the license-included model. The instance is configured with a t3.small instance class, using the "mori-vpc" subnet group, and associated with the "SQLServerSG" security group. Other properties like storage, backup retention, monitoring, parameter group, and option group are set based on the CLI parameters. The generated CloudFormation template creates the corresponding resources with the specified properties.}
```

### 生成されたyamlで実際にスタックを作ってみる。

作成されたyamlは、テンプレートバージョンの指定がないので`AWSTemplateFormatVersion: 2010-09-09`を先頭に追加して、CloudFormationでスタックを作ってみます。

・・・あれ？マスターパスワードのところでエラーが出てますね。

Seacrets Managerのリソース作成が対応していないのが原因？

![スクリーンショット 2024-11-01 5.40.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/bf8f3a88-60eb-aba0-baee-d61750a35b5d.png)

### 手動でマスターパスワードを設定した場合は？

セルフマネージドで設定した場合も試してみます。

![スクリーンショット 2024-11-01 4.43.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/0e2f9bd6-0a2d-9c91-3176-04eda0f9eae2.png)

一つエラーが出ましたが、そこだけ手動で直せば無事作成できました！

```diff
+ AWSTemplateFormatVersion: 2010-09-09
Resources:
  SQLServerDBInstance:
    Type: AWS::RDS::DBInstance
    Properties:
      Engine: sqlserver-ex
      EngineVersion: 15.00.4395.2.v1
      LicenseModel: license-included
      DBInstanceIdentifier: SQLServer-OrginMasterPasswordCfn
      MasterUsername: admin
      DBInstanceClass: db.t3.small
      DBSubnetGroupName: mori-vpc
      VPCSecurityGroups:
        - !Ref SQLServerSG
      AvailabilityZone: ap-northeast-1a
      Port: 1433
      StorageType: gp3
      AllocatedStorage: 20
      BackupRetentionPeriod: 7
+      EnablePerformanceInsights: true
      PerformanceInsightsRetentionPeriod: 7
      MonitoringRoleArn: arn:aws:iam::111111111111:role/rds-monitoring-role
      MonitoringInterval: 60
      DBParameterGroupName: default.sqlserver-ex-15.0
      OptionGroupName: default:sqlserver-ex-15-00
      MaxAllocatedStorage: 1000
      NetworkType: IPV4
      CACertificateIdentifier: rds-ca-rsa2048-g1
      MasterUserPassword: adminadmin
  SQLServerSG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: SQLServerSG_usepass_Cfn
      GroupDescription: Created by RDS management console
      VpcId: vpc-0497180e1b4818371
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 1433
          ToPort: 1433
          CidrIp: 60.69.219.227/32
```

## さいごに

まだま今後に期待！って感じですが、
将来的にはIaC化の効率化にとても役に立ちそうでわくわくしました！