Tüm Ürünler
Search
Belge Merkezi

Serverless App Engine:Terraform kullanarak bir SLB örneğini bir SAE uygulamasına bağlayın

Son Güncelleme:Oct 06, 2026

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.

Not

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:

Kaynaklar

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.

  1. Terraform dosyalarınız için terraform adlı bir proje klasörü oluşturun.

  2. Proje dizinine gidin:

    cd terraform
  3. 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)
    }
  4. Terraform çalışma dizininizi başlatmak için aşağıdaki komutu çalıştırın.

    terraform init
  5. 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.
  6. Kaynakları oluşturmak için aşağıdaki komutları çalıştırın.

    1. Uygulamayı dağıtmak için aşağıdaki komutu çalıştırın. İstendiğinde yes yazın ve dağıtımı onaylamak için Enter tuşuna basın.

      terraform apply

      Beklenen çı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-slb uygulaması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.

  7. 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.

  1. Oluşturulan tüm kaynakları silmek için proje dizininizde aşağıdaki komutu çalıştırın:

    terraform destroy
  2. 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

Not

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