OpenAPI MCP Server中如何使用Terraform Tools

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. 访问阿里云OpenAPI MCP服务创建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将导致资源被重新创建。

    本文提供了一份用于部署DifyTerraform代码,以便于您进行测试。更多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