はじめに
AWSにはIaCコードを作成するための便利な機能がいくつか用意されていますが、今回はその中の一つである「Console-to-Code」を実際に使ってみました。
「IaCジェネレーター」使ってみた記事もぜひご参照ください。
AWS Console-to-Codeとは
AWS Console-to-Codeとは、AWSマネジメントコンソール上で作成・変更したリソースを、Infrastructure as Code(IaC)として自動生成する機能です。
IaCジェネレーターとの違い
比較表(ChatGPT調べ)
| 項目 | Console-to-Code | IaCジェネレーター |
|---|---|---|
| 元データ | 操作履歴 | 現在のリソース状態 |
| IaCタイミング | 作成直後 | いつでも |
| 用途 | 学習・試作 | 既存環境のIaC化 |
| 完成度 | 低め(冗長) | 高め(構造化される) |
Console-to-Codeは「操作ログベース」
IaCジェネレーターは「現状リソース解析ベース」
といった違いがあり、Console-to-Codeは簡易的なリソース構成での検証用途に向いていそうです。
今回コード化するインフラ構成図
Console-to-Code使ってみる
AWSコンソールにアクセスしたら、画面右上にあるアイコンを押します。
記録を開始を押します。
記録が開始されました。
次は実際にAWSコンソール上で手動で構築していくのですが、詳しい手順に関してはこちらの記事をご参照ください。
AWSコンソール上の操作がすべて記録されていきます。
手動での構築が完了したら、停止を押します。
①記録されたアクションの中から、コード化したいものを選択します。今回はすべてにチェックを入れてみました。
②「コードをエクスポート」のタブを開きます。
③CloudFormation YAMLを選択します。
実際に作成されたテンプレート(一部***でマスクしています)
AWSTemplateFormatVersion: '2010-09-09'
Description: 'CloudFormation template generated from AWS CLI commands - Creates VPC infrastructure with EC2 instance'
Resources:
# Create VPC with CIDR block 10.0.0.0/16
TestVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsHostnames: true
EnableDnsSupport: true
InstanceTenancy: default
Tags:
- Key: Name
Value: test-vpc
# Create Internet Gateway for VPC internet connectivity
TestInternetGateway:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: test-igw
# Attach Internet Gateway to VPC
AttachGateway:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref TestVPC
InternetGatewayId: !Ref TestInternetGateway
# Create public subnet in availability zone apne1-az4
PublicSubnetA:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref TestVPC
CidrBlock: 10.0.1.0/24
AvailabilityZone: !Select
- 0
- !GetAZs ''
MapPublicIpOnLaunch: false
Tags:
- Key: Name
Value: public-subnet-a
# Create route table for public subnet
TestRouteTableA:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref TestVPC
Tags:
- Key: Name
Value: test-rt-a
# Create route to Internet Gateway for internet access
PublicRoute:
Type: AWS::EC2::Route
DependsOn: AttachGateway
Properties:
RouteTableId: !Ref TestRouteTableA
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref TestInternetGateway
# Associate route table with public subnet
SubnetRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnetA
RouteTableId: !Ref TestRouteTableA
# Create security group with HTTP access
TestSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupName: test-sg
GroupDescription: test-sg
VpcId: !Ref TestVPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
Tags:
- Key: Name
Value: test-sg
# Launch EC2 instance in public subnet with security group
TestEC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-***
InstanceType: t2.micro
SubnetId: !Ref PublicSubnetA
SecurityGroupIds:
- !Ref TestSecurityGroup
UserData:
Fn::Base64: 'PLEASE ADD YOUR DATA BACK IN HERE'
CreditSpecification:
CPUCredits: standard
MetadataOptions:
HttpEndpoint: enabled
HttpPutResponseHopLimit: 2
HttpTokens: required
NetworkInterfaces:
- AssociatePublicIpAddress: true
DeviceIndex: 0
SubnetId: !Ref PublicSubnetA
GroupSet:
- !Ref TestSecurityGroup
DeleteOnTermination: true
PrivateDnsNameOptions:
HostnameType: ip-name
EnableResourceNameDnsARecord: false
EnableResourceNameDnsAAAARecord: false
Tags:
- Key: Name
Value: test-server
Outputs:
VPCId:
Description: VPC ID
Value: !Ref TestVPC
Export:
Name: !Sub '${AWS::StackName}-VPC-ID'
InternetGatewayId:
Description: Internet Gateway ID
Value: !Ref TestInternetGateway
Export:
Name: !Sub '${AWS::StackName}-IGW-ID'
PublicSubnetId:
Description: Public Subnet ID
Value: !Ref PublicSubnetA
Export:
Name: !Sub '${AWS::StackName}-PublicSubnet-ID'
SecurityGroupId:
Description: Security Group ID
Value: !Ref TestSecurityGroup
Export:
Name: !Sub '${AWS::StackName}-SG-ID'
InstanceId:
Description: EC2 Instance ID
Value: !Ref TestEC2Instance
Export:
Name: !Sub '${AWS::StackName}-Instance-ID'
InstancePublicIP:
Description: Public IP address of the EC2 instance
Value: !GetAtt TestEC2Instance.PublicIp
使ってみた感想
裏でAI(Amazon Q)がコードを生成しているということもあり、そのまま使っても良さそうなくらい、かなり実用的なIaCコードが生成されました。
インフラの構成が複雑になるにつれて、コードの質がどこまで保証されるかはわかりませんが、簡易的な構成であれば個人的には「IaCジェネレーター」よりもこの「Console-to-Code」の方がおすすめです。
(作成直後にしか使えないというデメリットはあります)





