Após implantar um aplicativo no Serverless App Engine (SAE), adicione uma instância do Server Load Balancer (SLB) voltada para a internet para expor o aplicativo publicamente. Alternativamente, adicione uma instância SLB interna para permitir a comunicação entre aplicativos na mesma Virtual Private Cloud (VPC). Este tópico descreve como usar o Terraform para associar e desassociar uma instância SLB voltada para a internet a um aplicativo SAE.
Execute o código de exemplo deste tópico pelo link: Executar com um clique
Pré-requisitos
-
O uso da AccessKey de uma conta Alibaba Cloud representa alto risco de segurança, pois essa conta tem permissões totais sobre todos os recursos. Recomendamos criar e utilizar um usuário RAM para gerenciar sua infraestrutura. Para mais informações, consulte Criar um usuário RAM e Criar uma AccessKey.
-
Esta política personalizada permite que o usuário RAM descreva, crie, exclua, configure e defina o status de instâncias SLB. Ela também concede permissões para associar e desassociar aplicativos SAE a instâncias SLB.
Anexe a seguinte política ao usuário RAM usado para executar comandos do Terraform. Essa política concede as permissões mínimas necessárias para gerenciar os recursos deste tutorial. Para mais informações, consulte Gerenciar permissões de usuário RAM.
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "slb:DescribeLoadBalancers", "slb:DescribeLoadBalancerAttribute", "slb:CreateLoadBalancer", "slb:DeleteLoadBalancer", "slb:ModifyLoadBalancerInternetSpec", "slb:CreateLoadBalancerTCPListener", "slb:CreateLoadBalancerHTTPListener", "slb:CreateLoadBalancerHTTPSListener", "slb:DeleteLoadBalancerListener", "slb:SetLoadBalancerStatus", "sae:BindSlb", "sae:UnbindSlb" ], "Resource": "*" } ] } -
Prepare um ambiente de execução do Terraform. Use um dos métodos abaixo:
O Resource Orchestration Service (ROS) oferece um serviço gerenciado de hospedagem do Terraform. Implante modelos do Terraform diretamente no console ROS. Para mais informações, consulte Criar uma pilha do tipo Terraform.
Usar o Terraform no Terraform Explorer: Método ideal para experimentação rápida e depuração do Terraform.
Criar recursos rapidamente usando o Terraform: O Cloud Shell já vem com o Terraform pré-instalado e pré-configurado com suas credenciais de identidade. Execute comandos do Terraform diretamente no Cloud Shell. Esta opção proporciona acesso rápido e prático ao Terraform.
Instalar e configurar o Terraform localmente: Recomendado para cenários com conectividade de rede limitada ou quando é necessário um ambiente de desenvolvimento personalizado.
Recursos
alicloud_sae_namespace: Cria e gerencia namespaces SAE.
alicloud_security_group: Cria e gerencia grupos de segurança.
alicloud_security_group_rule: Cria e gerencia regras de grupo de segurança.
alicloud_sae_application: Cria e gerencia aplicativos SAE.
alicloud_slb_load_balancer: Cria e gerencia instâncias SLB.
alicloud_sae_load_balancer_internet: Configura um balanceador de carga voltado para a internet em um aplicativo SAE.
Criar um aplicativo e vincular uma instância SLB
Este exemplo demonstra como implantar um aplicativo personalizado a partir de uma imagem e associá-lo a uma instância SLB na região China (Shenzhen).
Crie uma pasta de projeto chamada terraform para seus arquivos do Terraform.
-
Acesse o diretório do projeto:
cd terraform -
Crie um arquivo de configuração chamado main.tf.
O arquivo deve conter a seguinte configuração:
# Configure the provider provider "alicloud" { region = var.region_id } # Define variables variable "region_id" { type = string default = "cn-shenzhen" } variable "app_name" { description = "The name of the application." type = string default = "app-slb" } variable "image_url" { description = "The URL of the image." type = string default = "registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-slim:0.9" } variable "namespace_id" { description = "The ID of the namespace." type = string default = "cn-shenzhen:demo" } variable "namespace_name" { description = "The name of the namespace." type = string default = "demo" } # Namespace resource "alicloud_sae_namespace" "default" { namespace_description = var.namespace_description namespace_id = var.namespace_id namespace_name = var.namespace_name } # VPC resource "alicloud_vpc" "default" { vpc_name = var.name cidr_block = "10.4.0.0/16" } # VSwitch resource "alicloud_vswitch" "default" { vswitch_name = var.name cidr_block = "10.4.0.0/24" vpc_id = alicloud_vpc.default.id zone_id = var.zone_id } # Security group resource "alicloud_security_group" "sg" { name = var.name description = var.description vpc_id = alicloud_vpc.default.id } resource "alicloud_security_group_rule" "sg_rule" { type = "ingress" ip_protocol = "tcp" nic_type = "intranet" policy = "accept" port_range = var.port_range priority = 1 security_group_id = alicloud_security_group.sg.id cidr_ip = var.cidr_ip } # Application configuration resource "alicloud_sae_application" "manual" { app_name = var.app_name app_description = var.app_description deploy = true image_url = var.image_url namespace_id = alicloud_sae_namespace.default.id vswitch_id = alicloud_vswitch.default.id vpc_id = alicloud_vpc.default.id security_group_id = alicloud_security_group.sg.id package_type = var.package_type timezone = "Asia/Beijing" replicas = var.replicas cpu = var.cpu memory = var.memory } # SLB configuration resource "alicloud_slb_load_balancer" "slb" { load_balancer_name = "prod" address_type = "internet" load_balancer_spec = "slb.s2.small" vswitch_id = alicloud_vswitch.default.id } resource "alicloud_sae_load_balancer_internet" "example" { app_id = alicloud_sae_application.manual.id internet_slb_id = alicloud_slb_load_balancer.slb.id internet { protocol = "HTTP" port = var.port target_port = 80 } } # Other variable definitions variable "namespace_description" { description = "A description for the namespace." default = "a namespace" } variable "name" { default = "tf" description = "The name for the security group rule." type = string } variable "description" { default = "A description for the security group rule." description = "The description of the security group rule." type = string } variable "port_range" { default = "1/65535" description = "The port range for the security group rule." type = string } variable "cidr_ip" { description = "The CIDR block used to create a new security group rule." type = string default = "0.0.0.0/0" } variable "zone_id" { description = "The ID of the availability zone." type = string default = "cn-shenzhen-a" } variable "app_description" { default = "A description for the application, created by Terraform." description = "The description of the application." type = string } variable "package_type" { default = "Image" description = "The package type of the application." type = string } variable "cpu" { default = "500" description = "The CPU allocation for the application, in millicores." type = string } variable "memory" { default = "1024" description = "The memory allocation for the application, in MB." type = string } variable "replicas" { default = "1" description = "The number of application instances (replicas)." type = string } variable "port" { description = "The listening port of the SLB instance." type = string default = "8000" } # Outputs output "namespace_id" { value = var.namespace_id description = "The ID of the namespace." } output "app_id" { description = "The ID of the application." value = alicloud_sae_application.manual.id } output "app_name" { description = "The name of the application." value = var.app_name } output "endpoint" { value = format("http://%s:%s", alicloud_slb_load_balancer.slb.address, var.port) } -
Execute o comando a seguir para inicializar o diretório de trabalho do Terraform.
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 comandos a seguir para criar os recursos.
-
Para implantar o aplicativo, execute o comando abaixo. Quando solicitado, digite
yese pressione Enter para confirmar a implantação.terraform applySaída esperada:
Apply complete! Resources: 4 added, 0 changed, 0 destroyed. Outputs: app_id = "8abb794f-a47b-474b-b6f5-2xxx" app_name = "app-slb" endpoint = "http://8.xxx.xxx:8000" namespace_id = "cn-shenzhen:demo"
O Terraform cria o aplicativo
app-slbe o associa a uma instância SLB. A saída exibe o endereço IP público e a porta da instância SLB. -
-
Verifique o resultado:
Executar terraform show
Execute o comando a seguir para visualizar os detalhes dos recursos criados pelo Terraform:
terraform show# alicloud_sae_application.manual: resource "alicloud_sae_application" "manual" { app_description = "A description for the application, created by Terraform." app_name = "app-slb" cpu = 500 deploy = true id = "8abb794f-a47b-474b-bxxx51" image_url = "registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-slim:0.9" memory = 1024 namespace_id = "cn-shenzhen:demo" package_type = "Image" replicas = 1 security_group_id = "sg-xxx" status = "RUNNING" timezone = "Asia/Beijing" vpc_id = "vpc-xxx" vswitch_id = "vsw-xxx" } # alicloud_sae_load_balancer_internet.example: resource "alicloud_sae_load_balancer_internet" "example" { app_id = "8abb794f-a47b-474b-bxxx51" id = "8abb794f-a47b-474b-bxxx51" internet_ip = "8.xxx.xxx" internet_slb_id = "lb-xxx" internet { port = 8000 protocol = "HTTP" target_port = 80 } }Verificar no navegador
Insira o endereço IP e a porta da instância SLB em um navegador web, por exemplo,
http://121.43.XXX.XX:8000. A página de boas-vindas do Nginx com a mensagem Welcome to nginx! será exibida, confirmando que o aplicativo está funcionando corretamente.
Limpar recursos
Este tópico usa o aplicativo app-slb na região China (Shenzhen) como exemplo para descrever como desvincular uma instância SLB e excluir o aplicativo.
-
Para excluir todos os recursos criados, execute o seguinte comando no diretório do projeto:
terraform destroy -
Saída esperada:
Destroy complete! Resources: 8 destroyed.Este comando desassocia a instância SLB, exclui o aplicativo SAE e remove todos os outros recursos criados neste tutorial.
Código de exemplo completo
Execute o código de exemplo deste tópico pelo link: Executar com um clique
# Configure the provider
provider "alicloud" {
region = var.region_id
}
# Define variables
variable "region_id" {
type = string
default = "cn-shenzhen"
}
variable "app_name" {
description = "The name of the application."
type = string
default = "app-slb"
}
variable "image_url" {
description = "The URL of the image."
type = string
default = "registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-slim:0.9"
}
variable "namespace_id" {
description = "The ID of the namespace."
type = string
default = "cn-shenzhen:demo"
}
variable "namespace_name" {
description = "The name of the namespace."
type = string
default = "demo"
}
# Namespace
resource "alicloud_sae_namespace" "default" {
namespace_description = var.namespace_description
namespace_id = var.namespace_id
namespace_name = var.namespace_name
}
# VPC
resource "alicloud_vpc" "default" {
vpc_name = var.name
cidr_block = "10.4.0.0/16"
}
# VSwitch
resource "alicloud_vswitch" "default" {
vswitch_name = var.name
cidr_block = "10.4.0.0/24"
vpc_id = alicloud_vpc.default.id
zone_id = var.zone_id
}
# Security group
resource "alicloud_security_group" "sg" {
name = var.name
description = var.description
vpc_id = alicloud_vpc.default.id
}
resource "alicloud_security_group_rule" "sg_rule" {
type = "ingress"
ip_protocol = "tcp"
nic_type = "intranet"
policy = "accept"
port_range = var.port_range
priority = 1
security_group_id = alicloud_security_group.sg.id
cidr_ip = var.cidr_ip
}
# Application configuration
resource "alicloud_sae_application" "manual" {
app_name = var.app_name
app_description = var.app_description
deploy = true
image_url = var.image_url
namespace_id = alicloud_sae_namespace.default.id
vswitch_id = alicloud_vswitch.default.id
vpc_id = alicloud_vpc.default.id
security_group_id = alicloud_security_group.sg.id
package_type = var.package_type
timezone = "Asia/Beijing"
replicas = var.replicas
cpu = var.cpu
memory = var.memory
}
# SLB configuration
resource "alicloud_slb_load_balancer" "slb" {
load_balancer_name = "prod"
address_type = "internet"
load_balancer_spec = "slb.s2.small"
vswitch_id = alicloud_vswitch.default.id
}
resource "alicloud_sae_load_balancer_internet" "example" {
app_id = alicloud_sae_application.manual.id
internet_slb_id = alicloud_slb_load_balancer.slb.id
internet {
protocol = "HTTP"
port = var.port
target_port = 80
}
}
# Other variable definitions
variable "namespace_description" {
description = "A description for the namespace."
default = "a namespace"
}
variable "name" {
default = "tf"
description = "The name for the security group rule."
type = string
}
variable "description" {
default = "A description for the security group rule."
description = "The description of the security group rule."
type = string
}
variable "port_range" {
default = "1/65535"
description = "The port range for the security group rule."
type = string
}
variable "cidr_ip" {
description = "The CIDR block used to create a new security group rule."
type = string
default = "0.0.0.0/0"
}
variable "zone_id" {
description = "The ID of the availability zone."
type = string
default = "cn-shenzhen-a"
}
variable "app_description" {
default = "A description for the application, created by Terraform."
description = "The description of the application."
type = string
}
variable "package_type" {
default = "Image"
description = "The package type of the application."
type = string
}
variable "cpu" {
default = "500"
description = "The CPU allocation for the application, in millicores."
type = string
}
variable "memory" {
default = "1024"
description = "The memory allocation for the application, in MB."
type = string
}
variable "replicas" {
default = "1"
description = "The number of application instances (replicas)."
type = string
}
variable "port" {
description = "The listening port of the SLB instance."
type = string
default = "8000"
}
# Outputs
output "namespace_id" {
value = var.namespace_id
description = "The ID of the namespace."
}
output "app_id" {
description = "The ID of the application."
value = alicloud_sae_application.manual.id
}
output "app_name" {
description = "The name of the application."
value = var.app_name
}
output "endpoint" {
value = format("http://%s:%s", alicloud_slb_load_balancer.slb.address, var.port)
}
Documentos relacionados
Para uma introdução ao Terraform no Alibaba Cloud, consulte O que é o Alibaba Cloud Terraform?.