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.
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
alicloud_sae_namespace: crie um namespace do SAE.
alicloud_security_group: crie um grupo de segurança.
alicloud_security_group_rule: crie uma regra de grupo de segurança.
alicloud_sae_application: crie um aplicativo do SAE.
alicloud_sae_application_scaling_rule: crie uma política de Auto Scaling para um aplicativo do SAE.
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.
Crie uma pasta de projeto chamada terraform para armazenar os recursos do Terraform.
-
Execute o comando a seguir para acessar o diretório do projeto.
cd terraform -
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 } 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.
Execute os comandos a seguir na ordem para criar o aplicativo.
Execute o comando a seguir para implantar o aplicativo. Durante o processo, insira
yese 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"
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.
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.
Salve as alterações no arquivo
main.tf.
terraform init
Execute os comandos a seguir na ordem para criar um aplicativo.
Execute o comando a seguir para implantar o aplicativo. Quando solicitado, insira
yese 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.
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.
Salve as alterações no arquivo
main.tfe executeterraform applynovamente.
terraform apply
Execute os comandos a seguir para criar um aplicativo.
Execute o comando a seguir para implantar o aplicativo. Durante a execução, insira
yese 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.
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.
-
Execute o comando a seguir no diretório do projeto para executar o arquivo de configuração:
terraform destroy -
Saída esperada:Código completoReferências
... Destroy complete! Resources: 7 destroyed.A política de Auto Scaling foi desativada e o aplicativo
app-scalingfoi excluído com sucesso.NotaVocê 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 }Para obter mais informações sobre o Terraform, consulte What is Alibaba Cloud Terraform?.