O Serverless App Engine (SAE) é uma plataforma Serverless PaaS orientada a aplicações. Após implantar suas aplicações no SAE, não é necessário gerenciar nem manter clusters ou servidores. Você pode concentrar-se no design e na construção das suas aplicações e implantá-las no SAE. Além da implantação por meio do console, APIs, plug-ins ou CI/CD, também é possível utilizar o Terraform para implantar aplicações SAE. Este tópico descreve como usar o Terraform para criar automaticamente, criar com configurações personalizadas e excluir aplicações SAE.
Pré-requisitos
-
Uma conta Alibaba Cloud possui permissões completas sobre todos os recursos. Se as credenciais forem vazadas, seus recursos correm alto risco. Recomendamos utilizar um usuário RAM e criar um AccessKey para ele. Para mais informações, consulte Create a RAM user e Create an AccessKey.
-
Esta política personalizada permite que um usuário RAM gerencie aplicações e serviços no SAE. As permissões incluem descrever, criar, atualizar, excluir, implantar, iniciar e parar aplicações, além de criar, atualizar, excluir, vincular e desvincular serviços.
Para gerenciar os recursos deste exemplo, anexe a seguinte política de permissão mínima ao usuário RAM que executará os comandos do Terraform. Para mais informações, consulte Manage RAM user permissions.
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "sae:DescribeApplications", "sae:DescribeApplication", "sae:DescribeInstances", "sae:DescribeInstance", "sae:DescribeServices", "sae:DescribeService" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "sae:CreateApplication", "sae:UpdateApplication", "sae:DeleteApplication", "sae:DeployApplication", "sae:StartApplication", "sae:StopApplication" ], "Resource": "acs:sae:*:*:application/*" }, { "Effect": "Allow", "Action": [ "sae:CreateService", "sae:UpdateService", "sae:DeleteService", "sae:BindService", "sae:UnbindService" ], "Resource": "acs:sae:*:*:service/*" } ] } -
Prepare um ambiente de execução do Terraform. Escolha uma das seguintes opções:
O ROS oferece um serviço gerenciado para Terraform. É possível implantar modelos do Terraform diretamente no console do ROS. Para mais informações, consulte Create a Terraform-based stack.
Use Terraform in Terraform Explorer: a Alibaba Cloud disponibiliza um ambiente online para executar o Terraform. Após fazer login, você pode usar o Terraform online sem necessidade de instalação. Este método é uma forma rápida, prática e gratuita de experimentar e depurar o Terraform.
Use Terraform to quickly create resources: os componentes do Terraform já vêm pré-instalados no Alibaba Cloud Cloud Shell, com credenciais configuradas. Você pode executar comandos do Terraform diretamente no Cloud Shell. Esse método é indicado para acesso rápido e prático ao Terraform com baixo custo.
Install and configure Terraform on-premises: este método é adequado para cenários com conexão de rede instável ou que exijam um ambiente de desenvolvimento personalizado.
Recursos utilizados
alicloud_sae_application: gerencia e cria aplicações do Serverless App Engine (SAE).
alicloud_vpc: configura sua VPC, incluindo sub-redes, tabelas de rotas e configurações de segurança.
alicloud_vswitch: cria sub-redes dentro de uma VPC. Cada sub-rede pode ter seu próprio intervalo de endereços IP e tabela de rotas. Utilize vSwitches para implantar diferentes aplicações e serviços em sub-redes distintas.
alicloud_security_group: gerencia o controle de acesso de rede dentro de uma VPC.
Criar uma aplicação
O SAE suporta implantações a partir de imagens e pacotes de código. Os tipos de pacote suportados incluem JAR, WAR e pacotes PHP ZIP. Ao criar uma aplicação, selecione um dos seguintes métodos para configurar a VPC:
Configuração automática: o SAE configura automaticamente recursos como namespace, VPC, vSwitch e grupo de segurança. O namespace padrão é utilizado.
Configuração personalizada: você deve configurar os recursos da aplicação, como namespace, VPC, vSwitch e grupo de segurança.
Configuração automática
Este exemplo mostra como implantar automaticamente uma aplicação a partir de uma imagem na região China (Beijing).
Crie uma pasta de projeto chamada terraform para armazenar os recursos do Terraform.
-
Execute o seguinte comando para acessar o diretório do projeto:
cd terraform -
Crie um arquivo de configuração chamado main.tf e adicione o seguinte conteúdo.
provider "alicloud" { region = var.region } variable "region" { default = "cn-beijing" } variable "name" { default = "serverless-example" } resource "random_integer" "default" { max = 99999 min = 10000 } data "alicloud_regions" "default" { current = true } data "alicloud_zones" "default" { available_resource_creation = "VSwitch" } resource "alicloud_vpc" "default" { vpc_name = var.name cidr_block = "10.4.0.0/16" } resource "alicloud_vswitch" "default" { vswitch_name = var.name cidr_block = "10.4.0.0/24" vpc_id = alicloud_vpc.default.id zone_id = data.alicloud_zones.default.zones.0.id } resource "alicloud_security_group" "default" { vpc_id = alicloud_vpc.default.id } resource "alicloud_sae_namespace" "default" { namespace_id = "${data.alicloud_regions.default.regions.0.id}:example${random_integer.default.result}" namespace_name = var.name namespace_description = var.name enable_micro_registration = false } resource "alicloud_sae_application" "default" { app_description = var.name app_name = "${var.name}-${random_integer.default.result}" namespace_id = alicloud_sae_namespace.default.id image_url = "registry-vpc.${data.alicloud_regions.default.regions.0.id}.aliyuncs.com/sae-demo-image/consumer:1.0" package_type = "Image" security_group_id = alicloud_security_group.default.id vpc_id = alicloud_vpc.default.id vswitch_id = alicloud_vswitch.default.id timezone = "Asia/Beijing" replicas = "1" cpu = "500" memory = "2048" }Faça login no console do Container Registry e visualize o endereço da imagem na página Basic Information do repositório da instância desejada. O endereço segue o seguinte formato:
registry.<regionId>.aliyuncs.com/<namespace_name>/<image_repository_name>:<image_version_number> -
Execute o seguinte comando para inicializar as configurações:
terraform init
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.
Execute os seguintes comandos para criar a aplicação SAE.
Execute o seguinte comando para aplicar o arquivo de configuração.Durante a execução do comando, insira
yesquando solicitado, pressione a tecla Enter e aguarde a conclusão. Se as informações a seguir forem exibidas, a autorização foi concluída.
terraform apply
Saída esperada:
Apply complete! Resources: 6 added, 0 changed, 0 destroyed.
Verifique o resultado
Terraform show command
Execute o seguinte comando para consultar os detalhes dos recursos criados pelo Terraform:
terraform show
shell@Alicloud: /serverless$ terraform show
# alicloud_sae_application.default:
resource "alicloud_sae_application" "default" {
app_description = "serverless-xxx"
app_name = "serverless-xxx"
batch_wait_time = 10
command_args_v2 = []
config_map_mount_desc = jsonencode([])
cpu = 500
custom_host_alias = jsonencode([])
enable_ahas = "false"
enable_grey_tag_route = false
envs = jsonencode([])
id = "131976e5-7264-xxx"
image_url = "registry-vpc.cn-beijing.aliyuncs.com/sae-demo-image/consumer:1.0"
memory = 2048
min_ready_instance_ratio = -1
min_ready_instances = -1
namespace_id = "cn-beijing:xxx"
package_type = "Image"
package_version = "1731047094"
replicas = 1
security_group_id = "sg-2zxxx"
status = "RUNNING"
termination_grace_period_seconds = 30
timezone = "Asia/Beijing"
vpc_id = "vpc-xxx"
vswitch_id = "vsw-xxx"
}
SAE console
Faça login no console do Serverless App Engine (SAE) e visualize a lista de aplicações criadas.
A lista de aplicações exibe a aplicação criada automaticamente, como serverless-xxx. Uma contagem de instâncias de 1/1 confirma que a aplicação está em execução corretamente.
O código de exemplo a seguir pode ser executado com um único clique no Terraform Explorer.
Configuração personalizada: implantação por imagem
Este exemplo mostra como implantar uma aplicação a partir de uma imagem com configurações personalizadas na região China (Shenzhen).
Crie uma pasta de projeto chamada terraform para armazenar os recursos do Terraform.
-
Execute o seguinte comando para acessar o diretório do projeto:
cd terraform -
Crie um arquivo de configuração chamado main.tf e adicione o seguinte conteúdo.
provider "alicloud" { region = var.region_id } # Region ID variable "region_id" { type = string default = "cn-shenzhen" } # Application name variable "app_name" { description = "The name of the application" type = string default = "manual-jar-tf" } # Application description variable "app_description" { default = "description created by Terraform" description = "The description of the application" type = string } # Application deployment method variable "package_type" { default = "FatJar" description = "The package type of the application" type = string } # Instance CPU specification variable "cpu" { default = "500" description = "The cpu of the application, in unit of millicore" type = string } # Instance memory specification variable "memory" { default = "1024" description = "The memory of the application, in unit of MB" type = string } # JAR package URL variable "jar_url" { description = "The JAR url of the application, like `oss://my-bucket/my-app.jar`" type = string default = "https://edas-sz.oss-cn-shenzhen.aliyuncs.com/prod/demo/SPRING_CLOUD_CONSUMER.jar" } # Number of application instances variable "replicas" { default = "1" description = "The replicas of the application" type = string } # Namespace name variable "namespace_name" { description = "Namespace Name" type = string default = "tfjardemo" } # Namespace ID variable "namespace_id" { description = "Namespace ID" type = string default = "cn-shenzhen:tfjardemo" # Reference an existing namespace ID } # Namespace description variable "namespace_description" { description = "Namespace Description" default = "a namespace" } # VPC and security group variable "name" { default = "tf" description = "The name of the security group rule" type = string } variable "description" { default = "The description of the security group rule" description = "The description of the security group rule" type = string } # Port range variable "port_range" { default = "1/65535" description = "The port range of the security group rule" type = string } # CIDR block variable "cidr_ip" { description = "cidr blocks used to create a new security group rule" type = string default = "0.0.0.0/0" } # Availability zone in the region variable "zone_id" { description = "Availability Zone ID" type = string default = "cn-shenzhen-e" # Select an availability zone with sufficient resources } # Collect application logs to SLS variable "slsConfig" { default = "[{\"logDir\":\"\",\"logType\":\"stdout\"},{\"logDir\":\"/home/admin/logs/*.log\"}]" description = "The config of sls log collect" type = string } resource "alicloud_vpc" "vpc" { vpc_name = "tf-vpc" cidr_block = "172.16.0.0/16" } resource "alicloud_vswitch" "vswitch" { vpc_id = alicloud_vpc.vpc.id cidr_block = "172.16.1.0/24" zone_id = var.zone_id vswitch_name = "tf-vswitch" description = "tf-vswitch description" } resource "alicloud_sae_namespace" "default" { namespace_id = var.namespace_id namespace_name = var.namespace_name namespace_description = var.namespace_description } output "namespace_id" { value = var.namespace_id description = "Namespace ID" } resource "alicloud_security_group" "sg" { name = var.name description = var.description vpc_id = alicloud_vpc.vpc.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 } resource "alicloud_sae_application" "manual" { app_name = var.app_name app_description = var.app_description deploy = true package_url = var.jar_url namespace_id = alicloud_sae_namespace.default.id vswitch_id = alicloud_vswitch.vswitch.id vpc_id = alicloud_vpc.vpc.id security_group_id = alicloud_security_group.sg.id package_type = var.package_type jdk = "Open JDK 8" timezone = "Asia/Beijing" replicas = var.replicas cpu = var.cpu memory = var.memory micro_registration = "0" lifecycle { ignore_changes = [ micro_registration ] } } 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 } -
Execute o seguinte comando para inicializar as configurações:
terraform init -
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.
Execute os seguintes comandos em sequência para criar uma aplicação por meio de uma imagem. Durante a execução, insira
yese pressione a tecla Enter quando solicitado. Aguarde a conclusão do comando. Se as informações a seguir forem exibidas, a autorização foi concluída.
terraform apply
Saída esperada:
Apply complete! Resources: 6 added, 0 changed, 0 destroyed.
Outputs:
app_id = "72c052ba-xxx"
app_name = "manual-image-tf"
namespace_id = "cn-shenzhen:tfdemo"
Se a saída estiver conforme o esperado, a aplicação foi implantada com sucesso.
Verifique o resultado
Terraform show command
Execute o seguinte comando para consultar os detalhes dos recursos criados pelo Terraform:
terraform show
shell@Alicloud: ~/serverless$ terraform show
# alicloud_sae_application.manual:
resource "alicloud_sae_application" "manual" {
app_description = "description created by Terraform"
app_name = "manual-image-tf"
batch_wait_time = 10
command_args_v2 = []
config_map_mount_desc = jsonencode([])
cpu = 500
custom_host_alias = jsonencode([])
deploy = true
enable_ahas = "false"
enable_grey_tag_route = false
envs = jsonencode([])
id = "72c05xxx"
image_url = "registry.cn-beijing.aliyuncs.com/sae-serverless-demo/sae-demo:microservice-java-provider-v1.0"
memory = 1024
min_ready_instance_ratio = -1
min_ready_instances = -1
namespace_id = "cn-shenzhen:tfdemo"
package_type = "Image"
package_version = "1732169733"
replicas = 1
security_group_id = "sg-wz96xxx"
status = "RUNNING"
termination_grace_period_seconds = 30
timezone = "Asia/Beijing"
vpc_id = "vpc-xxx"
vswitch_id = "vsw-xxx"
}
# alicloud_sae_namespace.default:
resource "alicloud_sae_namespace" "default" {
enable_micro_registration = true
id = "cn-shenzhen:tfdemo"
namespace_description = "a namespace"
namespace_id = "cn-shenzhen:tfdemo"
namespace_name = "tfdemo"
namespace_short_id = "tfdemo"
}
SAE console
Faça login no console do Serverless App Engine (SAE) e visualize a lista de aplicações criadas.
Na lista de aplicações de microsserviços, é possível verificar que a aplicação manual-image-tf foi criada no namespace tfdemo. A contagem de Current Instances/Target Instances é 1/1, o que confirma a execução correta da aplicação.
No painel de navegação à esquerda da aplicação manual-image-tf, clique em Change History. Confirme que o Change Type é Deploy Application e o Status é Succeeded.
Configuração personalizada: implantação por pacote JAR
Este exemplo mostra como implantar uma aplicação a partir de um pacote JAR com configurações personalizadas na região China (Shenzhen).
Crie uma pasta de projeto chamada terraform para armazenar os recursos do Terraform.
-
Execute o seguinte comando para acessar o diretório do projeto:
cd terraform -
Crie um arquivo de configuração chamado main.tf e adicione o seguinte conteúdo.
provider "alicloud" { region = var.region_id } # Region ID variable "region_id" { type = string default = "cn-shenzhen" } # Application name variable "app_name" { description = "The name of the application" type = string default = "manual-jar-tf" } # Application description variable "app_description" { default = "description created by Terraform" description = "The description of the application" type = string } # Application deployment method variable "package_type" { default = "FatJar" description = "The package type of the application" type = string } # Instance CPU specification variable "cpu" { default = "500" description = "The cpu of the application, in unit of millicore" type = string } # Instance memory specification variable "memory" { default = "1024" description = "The memory of the application, in unit of MB" type = string } # JAR package URL variable "jar_url" { description = "The JAR url of the application, like `oss://my-bucket/my-app.jar`" type = string default = "https://edas-sz.oss-cn-shenzhen.aliyuncs.com/prod/demo/SPRING_CLOUD_CONSUMER.jar" } # Number of application instances variable "replicas" { default = "1" description = "The replicas of the application" type = string } # Namespace name variable "namespace_name" { description = "Namespace Name" type = string default = "tfjardemo" } # Namespace ID variable "namespace_id" { description = "Namespace ID" type = string default = "cn-shenzhen:tfjardemo" # Reference an existing namespace ID } # Namespace description variable "namespace_description" { description = "Namespace Description" default = "a namespace" } # VPC and security group variable "name" { default = "tf" description = "The name of the security group rule" type = string } variable "description" { default = "The description of the security group rule" description = "The description of the security group rule" type = string } # Port range variable "port_range" { default = "1/65535" description = "The port range of the security group rule" type = string } # CIDR block variable "cidr_ip" { description = "cidr blocks used to create a new security group rule" type = string default = "0.0.0.0/0" } # Availability zone in the region variable "zone_id" { description = "Availability Zone ID" type = string default = "cn-shenzhen-e" # Select an availability zone with sufficient resources } # Collect application logs to SLS variable "slsConfig" { default = "[{\"logDir\":\"\",\"logType\":\"stdout\"},{\"logDir\":\"/home/admin/logs/*.log\"}]" description = "The config of sls log collect" type = string } resource "alicloud_vpc" "vpc" { vpc_name = "tf-vpc" cidr_block = "172.16.0.0/16" } resource "alicloud_vswitch" "vswitch" { vpc_id = alicloud_vpc.vpc.id cidr_block = "172.16.1.0/24" zone_id = var.zone_id vswitch_name = "tf-vswitch" description = "tf-vswitch description" } resource "alicloud_sae_namespace" "default" { namespace_id = var.namespace_id namespace_name = var.namespace_name namespace_description = var.namespace_description } output "namespace_id" { value = var.namespace_id description = "Namespace ID" } resource "alicloud_security_group" "sg" { name = var.name description = var.description vpc_id = alicloud_vpc.vpc.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 } resource "alicloud_sae_application" "manual" { app_name = var.app_name app_description = var.app_description deploy = true package_url = var.jar_url namespace_id = alicloud_sae_namespace.default.id vswitch_id = alicloud_vswitch.vswitch.id vpc_id = alicloud_vpc.vpc.id security_group_id = alicloud_security_group.sg.id package_type = var.package_type jdk = "Open JDK 8" timezone = "Asia/Beijing" replicas = var.replicas cpu = var.cpu memory = var.memory micro_registration = "0" lifecycle { ignore_changes = [ micro_registration ] } } 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 } -
Execute o seguinte comando para inicializar a configuração.
terraform init -
Execute os seguintes comandos para criar uma aplicação a partir de um pacote JAR.
-
Execute o seguinte comando para implantar a aplicação.Quando solicitado, insira
yese pressione Enter. A autorização estará concluída se a seguinte mensagem for exibida após a conclusão do comando.terraform applySaída esperada:
Apply complete! Resources: 6 added, 0 changed, 4 destroyed. Outputs: app_id = "aad70a1a-xxx" app_name = "manual-jar-tf" namespace_id = "cn-shenzhen:tfjardemo"
Se a saída estiver conforme o esperado, a aplicação foi implantada com sucesso a partir do pacote JAR.
-
Verifique o resultado:
Terraform show command
Execute o seguinte comando para consultar os detalhes dos recursos criados pelo Terraform:
terraform show
shell1@Alicloud:~/serverless$ terraform show
# alicloud_sae_application.manual:
resource "alicloud_sae_application" "manual" {
app_description = "description created by Terraform"
app_name = "manual-jar-tf"
batch_wait_time = 10
command_args_v2 = []
config_map_mount_desc = jsonencode([])
cpu = 500
custom_host_alias = jsonencode([])
deploy = true
enable_ahas = "false"
enable_grey_tag_route = false
envs = jsonencode([])
id = "6acbf6fc-6b1xxx"
jdk = "Open JDK 8"
memory = 1024
micro_registration = "0"
min_ready_instance_ratio = -1
min_ready_instances = -1
namespace_id = "cn-shenzhen:tfjardemo"
package_type = "FatJar"
package_url = "https://edas-sz.oss-cn-shenzhen.aliyuncs.com/prod/demo/SPRING_CLOUD_CONSUMER.jar"
package_version = "1732241446"
}
programming_language = "java"
replicas = 1
security_group_id = "sg-wz9j10xxx"
status = "RUNNING"
termination_grace_period_seconds = 30
timezone = "Asia/Beijing"
vpc_id = "vpc-wz9sjxxx"
vswitch_id = "vsw-wz9e1xxx"
}
SAE console
Faça login no console do Serverless App Engine (SAE) para visualizar o namespace criado.
No painel de navegação à esquerda, clique em Microservices Application. Na lista de aplicações, confirme que a aplicação manual-jar-tf foi criada no namespace tfjardemo. A contagem de instâncias é 1/1 e a especificação é 0.5 Cores 1 GB.
Excluir uma aplicação
Para excluir os recursos criados, execute o comando terraform destroy.
-
No diretório do projeto, execute o seguinte comando.
terraform destroySaída esperada:
module.vpc.alicloud_vswitch.vswitches: Destroying... [id=vsw-wz9bdsgvhit7jv2hb4li] module.vpc.alicloud_security_group_rule.sg_rule: Destroying... [id=sg-wz9ba3de0fxxriu5c0m5:i] alicloud_security_group_rule.sg_rule: Destruction complete after 1s alicloud_security_group.sg: Destroying... [id=sg-wz9ba3de0fxxriu5c0m5] alicloud_security_group.sg: Destruction complete after 0s module.vpc.alicloud_vswitch.vswitches: Destruction complete after 4s module.vpc.alicloud_vpc.vpc[0]: Destroying... [id=vpc-wz9cg2ifzghh2pt948zcj] module.vpc.alicloud_vpc.vpc[0]: Destruction complete after 6s Destroy complete! Resources: 4 destroyed.
Referências
Para mais informações sobre o Terraform, consulte What is Alibaba Cloud Terraform?.
-
Gerenciar aplicações com o Terraform
Gerenciar aplicações pelo console: Application hosting overview
Gerenciar aplicações pela API: API overview