Slide 1

Slide 1 text

[LT]⽣成AIを使ったAWS CloudFormationの書き⽅ Satoshi Kaneyasu 2023.11.11

Slide 2

Slide 2 text

2 ⾃⼰紹介 ⽒名︓兼安 聡 所属︓株式会社サーバーワークス 最近興味あるもの︓DevOps、CI/CDパイプライン 趣味︓サックス、筋トレ、CS ゲーム 資格︓ X(Twitter)︓@satoshi256kbyte 好きな⾔葉︓できらぁ︕ など

Slide 3

Slide 3 text

3 このLTについて • ⽣成AIの話に結びつけてInfrastructure as Codeを推すLTです。 • 本LTにおける⽣成AIは、下記ををイメージしています。 • ChatGPT • GitHubCopilot • AWS CodeWhisper

Slide 4

Slide 4 text

4 Infrastructure as Codeのメリット ⾼い再現性によるトライ&エラーのしやすさ 1 差分の可視化によるトレーサビリティの向上 2 ツール連携による⾃動化への道 3 ちなみに、コードのインフラ化をしても設計書は作っています。

Slide 5

Slide 5 text

5 AWS CloudFormationとは • AWS CloudFormationは、AWSのリソースをコードで書いて、 ⾃動的に展開するためのサービスです。(略称CFn) • 真⾯⽬に書くのはかなり⼤変。 • Teraform、AWS CDKの話は今回はスキップします。

Slide 6

Slide 6 text

6 ⽣成AIを⽤いてCFnを書く流れ STEP1 ChatGPTで質問し、全体像を書いてもらう 1 STEP3 GitHub Copilotの⼊⼒補完を使って埋めていく 3 STEP2 書いてもらった全体像から、キーワードを拾って公式を⾒る 2 ⼤体こんな 感じです

Slide 7

Slide 7 text

7 [STEP1]ChatGPTに質問を投げる • [第⼀段階] • [第⼆段階] ALB+EC2+RDSで、Wordpressを実⾏する環境のCloudFormationを書いてください。 EC2はS3にアクセスすることもあります。 各リソースの繋がりの部分を教えてください。

Slide 8

Slide 8 text

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 以下略 ここで押さえたキーワードは、 後で公式を⾒に⾏くのに役⽴ちます

Slide 9

Slide 9 text

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公式サイトなどを⾒に⾏く

Slide 10

Slide 10 text

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はリソースごとにプロパティの書き⽅がまちまち 似て⾮なる記述が多いので、質問の精度が低いと答え を出しきれないのだろう

Slide 11

Slide 11 text

11 [STEP3] GitHub Copilotの⼊⼒補完を使って埋めていく • AWS公式サイトを⾒に⾏くのは正確な属性名・構⽂を確認するため • 属性名が正しいと、Copilotの⼊⼒補完がよく効く (正確な属性名を⼊れる=質問の精度が上がってる︖) MyDB: Type: AWS::RDS::DBInstance Properties: DBSecurityGroups: - Ref: MyDbSecurityByEC2SecurityGroup - Ref: MyDbSecurityByCIDRIPGroup MyDbSecurityByEC2SecurityGroup: Type・・・

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

13 まとめ 1. チャット形式でやりたことを質問 2. 詰まったらキーワードを拾って公式サイトへ︕ 3. 公式サイトで属性名を押さえて、コード補完に期待に切り替える • コードで環境が作れると、感動を覚えますよ︕ • こわくないよ︕ Infrastructure as Code︕

Slide 14

Slide 14 text

No content