Console-to-Codeを使って色々なリソースを作ってみる#AWSreInvent

2023.11.30

こんにちは、AWS事業本部の木村です。

AWS Console-to-Code (Preview) というサービスが発表されたので、試し使っていきたいと思います。

今回対象リソースの範囲についてドキュメントに記載が見当たりませんでしたので、どのリソースのテンプレートを作成できるか試していきたいと思います。 また実際に出力されたテンプレートをそのまま利用してリソースの作成できるかを試していきたいと思います。

Console-to-Codeはプレビュー段階ですので、執筆時と情報が変わっている可能性がございますので、その点ご留意ください。

AWS Console-to-Codeについて

AWS Console-to-Codeの機能については、 こちらのアップデートブログにてわかりやすく記載されておりますのでこちらのブログをご確認ください。

いきなりまとめ

以下のリソースはConsole-to-Codeの機能でテンプレートの作成が可能でそのままテンプレートとして利用することが可能でした!

  • EC2インスタンス(アップデートブログより)
  • 起動テンプレート
  • EBSボリューム
  • ライフサイクルポリシー
  • キーペア
  • オートスケーリンググループ

以下のリソースは今回の検証時点では、Console-to-Codeの機能対象となっていないようでした。

  • セキュリティグループ
  • ロードバランサー(ALB)
  • ターゲットグループ

数回作成してみたのですが、うまくConsole-to-Codeのアクションに記録させることができませんでした。

もしかしたら条件次第では記録されることがあるかもしれません。

やってみる

色々なリソースをコンソールで作成してみて、Console-to-Codeの機能の対象になっているのかテンプレートを作成してくれるか試してみたいと思います。

今回作成を試してみたリソースは以下になります。

  • 起動テンプレート
  • EBSボリューム
  • ライフサイクルポリシー
  • セキュリティグループ
  • キーペア
  • ロードバランサー(ALB)
  • 起動テンプレート
  • オートスケーリンググループ

今回試していて、何度か記録されたアクションが消えてしまうタイミングがありました。

テンプレート化したいリソースがある場合には構築後時間をおかずにテンプレートの出力を行なった方が良さそうです。

起動テンプレート

まず起動テンプレートを試してみます。

こちらはConsole-to-Codeの機能の対象でした。

 Here is the generated CloudFormation YAML:

```yaml
Resources:

  TestLaunchTemplate: 
    Type: AWS::EC2::LaunchTemplate
    Properties:
      LaunchTemplateName: test
      LaunchTemplateData: 
        KeyName: test
        ImageId: ami-0fa1ca9559f1892ec  
        InstanceType: t3.nano
        MetadataOptions:
          HttpTokens: required
          HttpEndpoint: enabled
          HttpPutResponseHopLimit: 2
        NetworkInterfaces:
          - DeviceIndex: 0
            Groups: 
              - sg-0e5c79f8cc2096406
```

Reasoning:
- The aws ec2 create-launch-template command is used to create a new launch template, so I have mapped that to an AWS::EC2::LaunchTemplate resource in CloudFormation
- The launch template name, key name, AMI ID, instance type, metadata options, and network interface configuration are all translated from the CLI command options to LaunchTemplateData properties
- The security group ID is specified for the network interface, so I have included that in the Groups list under NetworkInterfaces
- I have included the minimum required properties to match the CLI command, avoiding adding anything extra not specified

実際にテンプレートとして利用して、そのまま作成してみます。

問題なく作成することができました。

EBSボリューム

続いてEBSボリュームです。

こちらもConsole-to-Codeの機能の対象となっていました。

 Here is the generated infrastructure as code:

```yaml
Resources:
  ConsoletocodeVolume: 
    Type: 'AWS::EC2::Volume'
    Properties:
      AvailabilityZone: us-east-1a
      Iops: 3000  
      Throughput: 125
      Size: 1
      VolumeType: gp3
      Tags:
        - Key: Name 
          Value: Consoletocode
```

Reasoning:
- Created a ConsoletocodeVolume resource of type AWS::EC2::Volume based on the aws ec2 create-volume CLI command.
- Set AvailabilityZone, Iops, Throughput, Size, VolumeType properties based on corresponding CLI parameters.
- Added a Name tag with value Consoletocode based on the --tag-specifications parameter in CLI command.

こちらもそのままテンプレートとして利用して、そのまま作成してみます。

こちらも問題なくリソースを作成することができました。

ライフサイクルポリシー

続いてライフサイクルポリシーです。

こちらもConsole-to-Codeの機能の対象となっていました。

```yaml
Resources:
  DLMPolicy: 
    Type: AWS::DLM::LifecyclePolicy
    Properties:
      Description: Consoletest
      ExecutionRoleArn: arn:aws:iam::XXXXXXXXXXXX:role/service-role/AWSDataLifecycleManagerDefaultRole  
      State: ENABLED
      PolicyDetails: 
        PolicyType: EBS_SNAPSHOT_MANAGEMENT
        ResourceTypes: 
          - VOLUME
        TargetTags:
          - 
            Key: Name
            Value: console
        Schedules:
          - 
            Name: Schedule 1
            CreateRule:
              Interval: 12
              IntervalUnit: HOURS  
              Times: 
                - 09:00
            RetainRule: 
              Count: 1
```

Reasoning: The CLI command creates a DLM lifecycle policy, so I created a LifecyclePolicy resource in CloudFormation with the same properties as specified in the CLI command. I used the ExecutionRoleArn, Description, State, and PolicyDetails directly from the CLI. For PolicyDetails, I broke it down into the nested objects for PolicyType, ResourceTypes, TargetTags, and Schedules.

そのままテンプレートとして利用して、そのまま作成してみます。

こちらも問題なくリソースを作成することができました。

セキュリティグループ

続いてセキュリティグループです。

こちらはConsole-to-Codeの機能の対象となっておらず、アクションが記録されていなかったためテンプレートが作成できませんでした。

キーペア

続いてキーペアです。

こちらはConsole-to-Codeの機能の対象となっていました。

 Here is the generated infrastructure as code:

```yaml
Resources:
  ConsoleTestKeyPair: 
    Type: 'AWS::EC2::KeyPair'
    Properties:
      KeyName: consoletest
      KeyType: rsa
```

Reasoning: The aws ec2 create-key-pair CLI command creates an EC2 key pair resource, so I translated that into a CloudFormation resource of type AWS::EC2::KeyPair with matching properties for the key name, type and format specified in the CLI command.

そのままテンプレートとして利用して、そのまま作成してみます。

こちらも問題なくリソースを作成することができました。

ロードバランサー

続いてロードバランサーです。今回はALBで試してみました。

こちらはConsole-to-Codeの機能の対象となっておらず、アクションが記録されていなかったためテンプレートが作成できませんでした。

ターゲットグループ

続いてターゲットグループです。

こちらもConsole-to-Codeの機能の対象となっておらず、アクションが記録されていなかったためテンプレートが作成できませんでした。

オートスケーリンググループ

最後にオートスケーリンググループです。

こちらはConsole-to-Codeの機能の対象となっていました。

 Here is the generated YAML CloudFormation code:

```yaml
Resources:

  MyAutoScalingGroup: 
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
      AutoScalingGroupName: consoletest
      MaxSize: 1
      MinSize: 1
      DesiredCapacity: 1
      HealthCheckGracePeriod: 300
      DefaultInstanceWarmup: -1
      LaunchTemplate: 
        LaunchTemplateId: lt-023a1cfaac9c1152c
        Version: $Default
      VPCZoneIdentifier: 
        - subnet-011c33fa9a5ad441a
        - subnet-05462110c6d1e4e18
      HealthCheckType: EC2
```

Reasoning:
- Created an AWS::AutoScaling::AutoScalingGroup resource named MyAutoScalingGroup based on the CLI command provided
- Set the Properties to match the options specified in the CLI command, including AutoScalingGroupName, MaxSize, MinSize, DesiredCapacity, HealthCheckGracePeriod, DefaultInstanceWarmup, LaunchTemplateId, Version, VPCZoneIdentifier, and HealthCheckType
- Used a YAML list for the VPCZoneIdentifier property to match the multiple subnet IDs provided in the CLI command
- Omitted creation of other resources not specified in the CLI command

そのままテンプレートとして利用して、そのまま作成してみます。

こちらも問題なくリソースを作成することができました。

まとめ

今回は先日リリースされましたConsole-to-Codeでどのリソースでテンプレートが出力できるか検証してみました。

ChatGPTでテンプレートをそのまま利用するとエラーになることが多々あったのですが、今回そのようなエラーは見られませんでした。次回は作成したリソースとテンプレートの乖離についても調べてみて再現性がどの程度あるのかも試してみたいと思います。

現在はプレビュー版でバージニア北部リージョンかつEC2コンソールから作成できる一部のリソースのみの対応でしたが、テンプレートを作成したい場面で大いに役立ちそうだなと感じました!

これが東京リージョンでも使えるようになるのが楽しみです。さらに他のサービスでも使えるようになるかもと思うと夢が広がりますね!

この記事がどなたかの参考になれば幸いです。

以上AWS事業部の木村でした。