近年、AIによるコード生成が急速に進化しています。
CursorやCline、Devinなど様々なツールが登場していますが、最近は特にエージェントとしての機能が注目を浴びているように思います。
世はまさに大AIエージェント時代と言っても過言ではないと感じますが、ツールによっては個人で使うには結構な料金が掛かります。
とりあえず無料で使ってみるツールとしては何が良いのだろうと比較している際に、GitHub CopilotがVS Code向けに新しいAIエージェント機能を提供し始めた事を知りました。
GitHub Copilot:エージェントの覚醒

本記事では、GitHub Copilot AgentのFree版を使用してAWS CDKのインフラストラクチャコードを生成してみます。
AIエージェントがどのように開発をサポートし、実用的なコードを生成できるのか、実例を通して検証していきます。

注意: 本記事で紹介するGitHub Copilot AgentはVS Code Insiders版でのみ利用可能です(2025年4月1日時点)。
通常のVSCodeでの利用をご希望の方は、正式リリースをお待ちください。
 

Agent modeがVS Code最新版でサポートされました!
GitHub Copilot を使用した Vibe コーディング: エージェント モードと MCP サポートがすべての VS Code ユーザーに展開されます

使用プラン

本記事ではGitHub Copilot Free版を使用しています。
Free版では以下の制限がありますが、人によっては充分だと思います。

  • 毎月2,000件のコード補完
  • 1か月あたり50件のチャットメッセージ
  • 利用できるモデルはChatGPT-4oとClaude 3.5 Sonnet

準備

VS Code Insidersおよび下記拡張機能をインストールします。

  • GitHub Copilot
  • GitHub Copilot Chat

VS Code Insiders上では、GitHub Copilotのチャット欄下からAgentモードの選択します。

今回モデルはClaude 3.5 Sonnet (Preview)を使用します。

試してみる

今回はCDKを作成するので、下記のような指示をしてみました。

日本語で作業、返答して下さい。
AWS CDK(Python)で下記リソースを作成して下さい。
・API Gateway
・Lambda
・S3

それぞれのリソース名のプレフィックスには「hayashida-test」を付けて下さい。
LambdaはAPI Gatewayから呼び出され、処理の中でS3のファイルを読み取る為適切なロールを付与して下さい。

すると下記のように続行するかを聞かれます。

続行するとターミナルでコマンドが実行されていきます。

この手順を繰り返しながら、進めていきます。

以降も何度かコマンドの提案されて続行していき、下記の実装が進んでいきました。

  • スタックの実装
  • 依存関係のインストール
  • デプロイ準備

途中依存関係のインストールが複数バージョン走っており終わらなかったので、最新の単一のバージョンだけ使用するように指示は必要でした。

最終的にcdk deployを続行するか聞かれましたが、今回はcdk synthまで完了したのでここまでとします。

追加で指示してみる

中身を確認すると所々英語のコメントになっていたので、日本語に修正してもらいます。

確認してみるとちゃんと指示通りプロジェクト内の英語コメントを全て日本語に直してくれました、有能です。

他の人が本プロジェクトを使う事も考えて、READMEも充実させてもらいます。

コード生成完了後のプロジェクト構成

ここまででプロジェクトを確認すると、概ね想定したプロジェクトが出来上がりました。
構成は下記の通りです。

hayashida-test-cdk
├── README.md
├── app.py
├── cdk.json
├── cdk.out
│   ├── HayashidaTestCdkStack.assets.json
│   ├── HayashidaTestCdkStack.template.json
│   ├── asset.f84985b33f2034cce7c2de4208cf3495cf4a8f8bf392d883c192172fd9f6a1eb
│   │   └── index.py
│   ├── asset.faa95a81ae7d7373f3e1f242268f904eb748d8d0fdd306e8a6fe515a1905a7d6
│   │   └── index.js
│   ├── cdk.out
│   ├── manifest.json
│   └── tree.json
├── hayashida_test_cdk
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-311.pyc
│   │   └── hayashida_test_cdk_stack.cpython-311.pyc
│   ├── hayashida_test_cdk_stack.py
│   └── lambda
│   └── index.py
├── requirements-dev.txt
├── requirements.txt
├── source.bat
└── tests
├── __init__.py
└── unit
├── __init__.py
└── test_hayashida_test_cdk_stack.py

実装されたコード

デプロイ前まで実行して出来上がった主なコードは、以下の通りです。

Lambda関数

ざっくりした指示だったのですが、要件は満たせています。
実際には、運用に合わせてもう少し詳細な指示をすると良さそうです。

import json
import boto3

def handler(event, context):
    try:
        s3 = boto3.client('s3')
        bucket_name = 'hayashida-test-bucket'
        file_key = 'test.txt'

        # S3からファイルを読み取る
        response = s3.get_object(Bucket=bucket_name, Key=file_key)
        file_content = response['Body'].read().decode('utf-8')

        return {
            'statusCode': 200,
            'body': json.dumps({
                'message': '成功',
                'content': file_content
            })
        }
    except Exception as e:
        return {
            'statusCode': 500,
            'body': json.dumps({
                'message': 'エラー',
                'error': str(e)
            })
        }

CDKスタック

コードやコメントも分かりやすく、権限設定もきちんと行われています。

from aws_cdk import (
    Stack,
    aws_s3 as s3,
    aws_lambda as _lambda,
    aws_apigateway as apigw,
    aws_iam as iam,
    RemovalPolicy
)
from constructs import Construct

class HayashidaTestCdkStack(Stack):
    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)

        # S3バケットの作成
        bucket = s3.Bucket(
            self, 'HayashidaTestBucket',
            bucket_name='hayashida-test-bucket',
            removal_policy=RemovalPolicy.DESTROY,
            auto_delete_objects=True
        )

        # Lambdaロールの作成
        lambda_role = iam.Role(
            self, 'HayashidaTestLambdaRole',
            assumed_by=iam.ServicePrincipal('lambda.amazonaws.com'),
            role_name='hayashida-test-lambda-role'
        )

        # S3読み取り権限の追加
        lambda_role.add_managed_policy(
            iam.ManagedPolicy.from_aws_managed_policy_name('AWSLambdaBasicExecutionRole')
        )
        bucket.grant_read(lambda_role)

        # Lambda関数の作成
        lambda_fn = _lambda.Function(
            self, 'HayashidaTestFunction',
            function_name='hayashida-test-function',
            runtime=_lambda.Runtime.PYTHON_3_9,
            handler='index.handler',
            code=_lambda.Code.from_asset('hayashida_test_cdk/lambda'),
            role=lambda_role
        )

        # API Gatewayの作成
        api = apigw.RestApi(
            self, 'HayashidaTestApi',
            rest_api_name='hayashida-test-api'
        )

        # APIリソースとメソッドの追加
        api_resource = api.root.add_resource('read-s3')
        api_resource.add_method(
            'GET',
            apigw.LambdaIntegration(lambda_fn)
        )

まとめ

今回は、GitHub Copilot Agentを使用してみました。
人によっては続行するか都度聞いてくる点は面倒に感じるかもしれませんが、実行速度も早く無料とは思えないクオリティでした。
実務での使用ではプロジェクトのルールを遵守する為の工夫は必要なものの、生成AIサービスに課金せずに無料で使いたいという方にはオススメできそうです。
これからも、様々な生成AIサービスを比較しながら使っていこうと思います。

※ ちなみにこの記事もGitHub Copilot Agentに投げて作成してもらい、一部修正して作りました。