Todos os produtos
Search
Central de documentação

Serverless App Engine:Use o Terraform para gerenciar o Auto Scaling no SAE

Última atualização: Oct 09, 2026

No gerenciamento de aplicativos distribuídos, o Auto Scaling é uma capacidade operacional importante. Ele aumenta ou diminui automaticamente o número de instâncias por meio de scale-out ou scale-in com base no status delas, melhorando a utilização e reduzindo os custos de recursos. Este tópico descreve como usar o Terraform para ativar ou desativar políticas de Auto Scaling para aplicativos do SAE.

Informações de contexto

As políticas de Auto Scaling do SAE incluem os tipos agendado, baseado em métricas e híbrido. Para ativar uma política de Auto Scaling em um aplicativo do SAE usando o Terraform, configure o recurso alicloud_sae_application_scaling_rule durante a criação do aplicativo. Para desativar a política de Auto Scaling, exclua tanto a política quanto o aplicativo. Para obter mais informações sobre como definir um período de tempo, consulte Use a crontab expression.

Cenários

  • A política de Auto Scaling agendada é adequada para aplicativos com padrões de uso de recursos previsíveis e cíclicos. Esse tipo de política é comum em setores como finanças, saúde, governo e educação.

  • Já a política de Auto Scaling baseada em métricas é indicada para aplicativos que sofrem picos repentinos de tráfego ou possuem padrões periódicos típicos, sendo muito utilizada nos setores de internet, jogos e redes sociais.

  • Por fim, a política de Auto Scaling híbrida é projetada para cenários em que o aplicativo apresenta padrões cíclicos de uso de recursos e também enfrenta picos de tráfego. Esse modelo é frequente em áreas como internet, educação e serviços de alimentação.

Para obter mais informações, consulte Configure an auto scaling policy.

Nota

O código de exemplo deste tópico pode ser executado. Clique em Execute no Terraform Explorer

Pré-requisitos

  • Uma conta da Alibaba Cloud tem permissões completas para todos os seus recursos, o que representa um risco significativo de segurança em caso de vazamento das credenciais. Recomendamos usar um usuário do RAM e criar um par de AccessKey para esse usuário. Para obter mais informações, consulte Create a RAM user e Create an AccessKey.

  • Esta política personalizada permite que um usuário ou função do RAM gerencie todo o ciclo de vida dos aplicativos do Serverless Application Engine (SAE). As permissões incluem criar, atualizar, excluir, iniciar, parar, implantar e reverter aplicativos, além de gerenciar regras de Auto Scaling.

    Anexe a política a seguir ao usuário do RAM usado para executar os comandos do Terraform. Ela fornece as permissões mínimas necessárias para este tutorial. Para obter mais informações, consulte Create a custom policy.

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "sae:CreateApplication",
            "sae:UpdateApplication",
            "sae:DeleteApplication",
            "sae:GetApplication",
            "sae:ListApplications",
            "sae:CreateScalingRule",
            "sae:UpdateScalingRule",
            "sae:DeleteScalingRule",
            "sae:GetScalingRule",
            "sae:ListScalingRules",
            "sae:StartApplication",
            "sae:StopApplication",
            "sae:DeployApplication",
            "sae:RollbackApplication"
          ],
          "Resource": "*"
        }
      ]
    }
  • Prepare um ambiente de execução do Terraform. Use um dos métodos a seguir para executar o Terraform:

    • O Resource Orchestration Service (ROS) fornece um serviço gerenciado para o Terraform. Implante modelos do Terraform diretamente no console do ROS. Para obter mais informações, consulte Create a Terraform stack.

    • Terraform Explorer: A Alibaba Cloud fornece um ambiente de execução online para o Terraform. Não é necessário instalar o Terraform. Acesse a plataforma para usar e testar o Terraform online. Este método é adequado para cenários em que seja necessário testar e depurar o Terraform de forma rápida, fácil e sem custos.

    • Create resources with Terraform: O Terraform vem pré-instalado e as credenciais já estão configuradas no Cloud Shell, o que permite executar comandos do Terraform diretamente. Esse método é ideal para cenários que exigem o uso do Terraform de forma rápida, prática e com baixo custo.

    • Instale e configure o Terraform: Recomendado quando a conexão de rede é instável ou quando é necessário um ambiente de desenvolvimento personalizado.

Recursos utilizados

Ative uma política de Auto Scaling agendada

Este exemplo mostra como criar um aplicativo na região China (Shenzhen), implantá-lo a partir de uma imagem e configurar uma política de Auto Scaling agendada para o aplicativo.

A política de Auto Scaling é configurada da seguinte forma: o ciclo é diário. O primeiro horário de acionamento ocorre às 19:35 com a meta de 5 instâncias, e o segundo às 20:35 com a meta de 2 instâncias. Como resultado, entre 19:35 e 20:35, o SAE mantém 5 instâncias para o aplicativo com base nas regras configuradas. Entre 20:35 e 19:35 do dia seguinte, o número de instâncias do aplicativo é mantido em 2.

  1. Crie uma pasta de projeto chamada terraform para armazenar os recursos do Terraform.

  2. Execute o comando a seguir para acessar o diretório do projeto.

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

    # 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-scaling"
    }
    variable "image_url" {
      description = "The address of the image."
      type        = string
      default     = "registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-slim:0.9"
    }
    variable "namespace_name" {
      description = "The name of the namespace."
      type        = string
      default     = "demo"
    }
    variable "namespace_id" {
      description = "The ID of the namespace."
      type        = string
      default     = "cn-shenzhen:demo"
    }
    # Create a namespace.
    resource "alicloud_sae_namespace" "default" {
      namespace_description = var.namespace_description
      namespace_id          = var.namespace_id
      namespace_name        = var.namespace_name
    }
    # Create a VPC.
    resource "alicloud_vpc" "default" {
      vpc_name   = var.name
      cidr_block = "10.0.0.0/16"
    }
    # Create a VSwitch.
    resource "alicloud_vswitch" "default" {
      vswitch_name = var.name
      cidr_block   = "10.0.1.0/24"
      vpc_id       = alicloud_vpc.default.id
      zone_id      = var.zone_id
    }
    # Create a 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
    }
    # Configure the application.
    resource "alicloud_sae_application" "default" {
      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/Shanghai"
      replicas          = var.replicas
      cpu               = var.cpu
      memory            = var.memory
    }
    # Configure the auto scaling policy.
    resource "alicloud_sae_application_scaling_rule" "default" {
      app_id              = alicloud_sae_application.default.id
      scaling_rule_name   = "timing-rule"
      scaling_rule_enable = true
      scaling_rule_type   = "timing"
      scaling_rule_timer {
        period = "* * *"
        schedules {
          at_time         = "19:35"
          target_replicas = 5
        }
        schedules {
          at_time         = "20:35"
          target_replicas = 2
        }
      }
    }
    # Define other variables.
    variable "namespace_description" {
      description = "The description of the namespace."
      default     = "A sample namespace for Terraform."
    }
    variable "name" {
      default     = "tf-example"
      description = "The name of the resource."
      type        = string
    }
    variable "description" {
      default     = "Created by Terraform for an example."
      description = "The description of the resource."
      type        = string
    }
    variable "port_range" {
      default     = "1/65535"
      description = "The port range of the security group rule."
      type        = string
    }
    variable "cidr_ip" {
      description = "The CIDR block for the 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-e"
    }
    variable "app_description" {
      default     = "An 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 of the application, in millicores."
      type        = number
    }
    variable "memory" {
      default     = 1024
      description = "The memory of the application, in MB."
      type        = number
    }
    variable "replicas" {
      default     = 1
      description = "The number of replicas for the application."
      type        = number
    }
    variable "port" {
      description = "The port of the SLB instance."
      type        = string
      default     = "8000"
    }
    # Define outputs.
    output "namespace_id" {
      value = alicloud_sae_namespace.default.id
      description = "The ID of the namespace."
    }
    output "app_id" {
      description = "The ID of the application."
      value       = alicloud_sae_application.default.id
    }
    output "app_name" {
      description = "The name of the application."
      value       = var.app_name
    }
    
  4. Execute o comando a seguir para inicializar a configuração:

terraform init

Se o comando for executado com êxito, a seguinte saída será retornada:

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.
  1. Execute os comandos a seguir na ordem para criar o aplicativo.

  2. Execute o comando a seguir para implantar o aplicativo. Durante o processo, insira yes e pressione a tecla Enter quando solicitado. Aguarde a conclusão do comando. Se a mensagem a seguir for exibida, a autorização estará concluída.

terraform apply

Saída esperada:

Apply complete! Resources: 7 added, 0 changed, 0 destroyed.

Outputs:

app_id = "3abab264-xxx"
app_name = "app-scaling"
namespace_id = "cn-shenzhen:demo"
  1. Verifique o resultado

Terraform show

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

terraform show
# alicloud_sae_application_scaling_rule.default:
resource "alicloud_sae_application_scaling_rule" "default" {
    app_id              = "3abab264-72ba-42xxx"
    id                  = "3abab264-72ba-42xxx:timing-rule"
    scaling_rule_enable = true
    scaling_rule_name   = "timing-rule"
    scaling_rule_type   = "timing"
    scaling_rule_timer {
        period = "* * *"
        schedules {
            at_time         = "19:35"
            target_replicas = 5
        }
        schedules {
            at_time         = "20:35"
            target_replicas = 2
        }
    }
}
...

SAE console

Você criou com sucesso o aplicativo app-scaling com uma política de Auto Scaling agendada. Acesse o console do SAE e visualize o status da política de Auto Scaling e das instâncias do aplicativo na guia Instance Deployment Information da página Basic Information do aplicativo de destino.

No painel de navegação à esquerda, escolha Application Management > Application List. Encontre o aplicativo de destino app-scaling. Confirme se o Auto Scaling Policy Status exibe Enabled (Scheduled) e se as Current/Target Instances exibem 2/2.

Ative uma política de Auto Scaling baseada em métricas

Este exemplo baseia-se no arquivo main.tf, configurado com uma política de Auto Scaling agendada. Nesse arquivo, apenas a configuração do recurso alicloud_sae_application_scaling_rule muda de uma política agendada para uma política baseada em métricas. As demais configurações permanecem inalteradas. Para obter mais informações, consulte Enable a scheduled auto scaling policy.

# Configure the auto scaling policy.
resource "alicloud_sae_application_scaling_rule" "default" {
  app_id              = alicloud_sae_application.default.id
  scaling_rule_name   = "metric-rule"
  scaling_rule_enable = true
  scaling_rule_type   = "metric"
  scaling_rule_metric {
    max_replicas = 50
    min_replicas = 3
    metrics {
      metric_type                       = "CPU"
      metric_target_average_utilization = 20
    }
    scale_up_rules {
      step                         = 10
      disabled                     = false
      stabilization_window_seconds = 0
    }
    scale_down_rules {
      step                         = 10
      disabled                     = false
      stabilization_window_seconds = 10
    }
  }
}

Essa política dimensiona o aplicativo para até 50 instâncias (scale-out) quando a utilização média da CPU ultrapassa 20%, e reduz para no mínimo 3 instâncias (scale-in) quando a utilização cai abaixo desse limiar.

Nota

O código de exemplo usa um limiar baixo de utilização da CPU para facilitar a observação do efeito de dimensionamento. Em um ambiente de produção, defina parâmetros adequados à sua carga de trabalho.

  1. Salve as alterações no arquivo main.tf.

terraform init
  1. Execute os comandos a seguir na ordem para criar um aplicativo.

  2. Execute o comando a seguir para implantar o aplicativo. Quando solicitado, insira yes e pressione a tecla Enter. Aguarde a conclusão do comando. Se a mensagem a seguir for exibida, a autorização estará concluída.

terraform apply

O Terraform detecta a alteração na regra de dimensionamento e atualiza o recurso.

alicloud_sae_application_scaling_rule.default: Modifying... [id=...]
alicloud_sae_application_scaling_rule.default: Modifications complete after 1s [id=...]

Apply complete! Resources: 0 added, 1 changed, 0 destroyed.
  1. Verifique o resultado

Terraform show

Execute o comando terraform show novamente. A saída agora mostra que o recurso alicloud_sae_application_scaling_rule foi atualizado para scaling_rule_type = "metric" e contém um bloco scaling_rule_metric.

terraform show

Saída de exemplo:

# alicloud_sae_application_scaling_rule.default:
resource "alicloud_sae_application_scaling_rule" "default" {
    app_id              = "22238343-81c2-4xxx"
    id                  = "22238343-81c2-4xxx:metric-rule"
    scaling_rule_enable = true
    scaling_rule_name   = "metric-rule"
    scaling_rule_type   = "metric"
    scaling_rule_metric {
        max_replicas = 50
        min_replicas = 3
        metrics {
            metric_target_average_utilization = 20
            metric_type                       = "CPU"
        }
        # ...
    }
}
# ...

SAE console

O aplicativo app-scaling com uma política de Auto Scaling baseada em métricas ativada foi criado com sucesso. Acesse o console do SAE e visualize o status de execução da política de dimensionamento e das instâncias do aplicativo na guia Instance Deployment Information da página Basic Information do aplicativo de destino.

Na página Application List, a coluna Auto Scaling Policy Status do aplicativo app-scaling exibe Enabled (Metric-based).

Ative uma política de Auto Scaling híbrida

Este exemplo baseia-se no arquivo main.tf configurado com uma política de Auto Scaling agendada. Apenas o conteúdo do recurso alicloud_sae_application_scaling_rule muda de uma política agendada para uma política híbrida, e o restante do conteúdo permanece inalterado. Para obter as instruções detalhadas, consulte Enable a scheduled auto scaling policy.

Código de exemplo:

resource "alicloud_sae_application_scaling_rule" "default" {
  app_id              = alicloud_sae_application.default.id
  scaling_rule_name   = "hybrid-rule"
  scaling_rule_enable = true
  scaling_rule_type   = "mix"
  scaling_rule_timer {
    begin_date = "2024-11-26"
    end_date   = "2024-11-30"
    period     = "* * *"
    schedules {
      at_time         = "19:35"
      target_replicas = 10
    }
    schedules {
      at_time         = "20:35"
      target_replicas = 3
    }
  }
  scaling_rule_metric {
    max_replicas = 40
    min_replicas = 3
    metrics {
      metric_type                       = "CPU"
      metric_target_average_utilization = 20
    }
    scale_up_rules {
      step                         = 10
      disabled                     = false
      stabilization_window_seconds = 0
    }
    scale_down_rules {
      step                         = 10
      disabled                     = false
      stabilization_window_seconds = 10
    }
  }
}

A política neste exemplo é configurada da seguinte forma:

  • Comportamento padrão (baseado em métricas): O aplicativo é dimensionado de 3 a 40 instâncias com base na utilização da CPU, aumentando (scale-out) quando a utilização média da CPU ultrapassa 20%.

  • Comportamento agendado: Entre 26 de novembro de 2024 e 30 de novembro de 2024, a política agendada tem precedência.

    • Das 19:35 às 20:35, o alvo do aplicativo é definido como 10 instâncias.

    • Fora dessa janela, o alvo é de 3 instâncias.

Note

O código de exemplo usa um limiar baixo de utilização da CPU para facilitar a observação do efeito de dimensionamento. Em um ambiente de produção, defina parâmetros adequados à sua carga de trabalho.

  1. Salve as alterações no arquivo main.tf e execute terraform apply novamente.

terraform apply
  1. Execute os comandos a seguir para criar um aplicativo.

  2. Execute o comando a seguir para implantar o aplicativo. Durante a execução, insira yes e pressione Enter quando solicitado. Aguarde a conclusão do comando. Se as informações a seguir forem exibidas, a autorização estará concluída.

terraform apply

Saída esperada:

Apply complete! Resources: 0 added, 1 changed, 0 destroyed.
  1. Verifique o resultado

Terraform show

Execute terraform show para ver a configuração final. O scaling_rule_type agora é mix, e o recurso contém os blocos scaling_rule_timer e scaling_rule_metric.

terraform show

Saída de exemplo:

# alicloud_sae_application_scaling_rule.default:
resource "alicloud_sae_application_scaling_rule" "default" {
    app_id              = "2fadcbf8-fcbf-455d-xxx"
    id                  = "2fadcbf8-fcbf-455d-xxx:hybrid-rule"
    scaling_rule_enable = true
    scaling_rule_name   = "hybrid-rule"
    scaling_rule_type   = "mix"
    scaling_rule_metric {
        max_replicas = 40
        min_replicas = 3
        # ...
    }
    scaling_rule_timer {
        begin_date = "2024-11-26"
        end_date   = "2024-11-30"
        period     = "* * *"
        # ...
    }
}

SAE console

Você criou com sucesso o aplicativo app-scaling com uma política de Auto Scaling híbrida ativada. Acesse o console do SAE e visualize o status de execução da política de Auto Scaling e das instâncias do aplicativo na guia Instance Deployment Information da página Basic Information do aplicativo de destino.

Acesse a guia Auto Scaling do aplicativo. Visualize os detalhes dos componentes agendados e baseados em métricas da política hybrid-rule ativada.

Exclua a política de Auto Scaling e o aplicativo

Este exemplo usa o aplicativo app-scaling na região China (Hangzhou) para descrever como desativar uma política de Auto Scaling e excluir o aplicativo.

  1. Execute o comando a seguir no diretório do projeto para executar o arquivo de configuração:

    terraform destroy
  2. Saída esperada:Código completoReferências

    ...
    Destroy complete! Resources: 7 destroyed.

    A política de Auto Scaling foi desativada e o aplicativo app-scaling foi excluído com sucesso.

    Nota

    Você pode executar o código de exemplo deste tópico. Clique em Execute no Terraform Explorer

    # 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-scaling"
    }
    variable "image_url" {
      description = "The address of the image."
      type        = string
      default     = "registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-slim:0.9"
    }
    variable "namespace_name" {
      description = "The name of the namespace."
      type        = string
      default     = "demo"
    }
    variable "namespace_id" {
      description = "The ID of the namespace."
      type        = string
      default     = "cn-shenzhen:demo"
    }
    # Create a namespace.
    resource "alicloud_sae_namespace" "default" {
      namespace_description = var.namespace_description
      namespace_id          = var.namespace_id
      namespace_name        = var.namespace_name
    }
    # Create a VPC.
    resource "alicloud_vpc" "default" {
      vpc_name   = var.name
      cidr_block = "10.0.0.0/16"
    }
    # Create a VSwitch.
    resource "alicloud_vswitch" "default" {
      vswitch_name = var.name
      cidr_block   = "10.0.1.0/24"
      vpc_id       = alicloud_vpc.default.id
      zone_id      = var.zone_id
    }
    # Create a 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
    }
    # Configure the application.
    resource "alicloud_sae_application" "default" {
      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/Shanghai"
      replicas          = var.replicas
      cpu               = var.cpu
      memory            = var.memory
    }
    # Configure the auto scaling policy.
    resource "alicloud_sae_application_scaling_rule" "default" {
      app_id              = alicloud_sae_application.default.id
      scaling_rule_name   = "hybrid-rule"
      scaling_rule_enable = true
      scaling_rule_type   = "mix"
      scaling_rule_timer {
        begin_date = "2024-11-26"
        end_date   = "2024-11-30"
        period     = "* * *"
        schedules {
          at_time         = "19:35"
          target_replicas = 10
        }
        schedules {
          at_time         = "20:35"
          target_replicas = 3
        }
      }
      scaling_rule_metric {
        max_replicas = 40
        min_replicas = 3
        metrics {
          metric_type                       = "CPU"
          metric_target_average_utilization = 20
        }
        scale_up_rules {
          step                         = 10
          disabled                     = false
          stabilization_window_seconds = 0
        }
        scale_down_rules {
          step                         = 10
          disabled                     = false
          stabilization_window_seconds = 10
        }
      }
    }
    # Define other variables.
    variable "namespace_description" {
      description = "The description of the namespace."
      default     = "A sample namespace for Terraform."
    }
    variable "name" {
      default     = "tf-example"
      description = "The name of the resource."
      type        = string
    }
    variable "description" {
      default     = "Created by Terraform for an example."
      description = "The description of the resource."
      type        = string
    }
    variable "port_range" {
      default     = "1/65535"
      description = "The port range of the security group rule."
      type        = string
    }
    variable "cidr_ip" {
      description = "The CIDR block for the 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-e"
    }
    variable "app_description" {
      default     = "An 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 of the application, in millicores."
      type        = number
    }
    variable "memory" {
      default     = 1024
      description = "The memory of the application, in MB."
      type        = number
    }
    variable "replicas" {
      default     = 1
      description = "The number of replicas for the application."
      type        = number
    }
    variable "port" {
      description = "The port of the SLB instance."
      type        = string
      default     = "8000"
    }
    # Define outputs.
    output "namespace_id" {
      value = alicloud_sae_namespace.default.id
      description = "The ID of the namespace."
    }
    output "app_id" {
      description = "The ID of the application."
      value       = alicloud_sae_application.default.id
    }
    output "app_name" {
      description = "The name of the application."
      value       = var.app_name
    }