すべてのプロダクト
Search
ドキュメントセンター

OpenAPI Explorer:OpenAPI MCP Server での Terraform ツールの使用

最終更新日:Jun 22, 2026

Terraform は Infrastructure as Code (IaC) ツールです。宣言的設定言語である HashiCorp Configuration Language を使用してクラウドリソースを定義し、Terraform コマンドを実行することでインフラストラクチャの作成と管理を自動化します。Terraform の自動化機能を統合することで、OpenAPI MCP Server では Terraform コードを MCP システム内のツールとして設定できます。このアプローチにより、AI エージェントの自律性と Terraform の決定論的なオーケストレーションが融合されます。

lQLPJwKcU7tGQHnNBTrNDOSw-Nwm2-VZSyoIqf0EaSNnAA_3300_1338

Terraform ツールの作成

  1. Alibaba Cloud OpenAPI MCP サービスのページに移動し、MCP サービスを作成して、[Add Terraform Tools] をクリックします。

  2. [Add Terraform Tool] ページで、ツールの情報を入力します。

    パラメーター

    説明

    Terraform ツール名

    ツールの名前です。

    Terraform ツールの説明

    ツールの機能と特記事項を説明します。

    Terraform ツール

    Terraform コードを記述するフィールドです。提供されている Terraform AI アシスタントを使用してコードを生成するか、要件に基づいて手動で記述することができます。

    非同期実行

    • No:AI エージェントはタスクが完了するのを待ってから、実行結果を返します。

    • Yes:OpenAPI MCP Server は、QueryTerraformTaskStatus システムツールを自動的に追加します。AI エージェントが Terraform ツールを呼び出すと、サーバーはすぐに TaskId を返します。この TaskId を使用してシステムツールを呼び出し、タスクの実行ステータスを照会します。

    説明

    Terraform コードが複雑であるか、実行に時間がかかる場合は、[Yes] を選択して大規模言語モデル (LLM) の呼び出しタイムアウトを回避することを推奨します。

    削除ポリシー

    • Never:タスクの成功または失敗にかかわらず、作成されたリソースは解放されません。

    • Always:タスクの成功または失敗にかかわらず、作成されたすべてのリソースは直ちに解放されます。

    • Delete on Failure:タスクが失敗した場合にのみ、作成されたリソースが解放されます。

    説明

    他のオプションでは、リソースが作成された後に Terraform ツールを使用してリソースを削除することはできません。Terraform ツールを再度実行すると、リソースが再作成されます。

    このドキュメントでは、Dify をデプロイするための Terraform サンプルコードを提供します。その他の Terraform の例については、「チュートリアル」をご参照ください。

    Dify のデプロイ

    provider "alicloud" {
      region = var.region
    }
    variable "region" {
      description = "Alibaba Cloud リージョン"
      type        = string
      default     = "cn-hongkong"
    }
    variable "instance_type" {
      description = "ECS インスタンスタイプ"
      type        = string
      default     = "ecs.c9i.xlarge"
      validation {
        condition     = can(regex("^ecs\\.", var.instance_type))
        error_message = "The instance type must start with 'ecs.'"
      }
    }
    variable "system_disk_category" {
      description = "システムディスクタイプ"
      type        = string
      default     = "cloud_essd"
      validation {
        condition     = contains(["cloud_efficiency", "cloud_ssd", "cloud_essd"], var.system_disk_category)
        error_message = "The system disk type must be one of cloud_efficiency, cloud_ssd, or cloud_essd."
      }
    }
    variable "system_disk_size" {
      description = "システムディスクサイズ (GB)"
      type        = number
      default     = 40
      validation {
        condition     = var.system_disk_size >= 20 && var.system_disk_size <= 500
        error_message = "The system disk size must be between 20 GB and 500 GB."
      }
    }
    variable "instance_password" {
      description = "ECS インスタンスのパスワード。長さは 8~30 文字で、大文字、小文字、数字を含む必要があります。"
      type        = string
      sensitive   = true
      validation {
        condition = (
          length(var.instance_password) >= 8 &&
          length(var.instance_password) <= 30 &&
          can(regex("[a-z]", var.instance_password)) &&
          can(regex("[A-Z]", var.instance_password)) &&
          can(regex("[0-9]", var.instance_password))
        )
        error_message = "The password must be 8 to 30 characters long and contain an uppercase letter, a lowercase letter, and a number."
      }
    }
    variable "vpc_cidr" {
      description = "VPC の CIDR ブロック"
      type        = string
      default     = "192.168.0.0/16"
    }
    variable "vswitch_cidr" {
      description = "vSwitch の CIDR ブロック"
      type        = string
      default     = "192.168.1.0/24"
    }
    variable "project_name" {
      description = "プロジェクト名。リソースの命名に使用されます。"
      type        = string
      default     = "dify-deployment"
    }
    variable "internet_max_bandwidth_out" {
      description = "パブリック帯域幅の最大値 (Mbps)"
      type        = number
      default     = 5
      validation {
        condition     = var.internet_max_bandwidth_out >= 1 && var.internet_max_bandwidth_out <= 200
        error_message = "The public bandwidth must be between 1 Mbps and 200 Mbps."
      }
    }
    data "alicloud_zones" "default" {
      available_disk_category     = var.system_disk_category
      available_resource_creation = "VSwitch"
      available_instance_type     = var.instance_type
    }
    # 最新の CentOS 7 イメージを取得
    data "alicloud_images" "centos" {
      owners        = "system"
      name_regex    = "^centos_7"
      most_recent   = true
      instance_type = var.instance_type
    }
    # VPC を作成
    resource "alicloud_vpc" "main" {
      vpc_name   = "${var.project_name}-vpc"
      cidr_block = var.vpc_cidr
    }
    # vSwitch を作成
    resource "alicloud_vswitch" "main" {
      vpc_id       = alicloud_vpc.main.id
      cidr_block   = var.vswitch_cidr
      zone_id      = data.alicloud_zones.default.zones.0.id
      vswitch_name = "${var.project_name}-vswitch"
    }
    # セキュリティグループを作成
    resource "alicloud_security_group" "main" {
      security_group_name = "${var.project_name}-sg"
      description         = "Dify デプロイ用のセキュリティグループ"
      vpc_id              = alicloud_vpc.main.id
    }
    # セキュリティグループルール - HTTP
    resource "alicloud_security_group_rule" "http" {
      type              = "ingress"
      ip_protocol       = "tcp"
      nic_type          = "internet"
      policy            = "accept"
      port_range        = "80/80"
      priority          = 1
      security_group_id = alicloud_security_group.main.id
      cidr_ip           = "0.0.0.0/0"
      description       = "HTTP トラフィックを許可"
    }
    # セキュリティグループルール - SSH
    resource "alicloud_security_group_rule" "ssh" {
      type              = "ingress"
      ip_protocol       = "tcp"
      nic_type          = "intranet"
      policy            = "accept"
      port_range        = "22/22"
      priority          = 1
      security_group_id = alicloud_security_group.main.id
      cidr_ip           = "0.0.0.0/0"
      description       = "SSH トラフィックを許可"
    }
    # セキュリティグループルール - HTTPS
    resource "alicloud_security_group_rule" "https" {
      type              = "ingress"
      ip_protocol       = "tcp"
      nic_type          = "internet"
      policy            = "accept"
      port_range        = "443/443"
      priority          = 1
      security_group_id = alicloud_security_group.main.id
      cidr_ip           = "0.0.0.0/0"
      description       = "HTTPS トラフィックを許可"
    }
    # ECS インスタンスを作成
    resource "alicloud_instance" "dify" {
      instance_name              = "${var.project_name}-instance"
      image_id                   = data.alicloud_images.centos.images[0].id
      instance_type              = var.instance_type
      system_disk_category       = var.system_disk_category
      system_disk_size           = var.system_disk_size
      password                   = var.instance_password
      vswitch_id                 = alicloud_vswitch.main.id
      security_groups            = [alicloud_security_group.main.id]
      internet_max_bandwidth_out = var.internet_max_bandwidth_out
    }
    locals {
      # Dify のインストールと設定
      deploy_dify = base64encode(<<-EOF
    #!/bin/bash
    # Dify 自動インストールスクリプト
    set -e
    # ログ記録関数
    log() {
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> /var/log/dify-install.log
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
    }
    # エラー処理
    error_exit() {
        log "ERROR: $1"
        exit 1
    }
    log "システムパッケージを更新しています..."
    yum update -y || error_exit "システムの更新に失敗しました"
    yum install -y git
    log "Dockerをインストールしています..."
    sudo wget -O /etc/yum.repos.d/docker-ce.repo http://mirrors.cloud.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo
    sudo sed -i 's|https://mirrors.aliyun.com|http://mirrors.cloud.aliyuncs.com|g' /etc/yum.repos.d/docker-ce.repo
    sudo yum -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    log "Dockerサービスを開始しています..."
    systemctl start docker || error_exit "Dockerの起動に失敗しました"
    systemctl enable docker || error_exit "Dockerのブート時の有効化に失敗しました"
    log "アプリケーションディレクトリを作成しています..."
    mkdir -p /opt/dify
    cd /opt/dify
    git clone https://github.com/langgenius/dify.git . || error_exit "difyのクローンに失敗しました"
    log "環境設定ファイルをコピーしています..."
    cd docker
    cp .env.example .env || error_exit "環境設定ファイルのコピーに失敗しました"
    log "Difyサービスを開始しています..."
    docker compose up -d || error_exit "Difyサービスの開始に失敗しました"
    log "Difyのインストールが完了しました!"
    log "アクセスURL: http://$(curl -s ipinfo.io/ip):80"
    log "初回アクセス時に管理者アカウントを作成する必要があります。"
    EOF
      )
    }
    resource "alicloud_ecs_command" "deploy_dify" {
      name            = "deploy_dify"
      type            = "RunShellScript"
      command_content = local.deploy_dify
      timeout         = 600
      working_dir     = "/root"
    }
    resource "alicloud_ecs_invocation" "invocation" {
      instance_id = [alicloud_instance.dify.id]
      command_id  = alicloud_ecs_command.deploy_dify.id
      timeouts {
        create = "10m"
      }
    }
    # インスタンス情報を取得
    data "alicloud_instances" "dify" {
      ids        = [alicloud_instance.dify.id]
      depends_on = [alicloud_instance.dify]
    }
    

    [Add Terraform Tool] パネルで、[Terraform Tool Name]deploydify を設定し、[Terraform Tool Description] に「CentOS Elastic Compute Service (ECS) インスタンスに Dify をデプロイ」と設定します。前の Terraform コードをコードエディターに貼り付けます。[Asynchronous Execution] では [Yes] を選択します。[Deletion Policy] では [Delete on Failure] を選択します。

クライアントでの Terraform ツールのテスト

このセクションでは、Tongyi Lingma で Terraform ツールをテストする方法について説明します。

  1. Tongyi LingmaでMCPを設定するの手順に従って OpenAPI MCP Server をセットアップします。設定後、MCP に含まれるツールが表示されます。

    [terraform-dify] サービスが有効になります。ツールリストには、[Ecs-20140526-DescribeInstances] (ECS インスタンスの照会)、[terraform/deploydify] (CentOS ECS インスタンスへの Dify のデプロイ)、[system-QueryTerraformTaskStatus] (Terraform タスクステータスの照会) の 3 つのツールが含まれます。

  2. 自然言語コマンドを入力して MCP を実行します。例:「中国 (香港) に Dify をデプロイしてください。」

    入力ボックスの左下隅にある [AI agent] タブをクリックしてエージェントモードに切り替え、自然言語コマンドを入力して送信します。

  3. 非同期実行を選択したため、AI エージェントは TaskId を返します。この TaskId を使用してシステムツール (QueryTerraformTaskStatus) を繰り返し呼び出し、タスクの実行ステータスを確認できます。

    AI エージェントはまず terraform-dify/terraform/deploydify ツールを実行してデプロイタスクを開始します。TaskId を受け取った後、QueryTerraformTaskStatus を繰り返し呼び出してステータスをポーリングします。処理中のステータスは Applying です。デプロイが成功すると、デプロイ情報が返されます。リージョンは中国 (香港) (cn-hongkong)、アベイラビリティーゾーンは cn-hongkong-b、インスタンス名は dify-deployment-instance、インスタンスタイプは ecs.c9i.xlarge (4 vCPU、8 GB メモリ) で、パブリック IP アドレスが割り当てられています。

  4. ブラウザーに http://<パブリック IP アドレス> と入力することで、Dify が正常にデプロイされたことを確認できます。デプロイが成功すると、次のページが表示され、Terraform ツールが正常に実行されたことを示します。

    ページには、Dify Community Edition の [Set up your Admin account] インターフェイスが表示されます。これには、[Email][Username][Password] のフィールドが含まれます。パスワードは 8 文字以上で、文字と数字を含む必要があります。情報を入力した後、[Set] をクリックしてセットアップを完了します。