Tous les produits
Search
Centre de documentation

OpenAPI Explorer:Utiliser les outils Terraform dans OpenAPI MCP Server

Dernière mise à jour :Aug 11, 2026

Terraform est un outil d'infrastructure as code. Il utilise un langage de configuration déclaratif, le HashiCorp Configuration Language, pour définir les ressources cloud et automatise la création et la gestion de l'infrastructure en exécutant des commandes Terraform. En intégrant les capacités d'automatisation de Terraform, OpenAPI MCP Server vous permet de configurer du code Terraform sous forme d'outils dans le système MCP. Cette approche combine l'autonomie des agents IA avec l'orchestration déterministe de Terraform.

lQLPJwKcU7tGQHnNBTrNDOSw-Nwm2-VZSyoIqf0EaSNnAA_3300_1338

Créer un outil Terraform

  1. Accédez à la page pour créer un service MCP, puis cliquez sur Add Terraform Tools.

  2. Sur la page Add Terraform Tool, saisissez les informations relatives à votre outil.

    Paramètre

    Description

    Nom de l'outil Terraform

    Nom de l'outil.

    Description de l'outil Terraform

    Décrit la fonction de l'outil ainsi que toute remarque particulière.

    Outil Terraform

    Champ destiné à votre code Terraform. Vous pouvez utiliser l'assistant IA Terraform fourni pour générer le code ou le rédiger manuellement selon vos besoins.

    Exécution asynchrone

    • No : l'agent IA attend la fin de la tâche, puis renvoie les résultats d'exécution.

    • Yes : OpenAPI MCP Server ajoute automatiquement l'outil système QueryTerraformTaskStatus. Une fois que l'agent IA a appelé l'outil Terraform, le serveur renvoie immédiatement un TaskId. Utilisez ce TaskId pour appeler l'outil système et interroger l'état d'exécution de la tâche.

    Remarque

    Si votre code Terraform est complexe ou nécessite un temps d'exécution long, sélectionnez Yes afin d'éviter les délais d'expiration lors de l'appel au modèle de langage large (LLM).

    Politique de suppression

    • Never Delete : les ressources créées ne sont pas libérées, que la tâche aboutisse ou échoue.

    • Always Delete : toutes les ressources créées sont immédiatement libérées, que la tâche aboutisse ou échoue.

    • Delete on Failure : les ressources créées sont libérées uniquement si la tâche échoue.

    Remarque

    Avec les autres options, vous ne pouvez pas utiliser l'outil Terraform pour supprimer les ressources après leur création. L'exécution renouvelée de l'outil Terraform recrée les ressources.

    Cette rubrique fournit un exemple de code Terraform pour déployer Dify. Pour davantage d'exemples Terraform, consultez le tutoriel.

    Déployer Dify

    provider "alicloud" {
      region = var.region
    }
    variable "region" {
      description = "The Alibaba Cloud region"
      type        = string
      default     = "cn-hongkong"
    }
    variable "instance_type" {
      description = "The ECS instance type"
      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 = "The system disk type"
      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 = "The system disk size in 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 = "The password for the ECS instance. It must be 8 to 30 characters long and contain an uppercase letter, a lowercase letter, and a number."
      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 = "The CIDR block for the VPC"
      type        = string
      default     = "192.168.0.0/16"
    }
    variable "vswitch_cidr" {
      description = "The CIDR block for the vSwitch"
      type        = string
      default     = "192.168.1.0/24"
    }
    variable "project_name" {
      description = "The project name, used for naming resources"
      type        = string
      default     = "dify-deployment"
    }
    variable "internet_max_bandwidth_out" {
      description = "The maximum public bandwidth in 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
    }
    # Get the latest CentOS 7 image
    data "alicloud_images" "centos" {
      owners        = "system"
      name_regex    = "^centos_7"
      most_recent   = true
      instance_type = var.instance_type
    }
    # Create a VPC
    resource "alicloud_vpc" "main" {
      vpc_name   = "${var.project_name}-vpc"
      cidr_block = var.vpc_cidr
    }
    # Create a 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"
    }
    # Create a security group
    resource "alicloud_security_group" "main" {
      security_group_name = "${var.project_name}-sg"
      description         = "Security group for Dify deployment"
      vpc_id              = alicloud_vpc.main.id
    }
    # Security group rule - 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"
    }
    # Security group rule - 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"
    }
    # Security group rule - 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"
    }
    # Create an ECS instance
    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 {
      # Install and configure Dify
      deploy_dify = base64encode(<<-EOF
    #!/bin/bash
    # Dify auto-installation script
    set -e
    # Logging function
    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 handling
    error_exit() {
        log "ERROR: $1"
        exit 1
    }
    log "Updating system packages..."
    yum update -y || error_exit "Failed to update the system"
    yum install -y git
    log "Installing 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 "Starting Docker service..."
    systemctl start docker || error_exit "Failed to start Docker"
    systemctl enable docker || error_exit "Failed to enable Docker at boot"
    log "Creating application directory..."
    mkdir -p /opt/dify
    cd /opt/dify
    git clone https://github.com/langgenius/dify.git . || error_exit "Failed to clone dify"
    log "Copying environment configuration file..."
    cd docker
    cp .env.example .env || error_exit "Failed to copy environment configuration file"
    log "Starting Dify service..."
    docker compose up -d || error_exit "Failed to start Dify service"
    log "Dify installation complete!"
    log "Access URL: http://$(curl -s ipinfo.io/ip):80"
    log "The administrator account must be created on the first visit."
    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"
      }
    }
    # Get instance information
    data "alicloud_instances" "dify" {
      ids        = [alicloud_instance.dify.id]
      depends_on = [alicloud_instance.dify]
    }
    

    Dans le panneau Add Terraform Tool, définissez Terraform Tool Name sur deploydify et Terraform Tool Description sur Deploy Dify in a CentOS ECS instance. Collez le code Terraform précédent dans l'éditeur de code. Pour Asynchronous Execution, sélectionnez Yes. Pour Deletion Policy, sélectionnez Delete on Failure.

Tester l'outil Terraform dans un client

Cette section explique comment tester l'outil Terraform dans Tongyi Lingma.

  1. Suivez les instructions de la rubrique Configurer MCP dans Tongyi Lingma pour configurer OpenAPI MCP Server. Après la configuration, les outils inclus dans le MCP s'affichent.

    Le service terraform-dify est activé. La liste des outils comprend trois éléments : Ecs-20140526-DescribeInstances (interroge les instances ECS), terraform/deploydify (déploie Dify dans une instance ECS CentOS) et system-QueryTerraformTaskStatus (interroge l'état des tâches Terraform).

  2. Saisissez une commande en langage naturel pour exécuter le MCP. Par exemple : « Help me deploy Dify in China (Hong Kong). »

    Cliquez sur l'onglet AI agent situé dans le coin inférieur gauche de la zone de saisie pour passer en mode agent, puis entrez la commande en langage naturel et envoyez-la.

  3. Étant donné que vous avez choisi l'exécution asynchrone, l'agent IA renvoie un TaskId. Vous pouvez utiliser ce TaskId pour appeler de manière répétée l'outil système (QueryTerraformTaskStatus) afin de vérifier l'état d'exécution de la tâche.

    L'agent IA exécute d'abord l'outil terraform-dify/terraform/deploydify pour démarrer la tâche de déploiement. Après réception du TaskId, il appelle à plusieurs reprises QueryTerraformTaskStatus pour interroger l'état, qui apparaît comme Applying pendant le processus. Une fois le déploiement réussi, il renvoie les informations de déploiement : la région est Chine (Hong Kong) (cn-hongkong), la zone de disponibilité est cn-hongkong-b, le nom de l'instance est dify-deployment-instance, le type d'instance est ecs.c9i.xlarge (4 vCPU et 8 Go de mémoire) et une adresse IP publique a été attribuée.

  4. Vous pouvez vérifier que Dify est correctement déployé en saisissant http://<Public IP address> dans votre navigateur. Si le déploiement réussit, la page suivante s'affiche, ce qui indique que l'outil Terraform a été exécuté avec succès.

    La page affiche l'interface Set up your Admin account pour l'édition communautaire de Dify. Elle comprend les champs Email, Username et Password. Le mot de passe doit contenir des lettres et des chiffres et comporter au moins 8 caractères. Après avoir saisi les informations, cliquez sur Set pour finaliser la configuration.