Todos os produtos
Search
Central de documentação

Serverless App Engine:Vincular uma instância SLB a um aplicativo SAE com o Terraform

Última atualização: Jun 28, 2026

Após implantar um aplicativo no Serverless App Engine (SAE), adicione uma instância do Server Load Balancer (SLB) voltada para a internet para expor o aplicativo publicamente. Alternativamente, adicione uma instância SLB interna para permitir a comunicação entre aplicativos na mesma Virtual Private Cloud (VPC). Este tópico descreve como usar o Terraform para associar e desassociar uma instância SLB voltada para a internet a um aplicativo SAE.

Nota

Execute o código de exemplo deste tópico pelo link: Executar com um clique

Pré-requisitos

  • O uso da AccessKey de uma conta Alibaba Cloud representa alto risco de segurança, pois essa conta tem permissões totais sobre todos os recursos. Recomendamos criar e utilizar um usuário RAM para gerenciar sua infraestrutura. Para mais informações, consulte Criar um usuário RAM e Criar uma AccessKey.

  • Esta política personalizada permite que o usuário RAM descreva, crie, exclua, configure e defina o status de instâncias SLB. Ela também concede permissões para associar e desassociar aplicativos SAE a instâncias SLB.

    Anexe a seguinte política ao usuário RAM usado para executar comandos do Terraform. Essa política concede as permissões mínimas necessárias para gerenciar os recursos deste tutorial. Para mais informações, consulte Gerenciar permissões de usuário RAM.

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "slb:DescribeLoadBalancers",
            "slb:DescribeLoadBalancerAttribute",
            "slb:CreateLoadBalancer",
            "slb:DeleteLoadBalancer",
            "slb:ModifyLoadBalancerInternetSpec",
            "slb:CreateLoadBalancerTCPListener",
            "slb:CreateLoadBalancerHTTPListener",
            "slb:CreateLoadBalancerHTTPSListener",
            "slb:DeleteLoadBalancerListener",
            "slb:SetLoadBalancerStatus",
            "sae:BindSlb",
            "sae:UnbindSlb"
          ],
          "Resource": "*"
        }
      ]
    }
  • Prepare um ambiente de execução do Terraform. Use um dos métodos abaixo:

Recursos

Criar um aplicativo e vincular uma instância SLB

Este exemplo demonstra como implantar um aplicativo personalizado a partir de uma imagem e associá-lo a uma instância SLB na região China (Shenzhen).

  1. Crie uma pasta de projeto chamada terraform para seus arquivos do Terraform.

  2. Acesse o diretório do projeto:

    cd terraform
  3. Crie um arquivo de configuração chamado main.tf.

    O arquivo deve conter a seguinte configuração:

    # Configure the provider
    provider "alicloud" {
      region = var.region_id
    }
    # Define variables
    variable "region_id" {
      type    = string
      default = "cn-shenzhen"
    }
    variable "app_name" {
      description = "The name of the application."
      type        = string
      default     = "app-slb"
    }
    variable "image_url" {
      description = "The URL of the image."
      type        = string
      default     = "registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-slim:0.9"
    }
    variable "namespace_id" {
      description = "The ID of the namespace."
      type        = string
      default     = "cn-shenzhen:demo"
    }
    variable "namespace_name" {
      description = "The name of the namespace."
      type        = string
      default     = "demo"
    }
    # Namespace
    resource "alicloud_sae_namespace" "default" {
      namespace_description = var.namespace_description
      namespace_id          = var.namespace_id
      namespace_name        = var.namespace_name
    }
    # VPC
    resource "alicloud_vpc" "default" {
      vpc_name   = var.name
      cidr_block = "10.4.0.0/16"
    }
    # VSwitch
    resource "alicloud_vswitch" "default" {
      vswitch_name = var.name
      cidr_block   = "10.4.0.0/24"
      vpc_id       = alicloud_vpc.default.id
      zone_id      = var.zone_id
    }
    # Security group
    resource "alicloud_security_group" "sg" {
      name        = var.name
      description = var.description
      vpc_id      = alicloud_vpc.default.id
    }
    resource "alicloud_security_group_rule" "sg_rule" {
      type              = "ingress"
      ip_protocol       = "tcp"
      nic_type          = "intranet"
      policy            = "accept"
      port_range        = var.port_range
      priority          = 1
      security_group_id = alicloud_security_group.sg.id
      cidr_ip           = var.cidr_ip
    }
    # Application configuration
    resource "alicloud_sae_application" "manual" {
      app_name          = var.app_name
      app_description   = var.app_description
      deploy            = true
      image_url         = var.image_url
      namespace_id      = alicloud_sae_namespace.default.id
      vswitch_id        = alicloud_vswitch.default.id
      vpc_id            = alicloud_vpc.default.id
      security_group_id = alicloud_security_group.sg.id
      package_type      = var.package_type
      timezone          = "Asia/Beijing"
      replicas          = var.replicas
      cpu               = var.cpu
      memory            = var.memory
    }
    # SLB configuration
    resource "alicloud_slb_load_balancer" "slb" {
      load_balancer_name = "prod"
      address_type       = "internet"
      load_balancer_spec = "slb.s2.small"
      vswitch_id         = alicloud_vswitch.default.id
    }
    resource "alicloud_sae_load_balancer_internet" "example" {
      app_id          = alicloud_sae_application.manual.id
      internet_slb_id = alicloud_slb_load_balancer.slb.id
      internet {
        protocol    = "HTTP"
        port        = var.port
        target_port = 80
      }
    }
    # Other variable definitions
    variable "namespace_description" {
      description = "A description for the namespace."
      default     = "a namespace"
    }
    variable "name" {
      default     = "tf"
      description = "The name for the security group rule."
      type        = string
    }
    variable "description" {
      default     = "A description for the security group rule."
      description = "The description of the security group rule."
      type        = string
    }
    variable "port_range" {
      default     = "1/65535"
      description = "The port range for the security group rule."
      type        = string
    }
    variable "cidr_ip" {
      description = "The CIDR block used to create a new security group rule."
      type        = string
      default     = "0.0.0.0/0"
    }
    variable "zone_id" {
      description = "The ID of the availability zone."
      type        = string
      default     = "cn-shenzhen-a"
    }
    variable "app_description" {
      default     = "A description for the application, created by Terraform."
      description = "The description of the application."
      type        = string
    }
    variable "package_type" {
      default     = "Image"
      description = "The package type of the application."
      type        = string
    }
    variable "cpu" {
      default     = "500"
      description = "The CPU allocation for the application, in millicores."
      type        = string
    }
    variable "memory" {
      default     = "1024"
      description = "The memory allocation for the application, in MB."
      type        = string
    }
    variable "replicas" {
      default     = "1"
      description = "The number of application instances (replicas)."
      type        = string
    }
    variable "port" {
      description = "The listening port of the SLB instance."
      type        = string
      default     = "8000"
    }
    # Outputs
    output "namespace_id" {
      value       = var.namespace_id
      description = "The ID of the namespace."
    }
    output "app_id" {
      description = "The ID of the application."
      value       = alicloud_sae_application.manual.id
    }
    output "app_name" {
      description = "The name of the application."
      value       = var.app_name
    }
    output "endpoint" {
      value = format("http://%s:%s", alicloud_slb_load_balancer.slb.address, var.port)
    }
  4. Execute o comando a seguir para inicializar o diretório de trabalho do Terraform.

    terraform init
  5. Saída esperada:

    Terraform has been successfully initialized!
    You may now begin working with Terraform. Try running "terraform plan" to see
    any changes that are required for your infrastructure. All Terraform commands
    should now work.
    If you ever set or change modules or backend configuration for Terraform,
    rerun this command to reinitialize your working directory. If you forget, other
    commands will detect it and remind you to do so if necessary.
  6. Execute os comandos a seguir para criar os recursos.

    1. Para implantar o aplicativo, execute o comando abaixo. Quando solicitado, digite yes e pressione Enter para confirmar a implantação.

      terraform apply

      Saída esperada:

      Apply complete! Resources: 4 added, 0 changed, 0 destroyed.
      Outputs:
      app_id = "8abb794f-a47b-474b-b6f5-2xxx"
      app_name = "app-slb"
      endpoint = "http://8.xxx.xxx:8000"
      namespace_id = "cn-shenzhen:demo"

    O Terraform cria o aplicativo app-slb e o associa a uma instância SLB. A saída exibe o endereço IP público e a porta da instância SLB.

  7. Verifique o resultado:

    Executar terraform show

    Execute o comando a seguir para visualizar os detalhes dos recursos criados pelo Terraform:

    terraform show
    # alicloud_sae_application.manual:
    resource "alicloud_sae_application" "manual" {
        app_description            = "A description for the application, created by Terraform."
        app_name                   = "app-slb"
        cpu                        = 500
        deploy                     = true
        id                         = "8abb794f-a47b-474b-bxxx51"
        image_url                  = "registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-slim:0.9"
        memory                     = 1024
        namespace_id               = "cn-shenzhen:demo"
        package_type               = "Image"
        replicas                   = 1
        security_group_id          = "sg-xxx"
        status                     = "RUNNING"
        timezone                   = "Asia/Beijing"
        vpc_id                     = "vpc-xxx"
        vswitch_id                 = "vsw-xxx"
    }
    
    # alicloud_sae_load_balancer_internet.example:
    resource "alicloud_sae_load_balancer_internet" "example" {
        app_id          = "8abb794f-a47b-474b-bxxx51"
        id              = "8abb794f-a47b-474b-bxxx51"
        internet_ip     = "8.xxx.xxx"
        internet_slb_id = "lb-xxx"
    
        internet {
            port        = 8000
            protocol    = "HTTP"
            target_port = 80
        }
    }

    Verificar no navegador

    Insira o endereço IP e a porta da instância SLB em um navegador web, por exemplo, http://121.43.XXX.XX:8000. A página de boas-vindas do Nginx com a mensagem Welcome to nginx! será exibida, confirmando que o aplicativo está funcionando corretamente.

Limpar recursos

Este tópico usa o aplicativo app-slb na região China (Shenzhen) como exemplo para descrever como desvincular uma instância SLB e excluir o aplicativo.

  1. Para excluir todos os recursos criados, execute o seguinte comando no diretório do projeto:

    terraform destroy
  2. Saída esperada:

    Destroy complete! Resources: 8 destroyed.

    Este comando desassocia a instância SLB, exclui o aplicativo SAE e remove todos os outros recursos criados neste tutorial.

Código de exemplo completo

Nota

Execute o código de exemplo deste tópico pelo link: Executar com um clique

# Configure the provider
provider "alicloud" {
  region = var.region_id
}
# Define variables
variable "region_id" {
  type    = string
  default = "cn-shenzhen"
}
variable "app_name" {
  description = "The name of the application."
  type        = string
  default     = "app-slb"
}
variable "image_url" {
  description = "The URL of the image."
  type        = string
  default     = "registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-slim:0.9"
}
variable "namespace_id" {
  description = "The ID of the namespace."
  type        = string
  default     = "cn-shenzhen:demo"
}
variable "namespace_name" {
  description = "The name of the namespace."
  type        = string
  default     = "demo"
}
# Namespace
resource "alicloud_sae_namespace" "default" {
  namespace_description = var.namespace_description
  namespace_id          = var.namespace_id
  namespace_name        = var.namespace_name
}
# VPC
resource "alicloud_vpc" "default" {
  vpc_name   = var.name
  cidr_block = "10.4.0.0/16"
}
# VSwitch
resource "alicloud_vswitch" "default" {
  vswitch_name = var.name
  cidr_block   = "10.4.0.0/24"
  vpc_id       = alicloud_vpc.default.id
  zone_id      = var.zone_id
}
# Security group
resource "alicloud_security_group" "sg" {
  name        = var.name
  description = var.description
  vpc_id      = alicloud_vpc.default.id
}
resource "alicloud_security_group_rule" "sg_rule" {
  type              = "ingress"
  ip_protocol       = "tcp"
  nic_type          = "intranet"
  policy            = "accept"
  port_range        = var.port_range
  priority          = 1
  security_group_id = alicloud_security_group.sg.id
  cidr_ip           = var.cidr_ip
}
# Application configuration
resource "alicloud_sae_application" "manual" {
  app_name          = var.app_name
  app_description   = var.app_description
  deploy            = true
  image_url         = var.image_url
  namespace_id      = alicloud_sae_namespace.default.id
  vswitch_id        = alicloud_vswitch.default.id
  vpc_id            = alicloud_vpc.default.id
  security_group_id = alicloud_security_group.sg.id
  package_type      = var.package_type
  timezone          = "Asia/Beijing"
  replicas          = var.replicas
  cpu               = var.cpu
  memory            = var.memory
}
# SLB configuration
resource "alicloud_slb_load_balancer" "slb" {
  load_balancer_name = "prod"
  address_type       = "internet"
  load_balancer_spec = "slb.s2.small"
  vswitch_id         = alicloud_vswitch.default.id
}
resource "alicloud_sae_load_balancer_internet" "example" {
  app_id          = alicloud_sae_application.manual.id
  internet_slb_id = alicloud_slb_load_balancer.slb.id
  internet {
    protocol    = "HTTP"
    port        = var.port
    target_port = 80
  }
}
# Other variable definitions
variable "namespace_description" {
  description = "A description for the namespace."
  default     = "a namespace"
}
variable "name" {
  default     = "tf"
  description = "The name for the security group rule."
  type        = string
}
variable "description" {
  default     = "A description for the security group rule."
  description = "The description of the security group rule."
  type        = string
}
variable "port_range" {
  default     = "1/65535"
  description = "The port range for the security group rule."
  type        = string
}
variable "cidr_ip" {
  description = "The CIDR block used to create a new security group rule."
  type        = string
  default     = "0.0.0.0/0"
}
variable "zone_id" {
  description = "The ID of the availability zone."
  type        = string
  default     = "cn-shenzhen-a"
}
variable "app_description" {
  default     = "A description for the application, created by Terraform."
  description = "The description of the application."
  type        = string
}
variable "package_type" {
  default     = "Image"
  description = "The package type of the application."
  type        = string
}
variable "cpu" {
  default     = "500"
  description = "The CPU allocation for the application, in millicores."
  type        = string
}
variable "memory" {
  default     = "1024"
  description = "The memory allocation for the application, in MB."
  type        = string
}
variable "replicas" {
  default     = "1"
  description = "The number of application instances (replicas)."
  type        = string
}
variable "port" {
  description = "The listening port of the SLB instance."
  type        = string
  default     = "8000"
}
# Outputs
output "namespace_id" {
  value       = var.namespace_id
  description = "The ID of the namespace."
}
output "app_id" {
  description = "The ID of the application."
  value       = alicloud_sae_application.manual.id
}
output "app_name" {
  description = "The name of the application."
  value       = var.app_name
}
output "endpoint" {
  value = format("http://%s:%s", alicloud_slb_load_balancer.slb.address, var.port)
}

Documentos relacionados