AI DevelopmentOct 26, 202614 分 READ

AI エージェントで Infrastructure as Code の変更を自動化する

Olususi Oluyemi

フルスタック デベロッパー兼テクニカル ライター

インフラストラクチャ管理は、根本的な変革の時期を迎えています。Infrastructure as Code は、インフラストラクチャをソフトウェアとして扱うことで、クラウドリソースのプロビジョニングと管理の方法をすでに大きく変えました。次の進化のステップは、こうした設定を自律的に理解し、適応させ、最適化できるインテリジェントな自動化です。

エージェント型 AI は、従来のアプローチから新しい世界への転換を意味します。IaC の文脈では、エージェントは大規模言語モデルの推論能力と、クラウドプラットフォームや監視ツールへのインターフェースを組み合わせることができます。これにより、エージェントはインフラストラクチャのコードを生成するだけでなく、その仕組みを理解することもできます。

このチュートリアルでは、AI エージェントをセットアップして、Infrastructure as Code の変更を自動化する方法を学びます。

前提条件

このチュートリアルを進めるには、次のものが必要です。

  • OpenAI API キー
  • 任意のクラウドプロバイダー上のサーバー。このチュートリアルでは AWS のサーバーを使用しますが、どのプロバイダーを使ってもかまいません。AWS の場合は、アクセスキー ID とシークレットが必要です。作成方法はこちらをご覧ください。
  • 次のスコープを持つクラシックの Personal Access Token(PAT)を発行済みの GitHub アカウント
    • repo
    • read:org
    • read:user
    • copilot
  • Infrastructure as Code(IaC)に関する知識
  • 最新版の kind、Helm、kubectl、Docker のインストール

Kubernetes クラスターのセットアップ

このチュートリアルでは Kagent を使用します。Kagent は、ツールサーバーや AI エージェントをセットアップするためのエージェント型 AI フレームワークです。Kagent を使うには、稼働中の Kubernetes クラスターが必要です。すでにクラスターがある場合は、このセクションをスキップしてかまいません。

Docker が起動していることを確認してください。次のコマンドを実行して、新しいクラスターを作成します。

kind create cluster --name kagent-demo

次のコマンドで、作成したクラスターを使用します。

kubectl cluster-info --context kind-kagent-demo

Kagent のセットアップ

Kagent のセットアップには Helm を使用します。CRD(カスタムリソース定義)を含む kagent の Helm チャートをインストールするには、次のコマンドを実行します。

helm install kagent-crds oci://ghcr.io/kagent-dev/kagent/helm/kagent-crds \
  --namespace kagent-demo \
  --create-namespace \
  --wait

次のような出力が表示されます。

NAME: kagent-crds
LAST DEPLOYED: Sat Aug 30 21:20:31 2025
NAMESPACE: kagent-demo
STATUS: deployed
REVISION: 1
TEST SUITE: None

次に、OpenAI の API キーを環境変数に設定します。次のコマンドを実行します。

export OPENAI_API_KEY="your-api-key-here"

次のコマンドで Kagent をインストールします。

helm install kagent oci://ghcr.io/kagent-dev/kagent/helm/kagent \
  --namespace kagent-demo \
  --set app.enabled=true \
  --set providers.openAI.apiKey=$OPENAI_API_KEY

インストールが完了すると、次のようなレスポンスが表示されます。

NAME: kagent
LAST DEPLOYED: Sun Sep 14 16:12:45 2025
NAMESPACE: kagent-demo
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
################################################################################
#                            KAGENT DEPLOYED                                  #
################################################################################

Kagent has been successfully deployed to namespace: kagent-demo

ACCESSING THE UI:
  1. Forward the UI service port:
     kubectl -n kagent-demo port-forward service/kagent-ui 8080:80

  2. Open your browser and visit:
     http://localhost:8080

ACCESSING THE CONTROLLER API:
  kubectl -n kagent-demo port-forward service/kagent-controller 8083:8083

  API endpoint: http://localhost:8083/api

DEPLOYED COMPONENTS:
  - Controller: kagent-controller (manages Kubernetes resources)
  - Engine: kagent-engine (AI agent runtime)
  - UI: kagent-ui (web interface)

Kagent のインストールが完了したら、次は AI のツールサーバーをセットアップします。

ツールサーバーのセットアップ

このチュートリアルでは、GitHub 用と AWS Terraform 用の 2 つのツールサーバーが必要です。これらのツールサーバーにより、AI エージェントは正確な Terraform 設定を生成し、GitHub リポジトリに PR を作成できるようになります。

ツールサーバーのセットアップ方法は 2 つあり、このチュートリアルでは両方を取り上げます。1 つ目は RemoteMCPServer リソースを定義する方法、2 つ目は Kagent の UI を使う方法です。GitHub の MCP サーバーは 1 つ目の方法で、AWS Terraform の MCP サーバーは 2 つ目の方法で追加します。

GitHub MCP サーバーの追加

RemoteMCPServer リソースを定義して、GitHub MCP サーバーをクラスターに追加します。この定義は YAML ファイルに記述します。

iac-agent という名前のフォルダーを作成します。新しいフォルダーの中に、github-mcp.yaml というファイルを作成します。

mkdir iac-agent
cd iac-agent
touch github-mcp.yaml

次のコードを追加します。

apiVersion: kagent.dev/v1alpha2
kind: RemoteMCPServer
metadata:
  name: github-mcp
  namespace: kagent-demo
spec:
  description: My github tool-server
  url: https://api.githubcopilot.com/mcp/
  protocol: STREAMABLE_HTTP
  timeout: 30s
  sseReadTimeout: 300s
  terminateOnClose: true
  headersFrom:
    - name: Authorization
      valueFrom:
        type: Secret
        name: github-mcp-secret
        key: token

注: GitHub MCP サーバーへの接続リクエストは、Personal Access Token を使って認証する必要があります。トークンは別の YAML ファイル(github-mcp-secret)に保存します。

github-mcp-secret.yaml という名前の新しいファイルを作成し、次のコードを追加します。

apiVersion: v1
kind: Secret
metadata:
  name: github-mcp-secret
type: Opaque
stringData:
  token: "Bearer YOUR_GITHUB_PAT"

注: YOUR_GITHUB_PAT は、実際の GitHub Personal Access Token に置き換えてください。

GitHub のシークレットをクラスターに適用します。YAML ファイルがあるディレクトリで、次のコマンドを実行します。

kubectl apply -f github-mcp-secret.yaml --namespace kagent-demo

次のレスポンスが表示されます。

secret/github-mcp-secret created

次に、GitHub MCP サーバーの設定を適用します。

kubectl apply -f github-mcp.yaml --namespace kagent-demo

次のようなレスポンスが表示されます。

remotemcpserver.kagent.dev/github-mcp created

MCP サーバーが正しく追加されたことを確認するには、次のコマンドを実行します。

kubectl get remotemcpservers --namespace kagent-demo
kubectl describe remotemcpservers github-mcp --namespace kagent-demo

リモート MCP サーバー

GitHub MCP サーバーの準備ができたら、Kagent の UI を起動します。次のコマンドを実行します。

kubectl -n kagent-demo port-forward service/kagent-ui 8001:80

これで、Kagent の UI がポート 8001(http://localhost:8001/)で公開されます。ブラウザーで開いてみましょう。

Kagent の UI

Skip wizard をクリックして、kagent のダッシュボードに移動します。

Kagent のダッシュボード

AWS Terraform ツールサーバーのセットアップ

Kagent の UI で Create をクリックし、New Tool Server を選択します。Add Server ボタンをクリックします。

次の内容でフォームに入力します。

基本情報:

  • Server Name: aws-terraform-server
  • Server Namespace: kagent-demo
  • Command Preview: uvx awslabs.terraform-mcp-server@latest

  • Package Name: awslabs.terraform-mcp-server@latest

  • Image: public.ecr.aws/sam/build-provided.al2-x86_64:latest-x86_64
  • Command: npx
  • Arguments: @aws-iac/mcp-server-terraform

環境変数:

  • FASTMCP_LOG_LEVEL: ERROR(または任意のログレベル)

MCP サーバーの追加

Add Server をクリックして完了します。

完了すると、エージェントがベストプラクティス、ドキュメント、モジュール分析の機能にアクセスできるようになったことを知らせる確認メッセージが表示されます。これにより、エージェントは自然言語のリクエストを、実行可能な AWS の Terraform 設定に変換できるようになります。

ツールサーバーの一覧

各ツールサーバーを展開すると、提供されている機能を確認できます。

展開したツールサーバー

注: No tools available のようなメッセージが表示される場合は、Pod がまだ起動していない可能性があります。

必要に応じて、クラスター内の Pod のステータスを確認できます。次のコマンドを実行します。

kubectl get pods -n kagent-demo
NAME                                              READY   STATUS    RESTARTS   AGE
argo-rollouts-conversion-agent-7745d45586-8hfq7   1/1     Running   0          48m
aws-terraform-server-68c7d6f847-jqt4b             1/1     Running   0          11m
cilium-debug-agent-6cf5c7f5d8-k49mv               1/1     Running   0          48m
cilium-manager-agent-6d4bd5bc75-mwxlv             1/1     Running   0          48m
cilium-policy-agent-594ff8d454-nxs8b              1/1     Running   0          48m
helm-agent-7784cb8496-tvh2z                       1/1     Running   0          48m
istio-agent-75bf8fcb79-t2hjf                      1/1     Running   0          48m
k8s-agent-84c75c9b5c-bvzlw                        1/1     Running   0          48m
kagent-controller-7df585ff79-qgdj2                1/1     Running   0          52m
kagent-grafana-mcp-646748498b-22vch               1/1     Running   0          52m
kagent-querydoc-7697fddb9c-dsdwn                  1/1     Running   0          52m
kagent-tools-7dbf78b678-pzltr                     1/1     Running   0          52m
kagent-ui-784fdfb687-r2nmg                        1/1     Running   0          52m
kgateway-agent-7cc679d68-npdj7                    1/1     Running   0          48m
observability-agent-54794f5484-t7rsm              1/1     Running   0          46m
promql-agent-68bf6bc9d6-g5dhk                     1/1     Running   0          48m

すべての Pod のステータスが RUNNING になるまで待ってから、ページを更新してサーバーの最新の状態を確認します。

GitHub リポジトリの作成

次に、AI エージェントが Terraform 設定を自動的に生成し、プルリクエストとして送信する先の GitHub リポジトリを作成します。このリポジトリは、エージェントが管理するインフラストラクチャのコード変更をすべて受け取る場所になります。

このチュートリアルでは、README ファイルだけを含む最小限のリポジトリから始めます。実際の運用では、Terraform 設定がすでにある既存のリポジトリを、エージェントが変更・拡張することになるでしょう。

GitHub で新しいリポジトリを作成する

  1. GitHub にアクセスして、アカウントにログインします。
  2. New ボタンをクリックするか、github.com/new にアクセスします。
  3. リポジトリ名を terraform-iac-agent に設定します。
  4. Public に設定されていることを確認します(このチュートリアルでは必須です)。
  5. README、.gitignore、ライセンスで初期化しないでください。これらはローカルで追加します。
  6. Create repository をクリックします。

ローカルのプロジェクトフォルダーを作成する

iac-agent フォルダーの外に、リポジトリ用の別のプロジェクトフォルダーを作成します。フォルダー名は terraform-iac-agent とします。

mkdir terraform-iac-agent
cd terraform-iac-agent

README.md ファイルを追加し、次の内容を記述します。

# Terraform IAC Agent

This repository contains Terraform configuration files generated by an AI agent to automate infrastructure as code changes on AWS.

ファイルをコミットして、GitHub リポジトリにプッシュします。

git init
git add .
git commit -m "Initial commit"
git remote add origin https://github.com/your-username/terraform-iac-agent.git
git push -u origin main

注: your-username は、実際の GitHub ユーザー名に置き換えてください。このリポジトリの URL は、エージェントの設定で参照します。

AI エージェントの作成

ツールサーバーの設定と対象リポジトリの準備ができたら、ワークフロー全体をオーケストレーションする AI エージェントを作成します。このエージェントは GitHub と AWS Terraform のツールサーバーを組み合わせて、インフラストラクチャの要件を理解し、必要なコードとプルリクエストを自動的に生成します。

エージェントの設定フォルダー(iac-agent)に戻り、aws-terraform-agent.yaml という名前の新しいファイルを作成します。次のコードを追加します。

apiVersion: kagent.dev/v1alpha2
kind: Agent
metadata:
  name: aws-terraform-agent
  namespace: kagent-demo
spec:
  description: IAC agent for generating Terraform configuration
  type: Declarative
  declarative:
    modelConfig: default-model-config
    stream: true
    systemMessage: |
      - You're a helpful AI Agent that helps users automate Infrastructure As Code (IAC) changes
      - You know how to generate valid, efficient and secure Terraform configuration in the form of .tf files.
      - You also know how to work with git to clone repositories, create and update files, commit files to branches, and create pull requests.

      # Instructions
      - You will be provided a list of changes the user wants you to make to the repo. This will include creating new files and/or updating existing files. You will follow these steps:
        - Clone the repository
        - Create a new branch with an appropriate name
        - Create and/or update files as specified in the list of changes
        - Commit the changes to the branch
        - Push the branch to the repo
        - Create a PR to merge the pushed branch into the main branch

      # Rules
      - You can only provide Terraform configuration for AWS cloud provider
      - You only know how to create t3.micro instances (unless user asks for something different) using Amazon Linux 2 AMI
      - Automatically attach an external IP address to the instance
      - Create a security group that allows SSH access (port 22) from anywhere
      - Any resource you create must have the following tags:
        - Creator: terraform-agent
      - Only respond with the Terraform configuration and NOTHING else
      - If anything is unclear please ask the user to clarify and/or provide information.
      - You only have access to one repository with the URL <<INSERT_GITHUB_REPO_URL>>

    tools:
      - type: McpServer
        mcpServer:
          apiGroup: kagent.dev
          kind: RemoteMCPServer
          name: github-mcp
          toolNames:
            - create_branch
            - create_pull_request
            - get_file_contents
            - push_files
            - create_or_update_file
      - type: McpServer
        mcpServer:
          apiGroup: kagent.dev
          kind: MCPServer
          name: aws-terraform-server
          toolNames:
            - SearchAwsccProviderDocs

注: «INSERT_GITHUB_REPO_URL» は、このプロジェクト用に作成した GitHub リポジトリの URL に置き換えてください。

次のコマンドを実行して、エージェントを追加します。

kubectl apply -f aws-terraform-agent.yaml

次のようなレスポンスが表示されます。

agent.kagent.dev/aws-terraform-agent created

エージェントの作成が完了したので、インフラストラクチャのコードを生成して、リポジトリに PR をプッシュできるようになりました。

Kagent の UI(http://localhost:8001/)に移動し、作成したエージェントを選択します。

Kagent の新しいエージェント

注: エージェントが見つからない場合は、port-forward コマンドを再実行してページを更新してみてください。

エージェントとのチャットセッションが開きます。次のプロンプトから始めましょう。

Create a new Terraform configuration file for a t3.micro EC2 instance in us-east-2 region with SSH access

エージェントは、提供されたツールを使って、リクエストされた Terraform 設定を生成し、GitHub リポジトリにプルリクエストを作成します。GitHub リポジトリには、承認待ちの新しいプルリクエストが届いています。

Kagent が作成した新しい PR

PR をマージする前に、自動化プロセスに最後のステップを追加する必要があります。

CircleCI との連携

Terraform 設定の生成とプッシュを自動化できたのと同じように、CircleCI を使って Terraform 設定のデプロイも自動化できます。

そのためには、terraform-iac-agent リポジトリ(先ほど作成した GitHub リポジトリ)のルートに .circleci フォルダーを作成し、その中に config.yml ファイルを作成します。config.yml ファイルを開き、次の内容を追加します。

version: 2.1

orbs:
  aws-cli: circleci/aws-cli@5.4.1
  terraform: circleci/terraform@3.7.0

workflows:
  validate_and_deploy:
    jobs:
      - validate_and_format_terraform
      - deploy_terraform:
          context: dev-iac
          requires:
            - validate_and_format_terraform

jobs:
  validate_and_format_terraform:
    executor: terraform/default
    steps:
      - checkout
      - terraform/init
      - run:
          name: Format Terraform
          command: terraform fmt -recursive
      - terraform/validate

  deploy_terraform:
    executor: terraform/default
    steps:
      - checkout
      - aws-cli/setup
      - terraform/init
      - terraform/plan
      - terraform/apply

この設定ファイルでは、AWS-CLI と Terraform の Orb を使ってステップを実行します。validate_and_deploy ワークフローは、Terraform の Orb を使って Terraform 設定を検証し、変更を AWS のサーバーに適用します。AWS への接続には AWS CLI を使用します。

また、Terraform の変更を正しくデプロイするには、Amazon の認証情報を提供する必要があります。そのために、CircleCI のコンテキストを使用します。

AWS の認証情報用のコンテキストを追加する

CircleCI のダッシュボードで、サイドバーのリンクをクリックして Organization Settings ページに移動します。

Contexts をクリックし、Create Context ボタンをクリックします。コンテキストに一意の名前を付けます。作成したコンテキストは、セキュリティが All members に設定された状態で一覧に表示されます。これは、組織内の誰もが実行時にこのコンテキストにアクセスできることを意味します。このチュートリアルの .circleci/config.yml で指定しているとおり、コンテキスト名は dev-iac にする必要があります。

コンテキストの作成

次に、dev-iac コンテキストを選択し、Add Environment Variable をクリックして、次の変数を入力します。

  • AWS_ACCESS_KEY_ID - 先ほど作成した IAM ロールの AWS アクセスキー ID
  • AWS_SECRET_ACCESS_KEY - 先ほど作成した IAM ロールの AWS シークレットキー

アプリケーションと CircleCI の連携

プロジェクトのダッシュボードに移動します。terraform-iac-agent リポジトリを探して、Set Up Project をクリックします。

プロジェクトの選択

コードが保存されている GitHub のブランチ名を入力し、Set Up Project をクリックします。

最初のワークフローが実行され、正常に完了します。

最初のワークフロー

インスタンスが作成されたことを確認するには、AWS ECS インスタンスコンソールにアクセスします。

AWS インスタンス

まとめ

このチュートリアルでは、Infrastructure as Code の変更を自動化する AI エージェントを構築しました。日常のコミュニケーションで使うような自然言語のリクエストを使って、インフラストラクチャを変更できます。このシステムでは、3 つの専門エージェントが連携して動作します。AWS のベストプラクティスを理解する Terraform エージェント、バージョン管理を担う GitHub エージェント、そしてワークフロー全体をオーケストレーションする AWS IaC エージェントです。

このチュートリアルの完全なコードは、こちらのリポジトリにあります。

このアプローチは、ほかのクラウドプロバイダーにも応用でき、さらに機能を追加して拡張することもできます。これにより、必要なガバナンスとレビューのプロセスを維持しながら、自律的なインフラストラクチャ管理の基盤をチームにもたらすことができます。