Topik ini menjelaskan cara menyebarkan NGINX pada instance Elastic Compute Service (ECS) menggunakan Template Terraform.
Prasyarat
Anda harus memahami sintaksis dan struktur Template ROS. Untuk informasi lebih lanjut, lihat Memulai dengan template.
Skenario contoh
Buat instance ECS jenis jaringan virtual private cloud (VPC) di Konsol Manajemen Alibaba Cloud untuk menyebarkan NGINX.

Catatan penggunaan
Anda dapat melihat tipe sumber daya dari sumber daya yang disebutkan sebelumnya untuk mendapatkan detail setiap properti sumber daya. Untuk informasi lebih lanjut, lihat Lihat tipe sumber daya.
Setiap topik tipe sumber daya memberikan informasi tentang properti sumber daya yang diperlukan dan opsional. Anda harus mendeklarasikan properti sumber daya yang diperlukan dari tipe sumber daya yang ingin digunakan di bagian Sumber daya Template Terraform.
Buat template
Untuk menemukan tipe sumber daya yang dibutuhkan bisnis Anda, lihat Daftar tipe sumber daya berdasarkan layanan.
Dalam contoh ini, tipe sumber daya berikut digunakan: alicloud_vpc, alicloud_instance, alicloud_vswitch, alicloud_security_group, dan alicloud_security_group_rule. NGINX disebarkan saat instance ECS dibuat.
Definisikan sumber daya dan dependensi sumber daya dalam template
Definisikan sumber daya jaringan dasar
Anda dapat mendefinisikan sumber daya jaringan dasar berikut: vpc, vsw, dan security_group.
Gunakan
alicloud_vpc.vpc.iduntuk menanyakan ID keluaran darialicloud_vpc.Gunakan
var.***untuk menanyakan nilai variabel kustom yang didefinisikan di bidangvariable. Sebagai contoh, Anda dapat menggunakanvar.zone_iduntuk menanyakan nilaizone_idyang didefinisikan di bidangvariable.
resource "alicloud_vpc" "vpc" {
cidr_block = "10.1.0.0/21"
}
resource "alicloud_vswitch" "vsw" {
vpc_id = alicloud_vpc.vpc.id
cidr_block = "172.16.0.0/21"
zone_id = var.zone_id
}
resource "alicloud_security_group" "security_group" {
name = "new-group"
vpc_id = alicloud_vpc.vpc.id
}Definisikan aturan grup keamanan
Anda dapat mendefinisikan aturan grup keamanan berikut: allow_ssh, allow_web, dan allow_egress.
Gunakan alicloud_security_group.security_group.id untuk menanyakan ID keluaran dari security_group.
# Ingress port 1 dari grup keamanan
resource "alicloud_security_group_rule" "allow_ssh" {
security_group_id = alicloud_security_group.security_group.id
type = "ingress"
cidr_ip = "0.0.0.0/0"
policy = "accept"
ip_protocol = "tcp"
port_range = "22/22"
priority = 1
}
# Ingress port 2 dari grup keamanan
resource "alicloud_security_group_rule" "allow_web" {
security_group_id = alicloud_security_group.security_group.id
type = "ingress"
cidr_ip = "0.0.0.0/0"
policy = "accept"
ip_protocol = "tcp"
port_range = "80/443"
priority = 1
}
# Egress port dari grup keamanan
resource "alicloud_security_group_rule" "allow_egress" {
security_group_id = alicloud_security_group.security_group.id
type = "egress"
cidr_ip = "0.0.0.0/0"
policy = "accept"
ip_protocol = "tcp"
port_range = "1/65535"
priority = 1
}Definisikan instance ECS
Anda dapat mendefinisikan sebuah instance ECS di dalam template.
Gunakan
var.***untuk menanyakan nilai variabel kustom yang didefinisikan di bidangvariable. Sebagai contoh, Anda dapat menggunakanvar.instance_typeuntuk menanyakan nilaiinstance_typeyang didefinisikan di bidangvariable.Gunakan
local.***untuk menanyakan nilai variabel lokal yang didefinisikan di bidanglocals. Sebagai contoh, Anda dapat menggunakanlocal.new_host_nameuntuk menanyakan nilainew_host_nameyang didefinisikan di bidanglocals.Gunakan
${path.cwd}di user_data untuk menanyakan direktori kerja saat ini.File user_data.sh menyediakan skrip inisialisasi yang harus dieksekusi pada instance ECS. Contoh skrip inisialisasi:
#!/bin/bash -v
# Pasang disk ke /disk1.
cat >> /root/InitDataDisk.sh << "EOF"
#!/bin/bash
echo "p
n
p
w
" | fdisk -u /dev/vdb
EOF
/bin/bash /root/InitDataDisk.sh
rm -f /root/InitDataDisk.sh
mkfs -t ext4 /dev/vdb1
cp /etc/fstab /etc/fstab.bak
mkdir /disk1
echo `blkid /dev/vdb1 | awk '{print $2}' | sed 's/\\\"//g'` /disk1 ext4 defaults 0 0 >> /etc/fstab
mount -a
# Konfigurasikan skrip instalasi.
yum install -y nginx
# Konfigurasikan skrip startup.
/usr/sbin/nginxKode berikut memberikan contoh template yang mendefinisikan instance ECS:
resource "alicloud_instance" "instance" {
availability_zone = var.zone_id
security_groups = [alicloud_security_group.security_group.id]
# seri III
host_name = local.new_host_name
instance_type = var.instance_type
system_disk_size = 500
system_disk_category = "cloud_essd"
image_id = "centos_7_9_x64_20G_alibase_20210318.vhd"
vswitch_id = alicloud_vswitch.vsw.id
password = var.instance_password
internet_charge_type = "PayByTraffic"
internet_max_bandwidth_out = 30
instance_charge_type = var.pay_type
period = var.pay_period
period_unit = var.pay_period_unit
user_data = file("${path.cwd}/user-data.sh")
data_disks {
size = 100
category = "cloud_essd"
}
}Contoh template lengkap
variable "pay_type" {
type = string
}
variable "pay_period_unit" {
type = string
}
variable "pay_period" {
type = number
}
variable "zone_id" {
type = string
}
variable "vpc_cidr_block" {
type = string
}
variable "vswitch_cidr_block" {
type = string
}
variable "instance_type" {
type = string
}
variable "system_disk_category" {
type = string
}
variable "system_disk_size" {
type = number
}
variable "data_disk_category" {
type = string
}
variable "data_disk_size" {
type = number
}
variable "instance_password" {
type = string
}
# Nama sumber daya default
locals {
production_name = "nginx"
new_scg_name = "sg-for-${local.production_name}"
new_host_name = "app-for-${local.production_name}"
}
resource "alicloud_vpc" "vpc" {
cidr_block = var.vpc_cidr_block
}
resource "alicloud_vswitch" "vsw" {
vpc_id = alicloud_vpc.vpc.id
cidr_block = var.vswitch_cidr_block
zone_id = var.zone_id
}
// Konfigurasi grup keamanan dasar
resource "alicloud_security_group" "security_group" {
name = local.new_scg_name
description = "nginx scg"
vpc_id = alicloud_vpc.vpc.id
}
# Ingress port 1 dari grup keamanan
resource "alicloud_security_group_rule" "allow_ssh" {
security_group_id = alicloud_security_group.security_group.id
type = "ingress"
cidr_ip = "0.0.0.0/0"
policy = "accept"
ip_protocol = "tcp"
port_range = "22/22"
priority = 1
}
# Ingress port 2 dari grup keamanan
resource "alicloud_security_group_rule" "allow_web" {
security_group_id = alicloud_security_group.security_group.id
type = "ingress"
cidr_ip = "0.0.0.0/0"
policy = "accept"
ip_protocol = "tcp"
port_range = "80/443"
priority = 1
}
# Egress port dari grup keamanan
resource "alicloud_security_group_rule" "allow_egress" {
security_group_id = alicloud_security_group.security_group.id
type = "egress"
cidr_ip = "0.0.0.0/0"
policy = "accept"
ip_protocol = "tcp"
port_range = "1/65535"
priority = 1
}
# Konfigurasi instance dasar
resource "alicloud_instance" "instance" {
availability_zone = var.zone_id
security_groups = [alicloud_security_group.security_group.id]
# seri III
host_name = local.new_host_name
instance_type = var.instance_type
system_disk_size = var.system_disk_size
system_disk_category = var.system_disk_category
image_id = "centos_7_9_x64_20G_alibase_20210318.vhd"
vswitch_id = alicloud_vswitch.vsw.id
password = var.instance_password
internet_charge_type = "PayByTraffic"
internet_max_bandwidth_out = 30
instance_charge_type = var.pay_type
period = var.pay_period
period_unit = var.pay_period_unit
user_data = file("${path.cwd}/user-data.sh")
data_disks {
size = var.data_disk_size
category = var.data_disk_category
}
}
# Alamat IP yang dikembalikan oleh NGINX
output "nginx_ip" {
value = "http://${alicloud_instance.instance.public_ip}:8080"
}Konversi template Terraform
Anda dapat mengonversi template Terraform menjadi template ROS di Konsol ROS. Jika Anda menggunakan ROS, Anda dapat mengelompokkan parameter template dan secara dinamis mendapatkan pengaturan parameter.
Masuk ke Konsol ROS.
Di panel navigasi kiri, pilih Templates > My Templates.
Di halaman My Templates, klik Create Template.
Pilih Terraform Template di Template Type.
Ubah isi template Terraform.
Buat file main.tf dan masukkan isi dari contoh template Terraform.
Buat file user-data.sh dan masukkan isi dari user_data.sh skrip inisialisasi.
Pilih ROS Template di Template Type dan konversikan template Terraform menjadi template ROS. Contoh template ROS ditunjukkan di bawah ini.
ROSTemplateFormatVersion: '2015-09-01' Transform: Aliyun::Terraform-v1.2 Workspace: main.tf: |- variable "pay_type" { type = string } variable "pay_period_unit" { type = string } variable "pay_period" { type = number } variable "zone_id" { type = string } variable "instance_type" { type = string } variable "vpc_cidr_block" { type = string } variable "vsw_cidr_block" { type = string } variable "instance_password" { type = string } # Nama sumber daya default. locals { production_name = "nginx" new_vpc_name = "vpc-for-${local.production_name}" new_vsw_name = "vsw-for-${local.production_name}" new_scg_name = "sg-for-${local.production_name}" new_host_name = "app-for-${local.production_name}" } resource "alicloud_vpc" "vpc" { vpc_name = local.new_vpc_name cidr_block = var.vpc_cidr_block } resource "alicloud_vswitch" "vsw" { vpc_id = alicloud_vpc.vpc.id cidr_block = var.vsw_cidr_block zone_id = var.zone_id } // Konfigurasi grup keamanan dasar resource "alicloud_security_group" "security_group" { name = local.new_scg_name description = "nginx scg" vpc_id = alicloud_vpc.vpc.id } # Ingress port 1 dari grup keamanan resource "alicloud_security_group_rule" "allow_ssh" { security_group_id = alicloud_security_group.security_group.id type = "ingress" cidr_ip = "0.0.0.0/0" policy = "accept" ip_protocol = "tcp" port_range = "22/22" priority = 1 } # Ingress port 2 dari grup keamanan resource "alicloud_security_group_rule" "allow_web" { security_group_id = alicloud_security_group.security_group.id type = "ingress" cidr_ip = "0.0.0.0/0" policy = "accept" ip_protocol = "tcp" port_range = "80/443" priority = 1 } # Egress port dari grup keamanan resource "alicloud_security_group_rule" "allow_egress" { security_group_id = alicloud_security_group.security_group.id type = "egress" cidr_ip = "0.0.0.0/0" policy = "accept" ip_protocol = "tcp" port_range = "1/65535" priority = 1 } # Konfigurasi instance dasar resource "alicloud_instance" "instance" { availability_zone = var.zone_id security_groups = [alicloud_security_group.security_group.id] # seri III host_name = local.new_host_name instance_type = var.instance_type system_disk_size = 500 system_disk_category = "cloud_essd" image_id = "centos_7_9_x64_20G_alibase_20210318.vhd" vswitch_id = alicloud_vswitch.vsw.id password = var.instance_password internet_charge_type = "PayByTraffic" internet_max_bandwidth_out = 30 instance_charge_type = var.pay_type period = var.pay_period period_unit = var.pay_period_unit user_data = file("${path.cwd}/user-data.sh") data_disks { size = 100 category = "cloud_essd" } } # Alamat IP yang dikembalikan oleh NGINX output "nginx_ip" { value = "http://${alicloud_instance.instance.public_ip}:8080" } user-data.sh: |- #!/bin/bash -v # Pasang disk ke /disk1. cat >> /root/InitDataDisk.sh << "EOF" #!/bin/bash echo "p n p w " | fdisk -u /dev/vdb EOF /bin/bash /root/InitDataDisk.sh rm -f /root/InitDataDisk.sh mkfs -t ext4 /dev/vdb1 cp /etc/fstab /etc/fstab.bak mkdir /disk1 echo `blkid /dev/vdb1 | awk '{print $2}' | sed 's/\\\"//g'` /disk1 ext4 defaults 0 0 >> /etc/fstab mount -a # Konfigurasikan skrip instalasi. yum install -y nginx # Konfigurasikan skrip startup. /usr/sbin/nginx
Tambahkan grup parameter dan peroleh pengaturan parameter secara dinamis
Template di atas mencakup sumber daya dan dependensi sumber daya yang dibutuhkan oleh bisnis Anda. Di dalam template, nilai dari system_disk_category bersifat statis. Jika Anda ingin membuat dan menyebarkan stack menggunakan template ini di wilayah lain, Anda harus mengubah isi template dan mengganti properti sumber daya.
Dalam kasus ini, Anda dapat menambahkan bagian Parameters ke template untuk meningkatkan fleksibilitas dan kemampuan penggunaan ulang template.
Tambahkan grup parameter
Anda dapat menggunakan Metadata untuk mengelompokkan parameter yang didefinisikan di bagian Parameters dan mendefinisikan label untuk setiap grup. Untuk informasi lebih lanjut, lihat Metadata.
Anda dapat mengelompokkan parameter berdasarkan sumber daya yang sesuai dengan parameter tersebut. Tabel berikut menggunakan template di atas sebagai contoh untuk menjelaskan cara mengelompokkan parameter.
Grup | Sumber Daya | Parameter |
Konfigurasi jaringan dasar |
|
|
Konfigurasi instance ECS |
|
|
Di tab Terraform, buat file .metadata dan masukkan konten berikut:
{
"ALIYUN::ROS::Interface": {
"ParameterGroups": [
{
"Parameters": [
"pay_type",
"pay_period_unit",
"pay_period"
],
"Label": {
"default": {
"en": "Konfigurasi Mode Pembayaran",
}
}
},
{
"Parameters": [
"zone_id"
],
"Label": {
"default": {
"en": "Konfigurasi Zona"
}
}
},
{
"Parameters": [
"vpc_cidr_block",
"vswitch_cidr_block"
],
"Label": {
"default": {
"en": "Pilih Konfigurasi Infrastruktur yang Ada"
}
}
},
{
"Parameters": [
"instance_type",
"system_disk_category",
"system_disk_size",
"data_disk_category",
"data_disk_size",
"instance_password"
],
"Label": {
"default": {
"en": "Instance",
}
}
}
]
}
}Peroleh pengaturan parameter secara dinamis
Bagian berikut menggunakan parameter instance sebagai contoh untuk menjelaskan cara memperoleh pengaturan parameter secara dinamis. Jika Anda ingin mengonfigurasi kondisi filter untuk parameter instance di Konsol ROS dan secara dinamis mendapatkan pengaturan parameter berdasarkan kondisi filter yang berbeda, Anda dapat menggunakan tipe sumber daya ALIYUN::ECS::Instance yang sesuai dengan parameter instance untuk menanyakan nilai dari AssociationProperty yang didukung oleh parameter instance di topik "AssociationProperty and AssociationPropertyMetadata" dokumentasi ROS. Kemudian, Anda dapat menanyakan nilai dari AssociationPropertyMetadata yang didukung oleh parameter instance ketika ZoneId digunakan sebagai kondisi filter dari AssociationProperty. Dalam contoh ini, nilai dari AssociationProperty yang didukung oleh parameter instance adalah ALIYUN::ECS::Instance::InstanceType. Untuk informasi lebih lanjut, lihat AssociationProperty dan AssociationPropertyMetadata.
Di tab Terraform, masukkan konten berikut di file main.tf:
variable "pay_type" {
type = string
default = "PostPaid"
description = <<EOT
{
"Label": {
"en": "Tipe Biaya Instance ECS",
},
"AllowedValues": [
"PostPaid",
"PrePaid"
],
"AssociationProperty": "ChargeType",
"AssociationPropertyMetadata": {
"LocaleKey": "InstanceChargeType"
}
}
EOT
}
variable "pay_period_unit" {
type = string
default = "Month"
description = <<EOT
{
"Label": {
"en": "Unit Periode Pembayaran",
},
"AllowedValues": [
"Month",
"Year"
],
"AssociationProperty": "PayPeriodUnit",
"AssociationPropertyMetadata": {
"Visible": {
"Condition": {
"Fn::Not": {
"Fn::Equals": [
"$${pay_type}",
"PostPaid"
]
}
}
}
}
}
EOT
}
variable "pay_period" {
type = number
default = 1
description = <<EOT
{
"Label": {
"en": "Periode",
},
"AllowedValues": [
1,
2,
3,
4,
5,
6,
7,
8,
9
],
"AssociationProperty": "PayPeriod",
"AssociationPropertyMetadata": {
"Visible": {
"Condition": {
"Fn::Or": [
{
"Fn::Equals": [
"$${pay_type}",
"PrePaid"
]
},
{
"Fn::Equals": [
"$${pay_type}",
"undefined"
]
}
]
}
}
}
}
EOT
}
variable "zone_id" {
type = string
description = <<EOT
{
"AssociationProperty": "ALIYUN::ECS::Instance:ZoneId",
"Description": {
</font></b>",
"en": "ID Zona Ketersediaan.Tambahkan dependensi dan batasan parameter template
Template di atas mendefinisikan sebuah instance ECS. Anda perlu menambahkan batasan untuk parameter berikut ke template: zone_id, instance_type, vswitch_id, system_disk_category, system_disk_size, data_disk_category, dan data_disk_size. Parameter di atas terkait dengan parameter alicloud_instance.
Di bidang ResourcesForParameterConstraints, Anda hanya perlu mendefinisikan tipe sumber daya ALIYUN::ECS::Instance (alicloud_instance) dan mengasosiasikan tipe sumber daya tersebut dengan image_id, instance_type, dan zone_id untuk menambahkan batasan.
{
"ALIYUN::ROS::Interface": {
"ResourcesForParameterConstraints": {
"instance": {
"Type": "ALIYUN::ECS::Instance",
"Properties": {
"InstanceType": {
"Ref": "instance_type"
},
"ImageId": "centos_7_9_x64_20G_alibase_20210318.vhd",
"VSwitchId": {
"Ref": "vswitch_id"
},
"ZoneId": {
"Ref": "zone_id"
},
"SystemDiskCategory": {
"Ref": "system_disk_category"
},
"SystemDiskSize": {
"Ref": "system_disk_size"
},
"DataDiskCategory": {
"Ref": "data_disk_category"
},
"DataDiskSize": {
"Ref": "data_disk_size"
}
}
}
},
"ParameterGroups": [
{
"Parameters": [
"pay_type",
"pay_period_unit",
"pay_period"
],
"Label": {
"default": {
"en": "Konfigurasi Mode Pembayaran",
}
}
},
{
"Parameters": [
"zone_id"
],
"Label": {
"default": {
"en": "Konfigurasi Zona"
}
}
},
{
"Parameters": [
"vpc_cidr_block",
"vswitch_cidr_block"
],
"Label": {
"default": {
"en": "Pilih Konfigurasi Infrastruktur yang Ada"
}
}
},
{
"Parameters": [
"instance_type",
"system_disk_category",
"system_disk_size",
"data_disk_category",
"data_disk_size",
"instance_password"
],
"Label": {
"default": {
"en": "Instance",
}
}
}
]
}
}Contoh template lengkap
ROSTemplateFormatVersion: '2015-09-01'
Transform: Aliyun::Terraform-v1.2
Workspace:
.metadata: |-
{
"ALIYUN::ROS::Interface": {
"ResourcesForParameterConstraints": {
"instance": {
"Type": "ALIYUN::ECS::Instance",
"Properties": {
"InstanceType": {
"Ref": "instance_type"
},
"ImageId": "centos_7_9_x64_20G_alibase_20210318.vhd",
"VSwitchId": {
"Ref": "vswitch_id"
},
"ZoneId": {
"Ref": "zone_id"
},
"SystemDiskCategory": {
"Ref": "system_disk_category"
},
"SystemDiskSize": {
"Ref": "system_disk_size"
},
"DataDiskCategory": {
"Ref": "data_disk_category"
},
"DataDiskSize": {
"Ref": "data_disk_size"
}
}
}
},
"ParameterGroups": [
{
"Parameters": [
"pay_type",
"pay_period_unit",
"pay_period"
],
"Label": {
"default": {
"en": "Konfigurasi Mode Pembayaran",
}
}
},
{
"Parameters": [
"zone_id"
],
"Label": {
"default": {
"en": "Konfigurasi Zona"
}
}
},
{
"Parameters": [
"vpc_cidr_block",
"vswitch_cidr_block"
],
"Label": {
"default": {
"en": "Pilih Konfigurasi Infrastruktur yang Ada"
}
}
},
{
"Parameters": [
"instance_type",
"system_disk_category",
"system_disk_size",
"data_disk_category",
"data_disk_size",
"instance_password"
],
"Label": {
"default": {
"en": "Instance",
}
}
}
]
}
}
main.tf: |-
variable "pay_type" {
type = string
default = "PostPaid"
description = <<EOT
{
"Label": {
"en": "Tipe Biaya Instance ECS",
},
"AllowedValues": [
"PostPaid",
"PrePaid"
],
"AssociationProperty": "ChargeType",
"AssociationPropertyMetadata": {
"LocaleKey": "InstanceChargeType"
}
}
EOT
}
variable "pay_period_unit" {
type = string
default = "Month"
description = <<EOT
{
"Label": {
"en": "Unit Periode Pembayaran",
},
"AllowedValues": [
"Month",
"Year"
],
"AssociationProperty": "PayPeriodUnit",
"AssociationPropertyMetadata": {
"Visible": {
"Condition": {
"Fn::Not": {
"Fn::Equals": [
"$${pay_type}",
"PostPaid"
]
}
}
}
}
}
EOT
}
variable "pay_period" {
type = number
default = 1
description = <<EOT
{
"Label": {
"en": "Periode",
},
"AllowedValues": [
1,
2,
3,
4,
5,
6,
7,
8,
9
],
"AssociationProperty": "PayPeriod",
"AssociationPropertyMetadata": {
"Visible": {
"Condition": {
"Fn::Or": [
{
"Fn::Equals": [
"$${pay_type}",
"PrePaid"
]
},
{
"Fn::Equals": [
"$${pay_type}",
"undefined"
]
}
]
}
}
}
}
EOT
}
variable "zone_id" {
type = string
description = <<EOT
{
"AssociationProperty": "ALIYUN::ECS::Instance:ZoneId",
"Description": {
</font></b>",
"en": "ID Zona Ketersediaan.