Use o Terraform para criar um cluster do Elastic Compute Service (ECS) no Enterprise Distributed Application Service (EDAS), implantar uma aplicação Java e vincular uma instância do Classic Load Balancer (CLB), definindo todo o ambiente como infraestrutura como código.
Execute o exemplo completo deste tutorial diretamente no Terraform Explorer.
O que você construirá
Ao concluir este tutorial, sua configuração do Terraform provisionará os seguintes recursos em sequência:
Rede e computação -- Uma Virtual Private Cloud (VPC), vSwitch, grupo de segurança e instância ECS.
Cluster do EDAS -- Um cluster ECS com a instância ECS associada.
Aplicação -- Uma aplicação do EDAS e um grupo de implantação.
Implantação -- A aplicação expandida e implantada com um pacote JAR de demonstração.
Balanceamento de carga -- Uma instância CLB vinculada à aplicação.
Pré-requisitos
Antes de começar, verifique se você tem:
Ativado os seguintes serviços:
Um usuário RAM com as permissões mínimas necessárias para evitar a exposição do par AccessKey da sua conta Alibaba Cloud. Consulte Criar um usuário RAM e Gerenciar permissões de usuários do RAM
Um ambiente de execução do Terraform, configurado por meio de um dos seguintes métodos:
Explorer -- Baseado em navegador, sem necessidade de instalação. Ideal para testes rápidos
Crie recursos com o Terraform -- Terraform pré-instalado com credenciais pré-configuradas. Recomendado para experimentação de baixo custo
Instalar e configurar o Terraform -- Mais indicado para ambientes personalizados ou redes restritas
Política IAM necessária
Anexe a seguinte política ao seu usuário RAM. Ela concede as permissões mínimas para cada serviço utilizado neste tutorial.
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"edas:CreateCluster",
"edas:ReadCluster",
"edas:DeleteCluster",
"edas:ListResourceGroup",
"edas:ListServiceGroups",
"edas:ListSwimmingLaneGroup",
"edas:ReadApplication",
"edas:ListSlb",
"edas:DeleteApplication"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"ecs:CreateSecurityGroup",
"ecs:ModifySecurityGroupPolicy",
"ecs:DescribeSecurityGroups",
"ecs:ListTagResources",
"ecs:DeleteSecurityGroup",
"ecs:DescribeSecurityGroupAttribute",
"ecs:RunInstances",
"ecs:DescribeInstances",
"ecs:DescribeUserData",
"ecs:DescribeInstanceRamRole",
"ecs:DescribeInstanceAttribute",
"ecs:DescribeNetworkInterfaces",
"ecs:DescribeInstanceMaintenanceAttributes",
"ecs:DescribeDisks",
"ecs:DeleteInstance"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"edas:ManageCluster",
"edas:SynchronizeResource",
"edas:CreateApplication",
"edas:ManageApplication",
"edas:QueryMigrateEcuList",
"edas:ReadApplication"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"slb:CreateLoadBalancer",
"slb:DescribeLoadBalancerAttribute",
"slb:ListTagResources",
"slb:DeleteLoadBalancer"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"vpc:CreateVpc",
"vpc:DeleteVpc",
"vpc:CreateVSwitch",
"vpc:DeleteVSwitch"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"vpc:DescribeVpcAttribute",
"vpc:DescribeRouteTableList",
"vpc:DescribeVSwitchAttributes"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "kms:CreateKey",
"Resource": "*"
}
]
}Os recursos provisionados neste tutorial geram custos. Libere ou cancele a assinatura de quaisquer recursos que não sejam mais necessários.
Recursos utilizados
alicloud_vpc: VPC.
alicloud_security_group: Grupo de segurança.
alicloud_vswitch: vSwitch.
alicloud_instance: Instância ECS.
alicloud_slb_load_balancer: Instância SLB.
Recursos utilizados
alicloud_vpc: provisiona uma virtual private cloud (VPC).
alicloud_security_group: provisiona um grupo de segurança.
alicloud_vswitch: provisiona um vSwitch.
alicloud_instance: provisiona uma instância ECS.
alicloud_edas_cluster: provisiona um cluster ECS.
alicloud_edas_instance_cluster_attachment: adiciona uma instância ECS a um cluster.
alicloud_edas_application: cria uma aplicação ECS no EDAS.
alicloud_edas_deploy_group: cria um grupo de aplicação.
alicloud_edas_application_scale: expande uma aplicação.
alicloud_edas_application_deployment: implanta uma aplicação.
alicloud_slb_load_balancer: provisiona uma instância CLB.
alicloud_edas_slb_attachment: vincula uma aplicação a uma instância CLB.
Recursos do Terraform
Este tutorial utiliza os seguintes recursos do Terraform, cada um com um link para sua documentação no Terraform Registry.
Recurso | Finalidade |
Cria uma VPC | |
Cria um grupo de segurança | |
Cria um vSwitch | |
Provisiona uma instância ECS | |
Cria um cluster ECS no EDAS | |
Associa uma instância ECS a um cluster | |
Cria uma aplicação do EDAS | |
Cria um grupo de implantação | |
Expande a aplicação para uma instância ECS | |
Implanta o pacote da aplicação | |
Cria uma instância CLB | |
Vincula a instância CLB à aplicação |
Etapa 1: Criar uma instância ECS
Provisione a infraestrutura básica de rede e computação: uma VPC, grupo de segurança, vSwitch e uma instância ECS.
Crie um diretório de trabalho e adicione um arquivo chamado
main.tfcom a seguinte configuração:Detalhes principais da configuração:
Parâmetro
Valor
Descrição
regioncn-shanghaiA região onde todos os recursos são criados
instance_typeecs.e-c1m1.largeA especificação da instância ECS
vpc_cidr_block172.16.0.0/16O intervalo de endereços IP para a VPC
vsw_cidr_block172.16.0.0/24O intervalo de endereços IP para o vSwitch
system_disk_categorycloud_essdO tipo de disco para o disco do sistema
variable "region" { default = "cn-shanghai" } variable "instance_type" { type = string default = "ecs.e-c1m1.large" } variable "vpc_cidr_block" { default = "172.16.0.0/16" } variable "vsw_cidr_block" { default = "172.16.0.0/24" } # Demo Spring Cloud Consumer JAR from the official EDAS download page. variable "war_url" { type = string default = "http://edas-sz.oss-cn-shenzhen.aliyuncs.com/prod/demo/SPRING_CLOUD_CONSUMER.jar" } provider "alicloud" { region = var.region } # Look up an availability zone that supports the specified instance type # and disk category. data "alicloud_zones" "default" { available_instance_type = var.instance_type available_resource_creation = "VSwitch" available_disk_category = "cloud_essd" } # Generate a random suffix for globally unique resource names. resource "random_integer" "default" { min = 10000 max = 99999 } # Create a VPC. resource "alicloud_vpc" "vpc" { vpc_name = "vpc-test_${random_integer.default.result}" cidr_block = var.vpc_cidr_block } # Create a security group inside the VPC. resource "alicloud_security_group" "group" { name = "test_${random_integer.default.result}" vpc_id = alicloud_vpc.vpc.id } # Create a vSwitch in the first available zone. resource "alicloud_vswitch" "vswitch" { vpc_id = alicloud_vpc.vpc.id cidr_block = var.vsw_cidr_block zone_id = data.alicloud_zones.default.zones[0].id vswitch_name = "vswitch-test-${random_integer.default.result}" } # Create an ECS instance. # The password below is for demonstration only. For production, use # Terraform variables with sensitive = true or a secrets manager. resource "alicloud_instance" "instance" { availability_zone = data.alicloud_zones.default.zones[0].id security_groups = alicloud_security_group.group.*.id instance_type = var.instance_type system_disk_category = "cloud_essd" system_disk_name = "test_foo_system_disk_${random_integer.default.result}" system_disk_description = "test_foo_system_disk_description" image_id = "aliyun_2_1903_x64_20G_alibase_20240628.vhd" instance_name = "test_ecs_${random_integer.default.result}" vswitch_id = alicloud_vswitch.vswitch.id internet_max_bandwidth_out = 10 password = "Terraform@Example" } # Wait for the ECS instance to finish initializing # (typically under 60 seconds). resource "time_sleep" "example" { depends_on = [alicloud_instance.instance] create_duration = "60s" }Inicialize o diretório de trabalho do Terraform. Saída esperada:
terraform initTerraform has been successfully initialized!Valide a configuração para detectar erros de sintaxe ou argumentos não suportados. Saída esperada:
terraform validateSuccess! The configuration is valid.Visualize o plano de execução para verificar o que o Terraform criará:
terraform planAplique a configuração. Quando solicitado, insira
yese pressione Enter. Saída esperada em caso de sucesso:terraform applyApply complete! Resources: 6 added, 0 changed, 0 destroyed.Verifique o resultado. Execute
terraform showpara inspecionar os recursos criados. Alternativamente, abra o console ECS. No painel de navegação à esquerda, escolha Instances & Images > Instances. Selecione China (Shanghai) na barra de navegação superior para visualizar a instância.terraform show

Etapa 2: Criar um cluster ECS e associar a instância
Crie um cluster ECS do EDAS e associe a instância ECS da Etapa 1.
Anexe o seguinte código ao
main.tf:Referência de argumentos do recurso:
Argumento
Valor
Descrição
cluster_type"2"Especifica um cluster ECS. Use
"1"para um cluster Swarmnetwork_mode"2"Especifica rede VPC. Use
"1"para rede clássicalogical_region_idvar.regionA região onde o cluster é criado
# Create an ECS cluster in EDAS. # cluster_type = "2": ECS cluster (as opposed to "1" for Swarm). # network_mode = "2": VPC network (as opposed to "1" for classic network). resource "alicloud_edas_cluster" "cluster" { cluster_name = "tf-edas-${random_integer.default.result}" cluster_type = "2" network_mode = "2" logical_region_id = var.region vpc_id = alicloud_vpc.vpc.id } # Attach the ECS instance to the cluster. # depends_on ensures the instance is fully initialized before attachment. resource "alicloud_edas_instance_cluster_attachment" "default" { depends_on = [time_sleep.example] cluster_id = alicloud_edas_cluster.cluster.id instance_ids = [alicloud_instance.instance.id] }Visualize e aplique as alterações. Quando solicitado, insira
yese pressione Enter. Saída esperada em caso de sucesso:terraform plan terraform applyApply complete! Resources: 2 added, 0 changed, 0 destroyed.Verifique o resultado. Execute
terraform showpara inspecionar os detalhes do cluster. Alternativamente, abra o console EDAS. No painel de navegação à esquerda, escolha Resource Management > ECS Clusters. Selecione China (Shanghai) na barra de navegação superior. Clique em ID do cluster para visualizar seus detalhes, incluindo a instância ECS associada.terraform show


Etapa 3: Criar uma aplicação e um grupo de implantação
Crie uma aplicação do EDAS e um grupo de implantação dentro do cluster.
Anexe o seguinte código ao
main.tf:# Create a JAR-type application in the ECS cluster. resource "alicloud_edas_application" "app" { application_name = "tf-test-app-${random_integer.default.result}" cluster_id = alicloud_edas_cluster.cluster.id package_type = "JAR" } # Create a deploy group for the application. # Deploy groups let you manage subsets of instances independently # (for example, for canary releases). resource "alicloud_edas_deploy_group" "this" { app_id = alicloud_edas_application.app.id group_name = "tf-test-group-${random_integer.default.result}" }Visualize e aplique as alterações. Quando solicitado, insira
yese pressione Enter. Saída esperada em caso de sucesso:terraform plan terraform applyApply complete! Resources: 2 added, 0 changed, 0 destroyed.Verifique o resultado. Execute
terraform showpara inspecionar a aplicação e o grupo de implantação. Alternativamente, abra o console EDAS. No painel de navegação à esquerda, escolha Application Management > Applications. Selecione China (Shanghai) na barra de navegação superior. Clique em nome da aplicação e, em seguida, clique em aba Instance Information para visualizar o grupo de implantação.terraform show


Etapa 4: Expandir e implantar a aplicação
Atribua a instância ECS ao grupo de implantação (expansão) e, em seguida, implante o pacote JAR de demonstração.
Anexe o seguinte código ao
main.tf: Por que time_sleep? O EDAS precisa de tempo para instalar o agente na instância ECS e iniciar a aplicação. O recursotime_sleepadiciona um atraso para que os recursos dependentes — como o vínculo CLB na Etapa 5 — não sejam executados antes que a aplicação esteja pronta.# Extract the deploy group ID from the composite resource ID. locals { parts = split(":", alicloud_edas_deploy_group.this.id) group_id = local.parts[2] } # Scale out: assign the ECS instance to the deploy group. resource "alicloud_edas_application_scale" "default" { app_id = alicloud_edas_application.app.id deploy_group = local.group_id ecu_info = [alicloud_edas_instance_cluster_attachment.default.ecu_map[alicloud_instance.instance.id]] } # Deploy the demo JAR to the application. # depends_on ensures scale-out and cluster attachment finish first. resource "alicloud_edas_application_deployment" "default" { depends_on = [alicloud_edas_application_scale.default, alicloud_edas_instance_cluster_attachment.default] app_id = alicloud_edas_application.app.id group_id = local.group_id war_url = var.war_url } # Wait for the application to start (typically under 60 seconds). resource "time_sleep" "example2" { depends_on = [alicloud_edas_application_deployment.default] create_duration = "60s" }Visualize e aplique as alterações. Quando solicitado, insira
yese pressione Enter. Saída esperada em caso de sucesso:terraform plan terraform applyApply complete! Resources: 3 added, 0 changed, 0 destroyed.Verifique o resultado. Execute
terraform showpara inspecionar a implantação. Alternativamente, abra o console EDAS. No painel de navegação à esquerda, escolha Application Management > Applications. Selecione China (Shanghai) na barra de navegação superior. Clique em nome da aplicação e, em seguida, clique em aba Instance Information para verificar o status da implantação.terraform show

Etapa 5: Criar uma instância CLB e vinculá-la à aplicação
Crie uma instância CLB interna e vincule-a à aplicação.
Anexe o seguinte código ao
main.tf:Referência de argumentos do recurso:
Argumento
Valor
Descrição
load_balancer_specslb.s2.smallA especificação da instância CLB
address_typeintranetCria um balanceador de carga interno acessível apenas dentro da VPC
# Create an internal CLB instance in the same vSwitch. resource "alicloud_slb_load_balancer" "default" { load_balancer_name = "tf-test-slb-${random_integer.default.result}" vswitch_id = alicloud_vswitch.vswitch.id load_balancer_spec = "slb.s2.small" address_type = "intranet" } # Bind the CLB instance to the EDAS application. # depends_on ensures the application is fully deployed and started. resource "alicloud_edas_slb_attachment" "this" { depends_on = [time_sleep.example2] app_id = alicloud_edas_application.app.id slb_id = alicloud_slb_load_balancer.default.id slb_ip = alicloud_slb_load_balancer.default.address type = alicloud_slb_load_balancer.default.address_type }Visualize e aplique as alterações. Quando solicitado, insira
yese pressione Enter. Saída esperada em caso de sucesso:terraform plan terraform applyApply complete! Resources: 2 added, 0 changed, 0 destroyed.Verifique o resultado. Execute
terraform showpara inspecionar a instância CLB. Alternativamente, abra o console EDAS. No painel de navegação à esquerda, escolha Application Management > Applications. Selecione China (Shanghai) na barra de navegação superior. Clique em nome da aplicação e, em seguida, clique em aba Basic Information para verificar a instância CLB vinculada.terraform show

Limpar recursos
Quando esses recursos não forem mais necessários, exclua-os para interromper a geração de cobranças:
terraform destroyQuando solicitado, insira yes e pressione Enter.
Para obter mais informações sobre terraform destroy, consulte Comandos comuns do Terraform.
Exemplo completo
Execute este exemplo diretamente no Terraform Explorer.
O arquivo main.tf a seguir contém todos os recursos das Etapas 1 a 5 em uma única configuração.
variable "region" {
default = "cn-shanghai"
}
variable "instance_type" {
type = string
default = "ecs.e-c1m1.large"
}
variable "vpc_cidr_block" {
default = "172.16.0.0/16"
}
variable "vsw_cidr_block" {
default = "172.16.0.0/24"
}
# Demo Spring Cloud Consumer JAR from the official EDAS download page.
variable "war_url" {
type = string
default = "http://edas-sz.oss-cn-shenzhen.aliyuncs.com/prod/demo/SPRING_CLOUD_CONSUMER.jar"
}
provider "alicloud" {
region = var.region
}
# Extract the deploy group ID from the composite resource ID.
locals {
parts = split(":", alicloud_edas_deploy_group.this.id)
group_id = local.parts[2]
}
data "alicloud_zones" "default" {
available_instance_type = var.instance_type
available_resource_creation = "VSwitch"
available_disk_category = "cloud_essd"
}
# Generate a random suffix for globally unique resource names.
resource "random_integer" "default" {
min = 10000
max = 99999
}
# Create a VPC.
resource "alicloud_vpc" "vpc" {
vpc_name = "vpc-test_${random_integer.default.result}"
cidr_block = var.vpc_cidr_block
}
# Create a security group inside the VPC.
resource "alicloud_security_group" "group" {
name = "test_${random_integer.default.result}"
vpc_id = alicloud_vpc.vpc.id
}
# Create a vSwitch in the first available zone.
resource "alicloud_vswitch" "vswitch" {
vpc_id = alicloud_vpc.vpc.id
cidr_block = var.vsw_cidr_block
zone_id = data.alicloud_zones.default.zones[0].id
vswitch_name = "vswitch-test-${random_integer.default.result}"
}
# Create an ECS instance.
# The password below is for demonstration only. For production, use
# Terraform variables with sensitive = true or a secrets manager.
resource "alicloud_instance" "instance" {
availability_zone = data.alicloud_zones.default.zones[0].id
security_groups = alicloud_security_group.group.*.id
instance_type = var.instance_type
system_disk_category = "cloud_essd"
system_disk_name = "test_foo_system_disk_${random_integer.default.result}"
system_disk_description = "test_foo_system_disk_description"
image_id = "aliyun_2_1903_x64_20G_alibase_20240628.vhd"
instance_name = "test_ecs_${random_integer.default.result}"
vswitch_id = alicloud_vswitch.vswitch.id
internet_max_bandwidth_out = 10
password = "Terraform@Example"
}
# Wait for the ECS instance to finish initializing (typically under 60 seconds).
resource "time_sleep" "example" {
depends_on = [alicloud_instance.instance]
create_duration = "60s"
}
# Create an ECS cluster in EDAS.
# cluster_type = "2": ECS cluster (as opposed to "1" for Swarm).
# network_mode = "2": VPC network (as opposed to "1" for classic network).
resource "alicloud_edas_cluster" "cluster" {
cluster_name = "tf-edas-${random_integer.default.result}"
cluster_type = "2"
network_mode = "2"
logical_region_id = var.region
vpc_id = alicloud_vpc.vpc.id
}
# Attach the ECS instance to the cluster.
resource "alicloud_edas_instance_cluster_attachment" "default" {
depends_on = [time_sleep.example]
cluster_id = alicloud_edas_cluster.cluster.id
instance_ids = [alicloud_instance.instance.id]
}
# Create a JAR-type application in the ECS cluster.
resource "alicloud_edas_application" "app" {
application_name = "tf-test-app-${random_integer.default.result}"
cluster_id = alicloud_edas_cluster.cluster.id
package_type = "JAR"
}
# Create a deploy group for the application.
resource "alicloud_edas_deploy_group" "this" {
app_id = alicloud_edas_application.app.id
group_name = "tf-test-group-${random_integer.default.result}"
}
# Scale out: assign the ECS instance to the deploy group.
resource "alicloud_edas_application_scale" "default" {
app_id = alicloud_edas_application.app.id
deploy_group = local.group_id
ecu_info = [alicloud_edas_instance_cluster_attachment.default.ecu_map[alicloud_instance.instance.id]]
}
# Deploy the demo JAR to the application.
resource "alicloud_edas_application_deployment" "default" {
depends_on = [alicloud_edas_application_scale.default, alicloud_edas_instance_cluster_attachment.default]
app_id = alicloud_edas_application.app.id
group_id = local.group_id
war_url = var.war_url
}
# Wait for the application to start (typically under 60 seconds).
resource "time_sleep" "example2" {
depends_on = [alicloud_edas_application_deployment.default]
create_duration = "60s"
}
# Create an internal CLB instance in the same vSwitch.
resource "alicloud_slb_load_balancer" "default" {
load_balancer_name = "tf-test-slb-${random_integer.default.result}"
vswitch_id = alicloud_vswitch.vswitch.id
load_balancer_spec = "slb.s2.small"
address_type = "intranet"
}
# Bind the CLB instance to the EDAS application.
resource "alicloud_edas_slb_attachment" "this" {
depends_on = [time_sleep.example2]
app_id = alicloud_edas_application.app.id
slb_id = alicloud_slb_load_balancer.default.id
slb_ip = alicloud_slb_load_balancer.default.address
type = alicloud_slb_load_balancer.default.address_type
}Para exemplos mais completos, consulte o diretório EDAS no GitHub.