全部產品
Search
文件中心

OpenAPI Explorer:OpenAPI MCP Server中如何使用Terraform Tools

更新時間:Sep 26, 2025

Terraform是一種基礎設施即代碼(Infrastructure as Code)工具,基於聲明式配置語言(HashiCorp Configuration Language)定義雲端資源,通過執行Terraform命令實現基礎設施的自動化建立與管理。OpenAPI MCP Server通過整合Terraform的自動化建立能力,利用Terraform工具將Terraform代碼配置於MCP系統中,從而實現AI自主性 + Terraform確定性編排的有效結合。

lQLPJwKcU7tGQHnNBTrNDOSw-Nwm2-VZSyoIqf0EaSNnAA_3300_1338

建立Terraform Tools

  1. 訪問Alibaba Cloud OpenAPI MCP service建立MCP服務,點擊添加Terraform Tools

  2. 在添加Terraform工具頁面,請輸入Terraform工具相關的資訊。

    配置項

    說明

    Terraform Tool 名稱

    Terraform Tool的名稱。

    Terraform Tool 描述

    用於介紹Terraform Tool的功能,或者添加一些特殊說明。

    Terraform Tool

    用於配置Terraform代碼。您可以利用頁面提供的Terraform AI助手產生相應的Terraform代碼,也可以根據實際需求自行編寫Terraform代碼。

    非同步執行

    • ,Agent將在任務執行完成之前保持等待狀態,完成後將返回Terraform Tools的執行結果資訊。

    • ,選擇該項後,OpenAPI MCP Server將自動添加系統工具(QueryTerraformTaskStatus),以便查詢非同步任務的執行狀態。Agent在調用Terraform Tools後,將直接返回任務執行的TaskId。您可以使用該TaskId調用系統工具查詢任務執行狀態。

    說明

    若Terraform代碼特別複雜或執行時間較長時,建議選擇“”,以避免大模型調用逾時。

    刪除策略

    • 不刪除,無論任務執行結果是成功還是失敗,均不會釋放已建立的資源。

    • 總是刪除,無論任務執行結果是成功還是失敗,系統將立即釋放所有已建立的資源。

    • 失敗時刪除,僅在任務執行結果為失敗時,系統將釋放已建立的資源。

    說明

    除了“總是刪除”選項外,其他選項在資源建立後不支援通過Terraform Tools執行資源刪除操作。再次執行Terraform Tools將導致資源被重新建立。

    本文提供了一份用於部署Dify的Terraform代碼,以便於您進行測試。更多Terraform樣本請參見實踐教程

    部署Dify

    provider "alicloud" {
      region = var.region
    }
    
    variable "region" {
      description = "阿里雲地區"
      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 = "執行個體規格必須以 '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 = "系統硬碟類型必須是 cloud_efficiency, cloud_ssd 或 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 = "系統硬碟大小必須在 20-500 GB 之間"
      }
    }
    
    variable "instance_password" {
      description = "ECS執行個體密碼 (至少8位,包含大小寫字母和數字)"
      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 = "密碼必須至少8位,包含大小寫字母和數字"
      }
    }
    
    variable "vpc_cidr" {
      description = "VPC CIDR塊"
      type        = string
      default     = "192.168.0.0/16"
    }
    
    variable "vswitch_cidr" {
      description = "交換器 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 = "公網頻寬必須在 1-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
    }
    
    # 建立交換器
    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         = "Security group for Dify deployment"
      vpc_id              = alicloud_vpc.main.id
    }
    
    # 安全性群組規則 - HTTP
    resource "alicloud_security_group_rule" "http" {
      type              = "ingress"
      ip_protocol       = "tcp"
      nic_type          = "intranet"
      policy            = "accept"
      port_range        = "80/80"
      priority          = 1
      security_group_id = alicloud_security_group.main.id
      cidr_ip           = "0.0.0.0/0"
      description       = "Allow HTTP traffic"
    }
    
    # 安全性群組規則 - 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       = "Allow SSH traffic"
    }
    
    # 安全性群組規則 - HTTPS
    resource "alicloud_security_group_rule" "https" {
      type              = "ingress"
      ip_protocol       = "tcp"
      nic_type          = "intranet"
      policy            = "accept"
      port_range        = "443/443"
      priority          = 1
      security_group_id = alicloud_security_group.main.id
      cidr_ip           = "0.0.0.0/0"
      description       = "Allow HTTPS traffic"
    }
    
    # 建立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 clone失敗"
    
    log "複製環境設定檔..."
    cd docker
    cp .env.example .env || error_exit "複製環境設定檔失敗"
    
    log "啟動Dify服務..."
    docker compose up -d || error_exit "啟動Dify服務失敗"
    
    log "Dify安裝完成!"
    log "訪問地址: 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]
    }
    

    image

在用戶端測試Terraform Tools

本文將在通義靈碼測試Terraform Tools。

  1. 根據在通義靈碼中配置MCP完成OpenAPI MCP Server配置,配置生效後將顯示MCP包含的工具資訊。

    image

  2. 輸入自然語言執行MCP。例如“幫我在中國香港部署dify”。

    image

  3. 由於採用非同步執行方式,Agent將返回TaskId。您可以利用該TaskId迴圈調用系統工具(QueryTerraformTaskStatus)查詢任務的執行狀態。

    image

  4. 您可以通過在瀏覽器中輸入http://<公網IP>來驗證 Dify 是否成功部署。若部署成功,將出現如下截圖,表明Terraform Tool執行成功。

    image