Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[LT]生成AIを使ったAWS CloudFormationの書き方

[LT]生成AIを使ったAWS CloudFormationの書き方

Satoshi Kaneyasu

November 11, 2023
Tweet

More Decks by Satoshi Kaneyasu

Other Decks in Programming

Transcript

  1. 6 ⽣成AIを⽤いてCFnを書く流れ STEP1 ChatGPTで質問し、全体像を書いてもらう 1 STEP3 GitHub Copilotの⼊⼒補完を使って埋めていく 3 STEP2

    書いてもらった全体像から、キーワードを拾って公式を⾒る 2 ⼤体こんな 感じです
  2. 8 [STEP1]回答してくれた全体像で構造とキーワードを掴む AWSTemplateFormatVersion: '2010-09-09' Parameters: テンプレートに渡す引数の定義 Resources: EC2Instance: Type: AWS::EC2::Instance

    Properties: SecurityGroupIds: - Ref: EC2SecurityGroup IAMInstanceProfile: !Ref EC2RoleInstanceProfile ・・・ EC2Role: Type: AWS::IAM::Role Properties: ・・・ EC2RoleInstanceProfile: Type: AWS::IAM::InstanceProfile Properties: Roles: - !Ref EC2Role 以下略 ここで押さえたキーワードは、 後で公式を⾒に⾏くのに役⽴ちます
  3. 9 [STEP2] キーワードを拾ってAWS公式サイトを⾒る • ChatGPTが作ったCFnは通る時も通らない時もある。 • 通らない時、⽣成AIに改善を促しても改善しないことがある。 • こうなったら、こだわらずにAWS公式サイトを⾒に⾏くのが吉。 Resources:

    EC2Instance: Type: AWS::EC2::Instance Properties: SecurityGroupIds: - Ref: EC2SecurityGroup IAMInstanceProfile: !Ref EC2RoleInstanceProfile ・・・ EC2Role: Type: AWS::IAM::Role Properties: ・・・ EC2RoleInstanceProfile: Type: AWS::IAM::InstanceProfile このあたりのキーワードで検索し、 AWS公式サイトなどを⾒に⾏く
  4. 10 [STEP2]リソースのプロパティは精度が低め EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: !FindInMap ・・・ KeyName:

    !Ref KeyName InstanceType: !Ref InstanceType SecurityGroups: - !Ref Ec2SecurityGroup BlockDeviceMappings: - DeviceName: /dev/sda1 Ebs: VolumeSize: 50 - DeviceName: /dev/sdm Ebs: VolumeSize: 100 MyDB: Type: AWS::RDS::DBInstance Properties: DBSecurityGroups: - Ref: MyDbSecurityByEC2SecurityGroup - Ref: MyDbSecurityByCIDRIPGroup AllocatedStorage: '5' DBInstanceClass: db.t2.small Engine: MySQL MasterUsername: MyName ManageMasterUserPassword: true MasterUserSecret: KmsKeyId: !Ref KMSKey DeletionPolicy: Snapshot CFnはリソースごとにプロパティの書き⽅がまちまち 似て⾮なる記述が多いので、質問の精度が低いと答え を出しきれないのだろう
  5. 12 [PLUS]テンプレート同⼠の連携も⽣成AI • 実際のCFnはレイヤーごとに分割する • CFn同⼠の連携設定の記述もCopilotの⼊⼒補完がとても効く (今となってはないと⾟い) ネットワーク Resources: VPC:

    Type: AWS::EC2::VPC PublicSubnet1: Type: AWS::EC2::Subnet Outputs: VPC: (略) PublicSubnet1: Value: !Ref PublicSubnet1 Export: Name: !Sub ${Project}-public-subnet-1 アプリケーション WEBServer: Type: AWS::EC2::Instance Properties: InstanceType: !Ref Ec2InstanceType SubnetId: !ImportValue 'Fn::Sub': '${Project}-public-subnet-1ʼ (略) vpc.yml ec2.yml