0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS】Console-to-Code使ってみた(IaC)

0
Posted at

はじめに

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は簡易的なリソース構成での検証用途に向いていそうです。

今回コード化するインフラ構成図

test.png

Console-to-Code使ってみる

AWSコンソールにアクセスしたら、画面右上にあるアイコンを押します。

SCR-20260413-ltyj.png

記録を開始を押します。

SCR-20260413-luii.png

記録が開始されました。

SCR-20260413-luuc.png

次は実際にAWSコンソール上で手動で構築していくのですが、詳しい手順に関してはこちらの記事をご参照ください。

AWSコンソール上の操作がすべて記録されていきます。
手動での構築が完了したら、停止を押します。

SCR-20260413-lydw.png

①記録されたアクションの中から、コード化したいものを選択します。今回はすべてにチェックを入れてみました。
②「コードをエクスポート」のタブを開きます。
CloudFormation YAMLを選択します。

SCR-20260413-lyyl.png

実際に作成されたテンプレート(一部***でマスクしています)

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」の方がおすすめです。
(作成直後にしか使えないというデメリットはあります)

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?