AWS Console-to-Codeを使って自動でコード生成

# AWS Console-to-Codeとは
[AWS re:Invent 2023](https://reinvent.awsevents.com/)でプレビュー版として、AWS Console-to-Codeが発表されました。AWSのマネジメントコンソール上で行われた操作を記録し、AWS CDKやAWS CLI、AWS CloudFormationのコードに変換するサービスです。

2023年12月現在では、バージニア北部リージョン(us-east-1)、そしてEC2のみの対応のプレビュー版です。

https://aws.amazon.com/jp/about-aws/whats-new/2023/11/aws-console-to-code-preview-generate-console-actions/

# 利用手順
EC2の起動アクションをConsole-to-Codeを利用して、CloudFormationのコードに変換する手順です。

## 1. コンソールアクションを記録する
バージニア北部リージョンに変更し、マネジメントコンソールからEC2を起動します。
2023年12月現在では、バージニア北部リージョン以外は対応していません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3434748/9088c0d3-2ef8-c4d2-d739-f73e6f0bceda.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3434748/482fe33a-2131-04a3-69cb-39b72f45fff9.png)

バージニア北部リージョンのEC2マネジメントコンソールの左側メニューに、Console-to-Codeのメニューが表示されています。もしここにConsole-to-Codeが表示されていない場合、リージョンがバージニア北部リージョンになっていない可能性があります。

バージニア北部リージョンで、EC2を立ち上げます。

この作業には特に制限はありませんが、ユーザーデータを利用すると、コードの生成に失敗しました。2023年12月時点では、特にドキュメントにユーザーデータが対象範囲外という記載はありませんが、プレビュー版なので対応していない可能性がありますので、利用時は注意したほうが良いかもしれません。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/console-to-code.html

EC2の起動に成功したら、Console-to-Codeを利用してコードを生成します。

## 2. Console-to-Codeを利用したコード生成
左メニューからConsole-to-Codeを選択すると、以下のような記録されたアクションを確認することができます。今回は、オペレーションがRunInstancesとなっているアクションをコード化します。該当するアクションを選択、CloudFormationのJSONコードの生成ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3434748/953cb59b-ef49-e71e-3ab9-a951294b646e.png)

数十秒待つと、コードの生成が完了し確認することできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3434748/c5571cae-e382-32f6-3e03-ebe8b38838f6.png)

実際に生成されたCloudFormationのJSONコード↓
~~~json:console-to-code.json
{
  "Resources": {
    "EC2Instance": {
      "Type": "AWS::EC2::Instance",
      "Properties": {
        "ImageId": "ami-079db87dc4c10ac91", 
        "InstanceType": "t2.micro",
        "NetworkInterfaces": [
          {
            "AssociatePublicIpAddress": false,
            "DeviceIndex": 0,
            "SubnetId": "subnet-003a1663aa58c3dde",
            "GroupSet": ["sg-01172680009613496"]
          }
        ],
        "TagSpecifications": [
          {
            "ResourceType": "instance",
            "Tags": [
              {
                "Key": "Name",
                "Value": "WebServer"
              }
            ]
          }
        ],
        "MetadataOptions": {
          "HttpTokens": "required",
          "HttpEndpoint": "enabled", 
          "HttpPutResponseHopLimit": 2
        },
        "PrivateDnsNameOptions": {
          "HostnameType": "ip-name",
          "EnableResourceNameDnsARecord": false,
          "EnableResourceNameDnsAAAARecord": false  
        }
      }
    }
  }
}
~~~

## 3. Console-to-Codeの注意事項
Console-to-Codeの画面には以下のような注意書きが表示されています。2023年12月現在では、まだプレビュー版ですので、コードが使えない可能性もあります。

> **生成されたコードは提案であり、環境で使用するには変更が必要な場合があります。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3434748/b4b8a235-a1f2-83ed-7c87-16c6abefbb92.png)

## 4. Console-to-Codeで生成されたコードを使ってみる
Console-to-Codeで生成されたコードが利用可能なのか、どれくらいの修正が必要なのか、確認します。
まずは、コードを修正せずにCloudFormationでスタックを作成してみました。
やはり、生成されたコードをそのまま使うことは出来ませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3434748/72696987-835a-77e4-37da-81df5babfff8.png)

エラーの原因は、リソースタイプが「AWS::EC2::Instance」にも関わらず、「AWS::EC2::LaunchTemplate」用のプロパティである「TagSpecifications」「MetadataOptions」「PrivateDnsNameOptions」「NetworkInterfaces」の4つが含まれていることが原因でした。
リソースタイプが不一致のプロパティを削除することで、スタックの作成は成功しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3434748/762c1380-3865-ec9d-8476-d44b15a217a8.png)

スタック作成に成功した修正後のコード↓
~~~json:console-to-code.json
{
  "Resources": {
    "EC2Instance": {
      "Type": "AWS::EC2::Instance",
      "Properties": {
        "ImageId": "ami-079db87dc4c10ac91", 
        "InstanceType": "t2.micro"
      }
    }
  }
}
~~~

## まとめ
コンソールアクションをコード化してくれるということで、便利なサービスのように思います。ただし現時点ではプレビュー版であり、生成されたコードは修正が必要なため、あまり実用的ではありません。今後のアップデート次第で使いやすくなると期待しています。
CloudFormation初心者としての感想ですが、自分のコンソール操作とCloudFormationのコードを繋げることが出来たので、学習として利用するのも良いと感じました。