BIGLOBEの「はたらく人」と「トガッた技術」

AIチャットと一緒にAWS勉強会の環境作成をしてみた

皆さん初めまして、プロダクト技術本部の加藤です。

BIGLOBEでは、社員のスキル向上と最新技術への理解を深めるために、定期的にAWS勉強会を実施しています!

今回の勉強会用に、私は初めてCloudFormationを使用して環境構築を行いました。その際に、AIを活用してYAMLファイルを生成する方法を試してみました!このブログが、CloudFormationを活用する際に、少しでも役立てば嬉しいです。

AWS勉強会の概要

今回のAWS勉強会では、「Aurora MySQL パッチ適用ワークショップ」をテーマに、パッチ適用や切り戻し時の流れを学びます。実際のパッチ適用を体験してもらうため、本番環境に近しい環境を構築して参加者に提供することになりました。また、生成AIを使用することにしたのは、YAMLファイルの作成に不慣れであったためです。生成AIを活用して、ルールや必要な手順について教えてもらいながらファイルを作成することで、より効率的に作業を進められると考えました。

今回作成する環境の要件は以下となります。

  • VPCを作成。パブリックサブネット1つ、プライベートサブネット2つ
  • パブリックサブネットにEC2を1台、プライベートサブネットにAurora MySQLをreaderとwriterで1台ずつ構築
  • EC2とAuroraにそれぞれSGを作成
  • EC2にはAuroraと通信が出来るように、AuroraもEC2と通信が出来るように設定
  • EC2からAuroraの操作を行うため、EC2にアタッチするロールを作成。必要なポリシーはAuroraの操作権限
  • Aurora MySQLのバージョンは3.05.2を指定して構築する

今回作成する環境の構成図

環境構築の手順

ハンズオン環境作成において以下のような流れで作成しました。

  1. AIチャットツールによるYAMLテンプレートの生成
    まず初めに、ハンズオン環境を迅速かつ効果的に構築するためにAIチャットツールを活用しました。生成AIによって生成されたテンプレートをベースとして、改善を繰り返すことでより適切な形に仕上げていきました。
  2. CloudFormationスタックのデプロイ
    YAMLテンプレートの準備が整った後、AWSマネジメントコンソールでCloudFormationスタックのデプロイを実施しました。デプロイ中に発生したエラーを順次修正することで、コードの完成度を高めていきました。
  3. Instance Connectでの接続確認
    最後に、PoC環境内に構築したEC2インスタンスへInstance Connectを使って接続し、Auroraとの接続が正常に行われていることを確認しました。この手順を通じて、YAMLファイルにより構築された環境が期待通りに動作していることを確かめることができました!

生成AI活用によるYAML作成の流れ

それではAIと一緒にYAMLを作成した経緯を書いていきます!
今回、私が選んだのはClaude-Sonnet(16K)というAIです。選定理由は、返答が明快でわかりやすく、聞いたことに対して適切に答えてくれる印象があり、今回のようなコード生成には適していると考えたからです。また、画像認識の精度が高く、構成図を用いて指示を出す際にも役立つと見込んだ点も大きなポイントでした。

最初の指示文はこのようにしていました。なお初期の段階では要件が少し違います。

加藤
AWSのAurora MySQLのバッチあてを行うワークショップを開きます。
そのためのYAMLファイルを作りたいです。
大まかな構成図は画像の通りで
大まかな要件は下記です。

  • VPCは(10.0.0.0/16)を利用
  • プライベートサブネットを作成
  • プライベートサブネットにEC2を1台、Aurora MySQLをreaderとwriterで1台ずつ構築
  • EC2とAuroraにそれぞれSGを作成
  • EC2にはAuroraと通信が出来るように、AuroraもEC2と通信が出来るように設定
  • EC2からAuroraの操作を行うため、EC2にアタッチするロールを作成。必要なポリシーはAuroraの操作
権限
  • Aurora MySQLのバージョンは「MySQL 3.05.2」を指定して構築する
  • リージョンは東京
  • 他はデフォルト設定(コスト効率を意識して)
この要件でYAMLを作成してください。

生成AI
東京リージョン(ap-northeast-1)でのデフォルト設定を使用して、簡単なYAMLファイルの構成例を以下に示します。この例はAWS CloudFormationを使ってリソースを構築するものです。
AWSTemplateFormatVersion: '2010-09-09'
Description: Aurora MySQLとEC2インスタンスの設定
Resources:
  MyVPC:
    Type: 'AWS::EC2::VPC'
    Properties:
      CidrBlock: '10.0.0.0/16'
      EnableDnsSupport: true
      EnableDnsHostnames: true

  MySubnet:
    Type: 'AWS::EC2::Subnet'
    Properties:
      VpcId: !Ref MyVPC
      CidrBlock: '10.0.1.0/24'
      AvailabilityZone: 'ap-northeast-1a'

(中略)  

  MyDBCluster:
    Type: 'AWS::RDS::DBCluster'
    Properties:
      Engine: aurora-mysql
      EngineMode: provisioned
      EngineVersion: '5.6.mysql_aurora.1.22.2'  # MySQL3.05.2相当
      DatabaseName: mydatabase
      DBSubnetGroupName: !Ref MyDBSubnetGroup
      MasterUsername: admin
      MasterUserPassword: !Sub '${AWS::StackName}-masterpass'
      VpcSecurityGroupIds:
        - !Ref MyAuroraSecurityGroup

  MyDBInstanceWriter:
    Type: 'AWS::RDS::DBInstance'
    Properties:
      DBClusterIdentifier: !Ref MyDBCluster
      Engine: aurora
      DBInstanceClass: db.r5.large
      PubliclyAccessible: false

(以下略)
注意:
KeyNameには、ご自身のSSHキーペア名を入力してください。
ImageIdには、対象のリージョンで利用可能なAMI IDを提供してください。Amazon LinuxなどのAMIを使用することが一般的です。
この例では、基本的にデフォルトまたは指定された設定に基づいてAWSリソースを作成しています。このテンプレートを実行する前に、適切なアクセス許可があることを確認してください。

これで基本的な要件を満たしたYAMLファイルを生成することができましたが、いくつか問題点がありました。

  • EC2はキーペアなしで生成してほしかった。
  • AuroraはReaderとWriter2台必要なので、サブネットは2つ生成する必要があるが、1つしか作成されていない
  • Auroraのエンジンバージョンの指定の書き方が違う

などです。
またこれらのエラーを解決する過程でさらに問題が浮上しました。

  • AMI IDがいつの間にか書き変わっている
  • 生成しないパラメータをRef関数で利用していた
  • 修正したコードを教えないと、元のコードに戻してしまう

指示をしているうちに混乱してきたので、最終的にYAMLファイルを1行ずつ説明してもらうことにしました。

加藤
今できてるYAMLファイルの中身を1行ずつわかりやすく解説して。
生成AI
では、YAMLファイルの主要な部分を1行ずつ、より具体的に解説していきます。
AWSTemplateFormatVersion: '2010-09-09'
Description: Aurora MySQLとEC2インスタンスの設定(デフォルトVPC利用、Amazon Linux 2023)
これは設計図の基本情報です。いつの形式を使っているか、何を作るかを説明しています。
Mappings:
  RegionMap:
    ap-northeast-1:
      AMI: ami-03f584e50b2d32776
これは地域ごとに使うコンピューターの種類(AMI)を決めています。ここではap-northeast-1(東京リージョン)で使うAMIを指定しています。
Resources:
  PrivateSubnet:
    Type: 'AWS::EC2::Subnet'
    Properties:
      VpcId: 
        Fn::ImportValue: !Sub '${AWS::Region}-VPC-ID'
      CidrBlock: '172.31.48.0/20'
      AvailabilityZone: !Select [ 0, !GetAZs '' ]
      MapPublicIpOnLaunch: false
ここでプライベートサブネット(隔離されたネットワーク空間)を作っています。VPCという大きなネットワークの中に作り、IPアドレスの範囲を指定しています。
  MyEC2SecurityGroup:
    Type: 'AWS::EC2::SecurityGroup'
    Properties:
      GroupName: EC2SecurityGroup
      GroupDescription: Allow MySQL from VPC
      VpcId:
        Fn::ImportValue: !Sub '${AWS::Region}-VPC-ID'
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 3306
          ToPort: 3306
          SourceSecurityGroupId: !Ref MyAuroraSecurityGroup
EC2用のセキュリティグループ(ファイアウォール)を作っています。データベースからの接続(ポート3306)を許可しています。
  MyDBSubnetGroup:
    Type: 'AWS::RDS::DBSubnetGroup'
    Properties:
      DBSubnetGroupDescription: Subnet group for Aurora
      SubnetIds:
        - !Ref PrivateSubnet
        - Fn::ImportValue: !Sub '${AWS::Region}-SubnetID1'
データベース用のサブネットグループを作成しています。先ほど作ったプライベートサブネットと、別の場所から持ってきたサブネットを使います。
  MyDBCluster:
    Type: 'AWS::RDS::DBCluster'
    Properties:
      Engine: aurora-mysql
      EngineVersion: '5.7.mysql_aurora.2.11.2'
      DatabaseName: mydatabase
      MasterUsername: admin
      MasterUserPassword: !Sub '${AWS::StackName}-masterpass'
Aurora MySQLクラスター(データベースの集まり)を作成しています。データベース名やユーザー名、パスワードを設定しています。
  MyEC2Instance:
    Type: 'AWS::EC2::Instance'
    Properties:
      InstanceType: t2.micro
      ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", AMI]
      SubnetId: !Ref PrivateSubnet
      SecurityGroupIds:
        - !Ref MyEC2SecurityGroup
      IamInstanceProfile: !Ref MyEC2InstanceProfile
EC2インスタンス(仮想サーバー)を作成しています。サイズや使用するイメージ、配置するサブネット、セキュリティグループを指定しています。
これらの設定が組み合わさって、安全に使えるコンピューターとデータベースの環境が作られます。

コードの基本的な解説を受けて、そこでドキュメントを読み比較することで、エンジンバージョンの書き方が異なっていることや、必要なサブネットが複数あるのに記述が不足していることに気が付くことができました。また、理解を深めるために短縮された関数(例: !Ref)をすべて展開して表記するように依頼し、生成AIの誤りを見抜きながらYAMLの生成を進める方向にシフトしました。
最終的には、少し手直しを加え、自力でワークショップで使用するYAMLファイルを作成することができました!

生成AI活用の利点・課題

AIチャットを使ってYAMLファイルを生成することで、その便利さとともに、課題も見えてきました。まだ使い切れていない部分もありますが、私が感じたメリットとデメリットを共有します。

生成AIのメリット
  1. はじめの一歩を踏み出しやすい
    生成AIは専門知識がなくても、簡単なコードを生成したり、概念やルールを教えてくれます。初心者が専門分野への第一歩を踏み出す際にとても役立ちます。私自身、IaCによるAWSの環境構築を全くの未経験から始め、勉強会のハンズオン環境を作成することができました。生成AIは基本的な概念や作成手順をわかりやすく教えてくれ、全体としての進め方に迷うことはありませんでした。
  2. デバッグに役立つ
    長文やわかりにくいエラーメッセージから根本原因を見つけることは時間がかかる作業です。AIチャットにエラーメッセージを入力すると、エラーの原因を教えてくれるため、適度に活用することで、時間を大幅に短縮できると感じました。
  3. 話しているだけで楽しい
    一人で作業していると気がめいってきますが、生成AIと一緒に会話しながら作業を進めることで、楽しく段階的に作業を進めることができました。作業中にちょっとしたコミュニケーションも楽しめるのが良かったです。
生成AIのデメリット
  1. 誤情報の生成リスク
    生成AIは誤った情報をいかにも正しそうに生成することが度々あります。間違いを見つけて修正するためには、利用者が自分で理解を深める必要があります。今回はコード生成のみだったため、エラーの有無で嘘を見分けることができましたが、専門知識を利用して文章を利用するなどの場合においては嘘を見つけることは初心者には非常に難しいように思います。
  2. 要件を明確化する必要がある
    人間同士では暗黙の了解で省略できる要件も、生成AIに指示する際には明確に伝える必要があります。要件を見落とすとエラーに遭遇したり、生成AIの判断で勝手に要件を書き換えてしまう場合がありました。今回の場合では、リージョンやAZの指定、インスタンスタイプの指定などにおいて、暗黙の了解がありました。
  3. 自分で調べるタイミングがある
    生成AIが出したコードがうまく動作しない場合、エラーの原因をAIチャットで尋ねても誤解していることがあります。生成AIに頼りすぎると、一緒に迷走し、大きな時間を費やすことになり得ます。そこで、AIチャットに頼りきりにせず、自分で調べる時間を設けることが重要だと私は感じました。生成AIがミスを犯した際も、別の視点から自力で発見するための検証が必要です。

おわりに

今回のブログでは、AIチャットツールを用いてCloudFormationのYAMLファイルを生成し、AWS環境を構築する経験を共有しました。AIチャットツールは様々なプロジェクトの最初の一歩を踏み出すことに役立つと感じた一方、取り扱い上の課題や注意点についても知見を得ることができました。
今後は公式のドキュメントやサンプルコード等を事前に学習させた生成AIによるコード生成を試し、より精度の高い支援が受けられるようにしたいと考えています。
ここまでお読みいただきありがとうございました。

※ Amazon、Amazon Web Services、AWS、各種AWSサービスは、Amazon.com, Inc.またはその関連会社の商標または登録商標です。

※ Claude は、Anthropic, PBCの商標または登録商標です。

※ 記載している企業、団体、製品、サービス等の名称は各社またはその関連会社の商標または登録商標です。