Bir uygulamayı Serverless App Engine (SAE) üzerinde dağıttıktan sonra, uygulamayı genel internete açmak için internete açık bir Server Load Balancer (SLB) örneği ekleyebilir veya aynı Virtual Private Cloud (VPC) içindeki uygulamalar arası iletişimi sağlamak için dahili yönlendirmeli bir SLB örneği kullanabilirsiniz. Bu konuda, internete açık bir SLB örneğini bir SAE uygulamasıyla ilişkilendirme ve ilişkilendirmeyi kaldırma işlemlerinin Terraform ile nasıl yapılacağı açıklanmaktadır.
Bu konudaki örnek kodu aşağıdaki bağlantıyı kullanarak çalıştırabilirsiniz: Tek tıklamayla çalıştır
Önkoşullar
-
Alibaba Cloud hesabının AccessKey değerini kullanmak, söz konusu hesabın tüm kaynaklar üzerinde tam yetkiye sahip olması nedeniyle yüksek bir güvenlik riski taşır. Altyapı yönetiminiz için bir RAM kullanıcısı oluşturup kullanmanızı öneririz. Daha fazla bilgi için bkz. RAM kullanıcısı oluşturma ve AccessKey oluşturma.
-
Bu özel ilke, RAM kullanıcısının SLB örneklerini tanımlamasına, oluşturmasına, silmesine, yapılandırmasına ve durumunu ayarlamasına olanak tanır. Ayrıca SAE uygulamalarını SLB örnekleriyle ilişkilendirme ve ilişkilendirmeyi kaldırma izinleri sağlar.
Aşağıdaki ilkeyi, Terraform komutlarını çalıştırmak için kullandığınız RAM kullanıcısına ekleyin. Bu ilke, bu eğitimde yer alan kaynakları yönetmek için gereken en düşük izinleri sağlar. Daha fazla bilgi için bkz. RAM kullanıcı izinlerini yönetme.
{ "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": "*" } ] } -
Bir Terraform çalışma zamanı ortamı hazırlayın. Aşağıdaki yöntemlerden birini kullanabilirsiniz:
Resource Orchestration Service (ROS), yönetilen bir Terraform barındırma hizmeti sunar. Terraform şablonlarını doğrudan ROS konsolu üzerinden dağıtabilirsiniz. Daha fazla bilgi için bkz. Terraform türünde bir yığın oluşturma.
Terraform Explorer'da Terraform kullanma: Bu yöntem, Terraform'u hızlıca denemek ve hata ayıklamak için idealdir.
Terraform kullanarak kaynakları hızla oluşturma: Cloud Shell önceden yüklü Terraform ile birlikte gelir ve kimlik bilgileriniz ile önceden yapılandırılmıştır. Terraform komutlarını doğrudan Cloud Shell içinde çalıştırabilirsiniz. Bu yöntem, Terraform'a hızlı ve kolay erişim sağlar.
Terraform'u yerel olarak yükleme ve yapılandırma: Bu yöntem, ağ bağlantısının zayıf olduğu senaryolar veya özel bir geliştirme ortamına ihtiyaç duyulduğunda uygundur.
Kaynaklar
alicloud_sae_namespace: SAE ad alanlarını oluşturur ve yönetir.
alicloud_security_group: Güvenlik gruplarını oluşturur ve yönetir.
alicloud_security_group_rule: Güvenlik grubu kurallarını oluşturur ve yönetir.
alicloud_sae_application: SAE uygulamalarını oluşturur ve yönetir.
alicloud_slb_load_balancer: SLB örneklerini oluşturur ve yönetir.
alicloud_sae_load_balancer_internet: Bir SAE uygulaması için internete açık yük dengeleyiciyi yapılandırır.
Bir uygulama oluşturun ve bir SLB örneği bağlayın
Bu örnekte, Çin (Shenzhen) bölgesinde bir görüntüden özel bir uygulama dağıtma ve bunu bir SLB örneğiyle ilişkilendirme işlemi gösterilmektedir.
Terraform dosyalarınız için terraform adlı bir proje klasörü oluşturun.
-
Proje dizinine gidin:
cd terraform -
main.tf adlı bir yapılandırma dosyası oluşturun.
Dosya aşağıdaki yapılandırmayı içermelidir:
# 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) } -
Terraform çalışma dizininizi başlatmak için aşağıdaki komutu çalıştırın.
terraform init -
Beklenen çıktı:
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. -
Kaynakları oluşturmak için aşağıdaki komutları çalıştırın.
-
Uygulamayı dağıtmak için aşağıdaki komutu çalıştırın. İstendiğinde
yesyazın ve dağıtımı onaylamak için Enter tuşuna basın.terraform applyBeklenen çıktı:
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"
Terraform,
app-slbuygulamasını oluşturur ve bunu bir SLB örneğiyle ilişkilendirir. Çıktıda, SLB örneğinin genel IP adresi ve bağlantı noktası görüntülenir. -
-
Sonucu doğrulayın:
Run terraform show
Terraform tarafından oluşturulan kaynakların ayrıntılarını görüntülemek için aşağıdaki komutu çalıştırın:
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 } }Verify in a browser
SLB örneğinin IP adresini ve bağlantı noktasını bir web tarayıcısına girin; örneğin,
http://121.43.XXX.XX:8000. Welcome to nginx! mesajını içeren Nginx karşılama sayfası görünür; bu da uygulamanın doğru şekilde çalıştığını doğrular.
Kaynakları temizleme
Bu konuda, bir SLB örneğinin bağlantısını kaldırma ve uygulamayı silme işlemini açıklamak amacıyla Çin (Shenzhen) bölgesindeki app-slb uygulaması örnek olarak kullanılmıştır.
-
Oluşturulan tüm kaynakları silmek için proje dizininizde aşağıdaki komutu çalıştırın:
terraform destroy -
Beklenen çıktı:
Destroy complete! Resources: 8 destroyed.Bu komut, SLB örneğinin ilişkisini kaldırır, SAE uygulamasını siler ve bu eğitimde oluşturulan diğer tüm kaynakları kaldırır.
Tam örnek kod
Bu konudaki örnek kodu aşağıdaki bağlantıyı kullanarak çalıştırabilirsiniz: Tek tıklamayla çalıştır
# 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)
}
İlgili belgeler
Alibaba Cloud üzerinde Terraform'a giriş için bkz. Alibaba Cloud Terraform nedir?.