Todos los productos
Search
Centro de documentos

Serverless App Engine:Uso de Terraform para gestionar el auto scaling en SAE

Última actualización: Oct 09, 2026

En la gestión de aplicaciones distribuidas, el auto scaling es una capacidad operativa fundamental. Esta función aumenta o disminuye automáticamente el número de instancias mediante el escalado horizontal o vertical según su estado, lo que mejora el uso de los recursos y reduce sus costos. Este artículo describe cómo usar Terraform para habilitar o deshabilitar políticas de auto scaling en aplicaciones SAE.

Contexto

Las políticas de auto scaling de SAE incluyen políticas programadas, basadas en métricas y mixtas. Para habilitar una política de auto scaling en una aplicación SAE mediante Terraform, debe configurar el resource alicloud_sae_application_scaling_rule al crear la aplicación. Para deshabilitarla, elimine tanto la política de auto scaling como la aplicación. Para obtener más información sobre cómo establecer un periodo de tiempo, consulte Use a crontab expression.

Escenarios

  • Una política de auto scaling programada es adecuada para aplicaciones con patrones de uso de recursos predecibles y cíclicos. Se utiliza frecuentemente en sectores como finanzas, salud, gobierno y educación.

  • Una política de auto scaling basada en métricas está diseñada para aplicaciones que experimentan picos repentinos de tráfico o presentan patrones periódicos típicos. Es común en industrias como internet, videojuegos y redes sociales.

  • Una política de auto scaling híbrida se recomienda cuando las aplicaciones combinan patrones cíclicos de uso de recursos con picos de tráfico o comportamientos periódicos. Su uso es habitual en sectores como internet, educación y servicios de alimentos.

Para obtener más información, consulte Configure an auto scaling policy.

Nota

El código de ejemplo de este tema se puede ejecutar con un solo clic en Terraform Explorer. Ejecutar en Terraform Explorer

Requisitos previos

  • Una cuenta de Alibaba Cloud tiene permisos totales sobre todos sus resources, lo que representa un riesgo de seguridad significativo si se filtran las credenciales. Se recomienda utilizar un usuario RAM y crear un par de AccessKey para dicho usuario. Para obtener más información, consulte Create a RAM user y Create an AccessKey.

  • Esta política personalizada permite que un usuario o rol RAM gestione el ciclo de vida completo de las aplicaciones de Serverless Application Engine (SAE). Los permisos incluyen crear, actualizar, eliminar, iniciar, detener, desplegar y revertir aplicaciones, además de gestionar reglas de auto scaling.

    Adjunte a continuación la política al usuario RAM que utilizará para ejecutar los comandos de terraform. Esta política otorga los permisos mínimos obligatorios para este tutorial. Para obtener más información, 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 un entorno de ejecución para terraform. Puede utilizar uno de los siguientes métodos para ejecutarlo:

    • Resource Orchestration Service (ROS) ofrece un servicio administrado para terraform. Despliegue las plantillas directamente desde la consola de ROS. Para obtener más información, consulte Create a Terraform stack.

    • Terraform Explorer: Alibaba Cloud proporciona un entorno de ejecución en línea para terraform. No necesita instalar nada; basta con iniciar sesión para usarlo y probarlo. Este método es ideal cuando desea experimentar y depurar configuraciones de forma rápida, sencilla y sin costo.

    • Create resources with Terraform: En Cloud Shell, terraform viene preinstalado y las credenciales ya están configuradas, por lo que puede ejecutar comandos directamente. Más indicado para escenarios donde requiere usar esta herramienta de manera ágil, cómoda y económica.

    • Install and configure Terraform: Recomendado cuando dispone de una conexión de red deficiente o necesita un entorno de desarrollo personalizado.

Resources utilizados

Habilitación de una política de auto scaling programada

Este ejemplo muestra cómo crear una aplicación en la región China (Shenzhen), desplegarla a partir de una imagen y configurar una política de auto scaling programada.

La política funciona de la siguiente manera: el ciclo se establece como diario. El primer punto de activación ocurre a las 19:35 con un objetivo de 5 instancias, y el segundo a las 20:35 con un objetivo de 2 instancias. Como resultado, entre las 19:35 y las 20:35, SAE mantiene 5 instancias para la aplicación según las reglas configuradas. Entre las 20:35 y las 19:35 del día siguiente, la cantidad de instancias se mantiene en 2.

  1. Cree una carpeta de proyecto llamada terraform para almacenar los resources de Terraform.

  2. Ejecute el siguiente comando para ir al directorio del proyecto.

    cd terraform
  3. Cree un archivo de configuración llamado 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. Ejecute el siguiente comando para inicializar la configuración:

terraform init

Si el comando se ejecuta correctamente, se devuelve el siguiente resultado:

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. Ejecute los siguientes comandos en orden para crear la aplicación.

  2. Ejecute el siguiente comando para desplegar la aplicación. Durante el proceso, introduzca yes y presione la tecla Enter cuando el sistema lo solicite. Espere a que finalice la ejecución. Si aparece el siguiente mensaje, la autorización se completó correctamente.

terraform apply

Resultado esperado:

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

Outputs:

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

Terraform show

Ejecute el siguiente comando para consultar los detalles de los resources creados con 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

Creó correctamente la aplicación app-scaling con una política de auto scaling programada. Inicie sesión en la consola de SAE para consultar el estado de la política de auto scaling y de las instancias de la aplicación en la pestaña Instance Deployment Information de la página Basic Information de la aplicación correspondiente.

En el panel de navegación izquierdo, elija Application Management > Application List. Busque la aplicación de destino app-scaling. Confirme que su Auto Scaling Policy Status sea Enabled (Scheduled) y que Current/Target Instances muestre 2/2.

Habilitación de una política de auto scaling basada en métricas

Este ejemplo parte del archivo main.tf, que ya cuenta con una política de auto scaling programada. En dicho archivo, únicamente se modifica la configuración del resource alicloud_sae_application_scaling_rule para cambiar de una política programada a una basada en métricas. El resto de la configuración permanece igual. Para obtener más información, 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
    }
  }
}

Esta política escala horizontalmente la aplicación hasta un máximo de 50 instancias cuando el uso promedio de CPU supera el 20 %, y la reduce hasta un mínimo de 3 instancias cuando el uso cae por debajo de ese umbral.

Nota

El código de ejemplo utiliza un umbral bajo de uso de CPU para facilitar la observación del efecto de escalado. En un entorno de producción, establezca los parámetros adecuados para su carga de trabajo.

  1. Guarde los cambios en el archivo main.tf.

terraform init
  1. Ejecute los siguientes comandos en orden para crear una aplicación.

  2. Ejecute el siguiente comando para desplegar la aplicación. Cuando el sistema lo solicite, introduzca yes y presione la tecla Enter. Espere a que finalice la ejecución. Si se muestra el siguiente mensaje, la autorización se completó correctamente.

terraform apply

Terraform detecta el cambio en la regla de escalado y actualiza el resource.

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. Compruebe el resultado.

Terraform show

Ejecute nuevamente el comando terraform show. El resultado mostrará que el resource alicloud_sae_application_scaling_rule se actualizó a scaling_rule_type = "metric" e incluye un bloque scaling_rule_metric.

terraform show

Resultado de ejemplo:

# 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

La aplicación app-scaling con una política programada elástica habilitada se creó correctamente. Inicie sesión en la consola de SAE y consulte el estado de ejecución de la política de escalado y de las instancias de la aplicación en la pestaña Instance Deployment Information de la página Basic Information de la aplicación correspondiente.

En la página Application List, la columna Auto Scaling Policy Status de la aplicación app-scaling muestra Enabled (Metric-based).

Habilitación de una política de auto scaling híbrida

Este ejemplo se basa en el archivo main.tf configurado con una política de auto scaling programada. Únicamente se modifica el contenido del resource alicloud_sae_application_scaling_rule para pasar de una política programada a una híbrida; el resto del contenido permanece igual. Para conocer los pasos específicos, consulte Enable a scheduled auto scaling policy.

Código de ejemplo:

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
    }
  }
}

La política de este ejemplo se configura de la siguiente manera:

  • Comportamiento predeterminado (basado en métricas): La aplicación escala entre 3 y 40 instancias según el uso de CPU, y aumenta su capacidad cuando el uso promedio de CPU supera el 20 %.

  • Comportamiento programado: Entre el 26 y el 30 de noviembre de 2024, la política programada tiene prioridad.

    • De 19:35 a 20:35, la aplicación se ajusta a un objetivo de 10 instancias.

    • Fuera de esa ventana de tiempo, el objetivo es de 3 instancias.

Nota

El código de ejemplo utiliza un umbral bajo de uso de CPU para facilitar la observación del efecto de escalado. En un entorno de producción, establezca los parámetros adecuados para su carga de trabajo.

  1. Guarde los cambios en el archivo main.tf y ejecute terraform apply nuevamente.

terraform apply
  1. Ejecute los siguientes comandos para crear una aplicación.

  2. Ejecute el siguiente comando para desplegar la aplicación. Durante la ejecución, introduzca yes y presione Enter cuando el sistema lo solicite. Espere a que finalice la ejecución. Si se muestra la siguiente información, la autorización se completó correctamente.

terraform apply

Resultado esperado:

Apply complete! Resources: 0 added, 1 changed, 0 destroyed.
  1. Compruebe el resultado.

Terraform show

Ejecute terraform show para ver la configuración final. El valor de scaling_rule_type ahora es mix, y el resource contiene los bloques scaling_rule_timer y scaling_rule_metric.

terraform show

Resultado de ejemplo:

# 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

Creó correctamente la aplicación app-scaling con una política de auto scaling programada habilitada. Inicie sesión en la consola de SAE para consultar el estado de ejecución de la política de auto scaling y de las instancias de la aplicación en la pestaña Instance Deployment Information de la página Basic Information de la aplicación correspondiente.

Vaya a la pestaña Auto Scaling de la aplicación. Allí podrá consultar los detalles de los componentes programados y basados en métricas de la política hybrid-rule habilitada.

Eliminación de la política de auto scaling y de la aplicación

Este ejemplo utiliza la aplicación app-scaling en la región China (Hangzhou) para describir cómo deshabilitar una política de auto scaling y eliminar la aplicación.

  1. Ejecute el siguiente comando en el directorio del proyecto para aplicar el archivo de configuración:

    terraform destroy
  2. Resultado esperado:Código completoReferencias

    ...
    Destroy complete! Resources: 7 destroyed.

    Se desactivó correctamente la política de escalado y se eliminó la aplicación app-scaling.

    Nota

    El código de ejemplo de este tema se puede ejecutar con un solo clic en Terraform Explorer. Ejecutar en 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
    }