全部产品
Search
文档中心

Resource Orchestration Service:Buat grup instance ECS dan lampirkan grup instance ke instance CLB

更新时间:Jul 02, 2025

Topik ini menjelaskan proses pembuatan template Resource Orchestration Service (ROS). Template ini mendeklarasikan sumber daya yang digunakan untuk membuat grup instance Elastic Compute Service (ECS) dan melampirkannya ke instance Classic Load Balancer (CLB).

Prasyarat

Anda harus sudah memahami sintaksis dan struktur template ROS. Untuk informasi lebih lanjut, lihat Memulai dengan Template.

Contoh skenario

Dalam skenario ini, sebuah grup instance ECS dibuat dalam virtual private cloud (VPC), layanan Nginx diterapkan di grup instance tersebut, lalu grup instance dilampirkan ke instance CLB.

2023-05-29_11-50-58..png

Catatan penggunaan

Anda dapat melihat tipe sumber daya dari sumber daya sebelumnya untuk mendapatkan detail setiap properti sumber daya. Untuk informasi lebih lanjut, lihat Lihat Tipe Sumber Daya.

Tipe sumber daya mendeklarasikan properti sumber daya, seperti tipe, apakah wajib, dan apakah dapat diedit. Jika suatu properti wajib, Anda harus mendeklarasikannya di bagian Properties dari bagian Resources template. Jika properti opsional, Anda bisa meninggalkannya kosong. Jika properti dapat diedit, Anda dapat mengubahnya di template baru setelah properti ditentukan untuk sumber daya cloud dalam template stack. Kemudian, Anda dapat menggunakan template baru untuk memperbarui stack dan sumber daya. Jika tidak, Anda tidak dapat mengubah properti tersebut.

Buat template

Referensi dokumentasi tipe sumber daya untuk menemukan tipe sumber daya yang sesuai untuk skenario Anda. Untuk informasi lebih lanjut, lihat Daftar Tipe Sumber Daya Berdasarkan Layanan.

Dalam contoh skenario, Anda harus membuat sumber daya menggunakan tipe sumber daya berikut: ALIYUN::ECS::VPC (membuat VPC), ALIYUN::ECS::InstanceGroup (membuat grup instance ECS), ALIYUN::SLB::LoadBalancer (membuat instance CLB), ALIYUN::SLB::Listener (menambahkan listener ke instance CLB), ALIYUN::VPC::EIP (membuat EIP, singkatan dari elastic IP address), ALIYUN::ECS::VSwitch (membuat vSwitch tempat grup instance ECS terhubung), dan ALIYUN::ECS::InstanceGroup (membuat security group). Saat menggunakan tipe sumber daya ALIYUN::ECS::InstanceGroup untuk membuat grup instance ECS, Anda harus menggunakan properti UserData dari tipe sumber daya tersebut untuk menjalankan skrip inisialisasi data. Anda juga harus menggunakan ALIYUN::ROS::WaitCondition (menunggu sinyal) dan ALIYUN::ROS::WaitConditionHandle (menerima sinyal) untuk mengontrol proses eksekusi dalam grup instance ECS.

Anda dapat menentukan tipe sumber daya sebelumnya di bagian Resources template.

Definisikan dan asosiasikan sumber daya dalam template

Definisikan Vpc, VSwitch, dan EcsSecurityGroup

Definisikan sumber daya jaringan dasar berikut dalam template: Vpc, VSwitch, dan EcsSecurityGroup.

  • Gunakan fungsi Ref bersama dengan parameter pseudo ALIYUN::StackName untuk mendapatkan nama stack. Lalu, atur properti ke Ref: ALIYUN::StackName untuk mengaitkan nilai properti dengan nama stack. Dalam potongan kode berikut, nilai VpcName di Vpc dan nilai VSwitchName di VSwitch dikaitkan dengan nama stack. Untuk informasi lebih lanjut, lihat Fungsi dan ALIYUN::StackName.

  • Gunakan fungsi Ref untuk mengembalikan nilai parameter tertentu. Dalam potongan kode berikut, Ref: Vpc ditentukan di VSwitch untuk mengembalikan ID VPC yang diurai dari Vpc sebagai nilai VpcId. Pada sebagian besar kasus, Ref mengembalikan ID sumber daya. Untuk informasi lebih lanjut, lihat Fungsi.

Resources:
  Vpc:
    Type: ALIYUN::ECS::VPC
    Properties:
      CidrBlock: 192.168.0.0/16
      VpcName:
        Ref: ALIYUN::StackName
  VSwitch:
    Type: ALIYUN::ECS::VSwitch
    Properties:
      VSwitchName:
        Ref: ALIYUN::StackName
      VpcId:
        Ref: Vpc
      ZoneId:
        Ref: ZoneId
      CidrBlock: 192.168.0.0/24
  EcsSecurityGroup:
    Type: ALIYUN::ECS::SecurityGroup
    Properties:
      SecurityGroupName:
        Ref: ALIYUN::StackName
      VpcId:
        Ref: Vpc
      SecurityGroupIngress:
        - PortRange: 80/80
          Priority: 1
          SourceCidrIp: 0.0.0.0/0
          IpProtocol: tcp
          NicType: internet
      SecurityGroupEgress:
        - PortRange: '-1/-1'
          Priority: 1
          IpProtocol: all
          DestCidrIp: 0.0.0.0/0
          NicType: internet
        - PortRange: '-1/-1'
          Priority: 1
          IpProtocol: all
          DestCidrIp: 0.0.0.0/0
          NicType: intranet

Definisikan Slb, SlbListener, dan EipSlbAddress

Definisikan sumber daya berikut dalam template: Slb (menentukan instance CLB), SlbListener (menentukan listener), dan EipSlbAddress (menentukan EIP).

Gunakan fungsi Fn::Sub dan parameter pseudo ALIYUN::StackName untuk mengganti variabel dalam string input dengan nama stack yang Anda peroleh. Lalu, gunakan string baru sebagai nilai properti. Untuk informasi lebih lanjut, lihat ALIYUN::StackName.

Resources:
  Slb:
    Type: ALIYUN::SLB::LoadBalancer
    Properties:
      VpcId:
        Ref: Vpc
      VSwitchId:
        Ref: VSwitch
      LoadBalancerName:
        Fn::Sub: slb-${ALIYUN::StackName}
      PayType:
        Ref: PayType
      PricingCycle:
        Ref: PayPeriodUnit
      Duration:
        Ref: PayPeriod
      AddressType: intranet
      LoadBalancerSpec:
        Ref: LoadBalancerSpec
      AutoPay: true
  SlbListener:
    DependsOn:
      - Slb
    Type: ALIYUN::SLB::Listener
    Properties:
      Persistence:
        CookieTimeout: 60
        StickySession: 'on'
        PersistenceTimeout: 180
        XForwardedFor: 'off'
        StickySessionType: insert
      ListenerPort: 80
      Bandwidth: -1
      HealthCheck:
        HttpCode: http_2xx,http_3xx,http_4xx,http_5xx
        HealthCheckType: tcp
        UnhealthyThreshold: 3
        Timeout: 5
        HealthyThreshold: 3
        Port: 80
        URI: /
        Interval: 2
      LoadBalancerId:
        Ref: Slb
      BackendServerPort: 80
      Protocol: tcp
  EipSlbAddress:
    Type: ALIYUN::VPC::EIP
    Properties:
      Name:
        Ref: ALIYUN::StackName
      InternetChargeType: PayByTraffic
      Bandwidth:
        Ref: Bandwidth

Definisikan EcsInstanceGroup, WaitCondition, dan WaitConditionHandle

Definisikan sumber daya berikut dalam template: EcsInstanceGroup (menentukan grup instance ECS), WaitCondition (menunggu sinyal), dan WaitConditionHandle (menerima sinyal).

  • Gunakan fungsi Fn::GetAtt untuk mengembalikan nilai properti sumber daya. Dalam potongan kode berikut, nilai CurlCli di WaitConditionHandle dikembalikan. Untuk informasi lebih lanjut, lihat Fungsi.

  • Gunakan fungsi Fn::Sub untuk mengganti variabel dalam string input dengan nilai yang Anda tentukan. Dalam potongan kode berikut, ${CurlCli} di UserData dari EcsInstanceGroup diganti dengan CurlCli. Untuk informasi lebih lanjut, lihat Fungsi.

  • Gunakan ALIYUN::ROS::WaitCondition dan ALIYUN::ROS::WaitConditionHandle untuk mengontrol inisialisasi data di EcsInstanceGroup.

    1. Buat sumber daya ALIYUN::ROS::WaitCondition yang digunakan untuk menunggu sinyal.

    2. Buat sumber daya ALIYUN::ROS::WaitConditionHandle yang digunakan untuk menerima sinyal.

    3. Jalankan skrip yang Anda tentukan di UserData dari EcsInstanceGroup dan kirimkan sinyal dari proses eksekusi. Dalam potongan kode berikut, skrip untuk inisialisasi data ditentukan di UserData dari EcsInstanceGroup dan dieksekusi. Saat eksekusi skrip berhasil, ROS memanggil balik WaitConditionHandle dan gagal WaitCondition.

Resources:
  WaitCondition:
    Type: ALIYUN::ROS::WaitCondition
    Properties:
      Count: 1
      Handle:
        Ref: WaitConditionHandle
      Timeout: 300
  WaitConditionHandle:
    Type: ALIYUN::ROS::WaitConditionHandle
  EcsInstanceGroup:
    Type: ALIYUN::ECS::InstanceGroup
    Properties:
      InstanceChargeType:
        Ref: PayType
      PeriodUnit:
        Ref: PayPeriodUnit
      Period:
        Ref: PayPeriod
      IoOptimized: optimized
      SystemDiskCategory:
        Ref: SystemDiskCategory
      SystemDiskSize:
        Ref: SystemDiskSize
      DiskMappings:
        - Category:
            Ref: DataDiskCategory
          Size:
            Ref: DataDiskSize
      VpcId:
        Ref: Vpc
      SecurityGroupId:
        Ref: EcsSecurityGroup
      VSwitchId:
        Ref: VSwitch
      MaxAmount: 2
      ImageId: centos_7
      InstanceType:
        Ref: EcsInstanceType
      Password:
        Ref: InstancePassword
      AllocatePublicIP: false
      UserData:
        Fn::Sub:
          - |
            #!/bin/bash
            # Lampirkan disk ke direktori /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
            rm -f 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.
            systemctl start nginx.service
            # Saat eksekusi skrip berhasil, ROS memanggil balik WaitConditionHandle dan gagal WaitCondition. 
            ${CurlCli} -d "{\"Data\" : \"Success\", \"status\" : \"SUCCESS\"}"
          - CurlCli:
              Fn::GetAtt:
                - WaitConditionHandle
                - CurlCli
    

Definisikan EcsInstanceGroup, Slb, dan SlbBackendServerAttachment

Definisikan sumber daya berikut dalam template: EcsInstanceGroup, Slb, dan SlbBackendServerAttachment.

  • Gunakan SlbBackendServerAttachment untuk melampirkan grup instance ECS ke instance CLB. Untuk informasi lebih lanjut, lihat ALIYUN::SLB::BackendServerAttachment.

    Tipe sumber daya ALIYUN::SLB::BackendServerAttachment tunduk pada aturan berikut: Jika Anda meninggalkan BackendServerWeightList kosong, nilai bobot setiap instance ECS yang terkandung dalam instance (backend server) yang ditentukan oleh BackendServerList adalah 100. Jika jumlah nilai bobot yang ditentukan oleh BackendServerWeightList kurang dari jumlah instance yang ditentukan oleh BackendServerList, instance ECS yang berlebih diberi nilai bobot terakhir.

  • Gunakan properti DependsOn untuk menentukan bahwa sumber daya hanya dibuat setelah sumber daya dependen dibuat. Saat Anda menambahkan properti DependsOn ke sumber daya, sumber daya hanya dibuat setelah sumber daya yang ditentukan dalam properti DependsOn dibuat. Untuk informasi lebih lanjut, lihat DependsOn.

  • Gunakan fungsi Fn::GetAtt untuk mengembalikan nilai properti sumber daya. Dalam potongan kode berikut, nilai InstanceIds di EcsInstanceGroup dikembalikan. Untuk informasi lebih lanjut, lihat Fungsi.

Resources:
  EcsInstanceGroup:
    Type: ALIYUN::ECS::InstanceGroup
    Properties:
      InstanceChargeType:
        Ref: PayType
      PeriodUnit:
        Ref: PayPeriodUnit
      Period:
        Ref: PayPeriod
      IoOptimized: optimized
      SystemDiskCategory:
        Ref: SystemDiskCategory
      SystemDiskSize:
        Ref: SystemDiskSize
      DiskMappings:
        - Category:
            Ref: DataDiskCategory
          Size:
            Ref: DataDiskSize
      VpcId:
        Ref: Vpc
      SecurityGroupId:
        Ref: EcsSecurityGroup
      VSwitchId:
        Ref: VSwitch
      MaxAmount: 2
      ImageId: centos_7
      InstanceType:
        Ref: EcsInstanceType
      Password:
        Ref: InstancePassword
      AllocatePublicIP: false
  Slb:
    Type: ALIYUN::SLB::LoadBalancer
    Properties:
      VpcId:
        Ref: Vpc
      VSwitchId:
        Ref: VSwitch
      LoadBalancerName:
        Fn::Sub: slb-${ALIYUN::StackName}
      PayType:
        Ref: PayType
      PricingCycle:
        Ref: PayPeriodUnit
      Duration:
        Ref: PayPeriod
      AddressType: intranet
      LoadBalancerSpec:
        Ref: LoadBalancerSpec
      AutoPay: true
  SlbBackendServerAttachment:
    DependsOn:
      - EcsInstanceGroup
      - Slb
    Type: ALIYUN::SLB::BackendServerAttachment
    Properties:
      BackendServerList:
        Fn::GetAtt:
          - EcsInstanceGroup
          - InstanceIds
      LoadBalancerId:
        Ref: Slb
      BackendServerWeightList:
        - 100
        - 50

Template sampel lengkap

ROSTemplateFormatVersion: '2015-09-01'
Description:
  en: Buat VPC dan vSWitch baru, buat satu CLB, dua instance ECS, dan ikat semua instance ECS ke CLB. 
Parameters:
  ZoneId:
    Type: String
    AssociationProperty: ALIYUN::ECS::Instance::ZoneId
    Label:
      en: Zona Ketersediaan vSwitch     
  VpcCidrBlock:
    Default: 192.168.0.0/16
    Label:   
      en: Blok CIDR VPC
    Type: String
    Description:  
      en: Rentang segmen alamat IP jaringan eksklusif baru, disarankan menggunakan segmen IP berikut<font color='green'>[10.0.0.0/8]</font><br><font color='green'>[172.16.0.0/12]</font><br><font color='green'>[192.168.0.0/16]</font>
  VSwitchCidrBlock:
    Default: 192.168.0.0/24
    Type: String
    Description: 
      en: Harus merupakan segmen sub-jaringan dari jaringan eksklusif dan tidak ditempati oleh vSwitch lain.
    Label: 
      en: Blok CIDR vSwitch
  EcsInstanceType:
    Type: String
    Label:
      en: Tipe Instance
    AssociationProperty: ALIYUN::ECS::Instance::InstanceType
    AssociationPropertyMetadata:
      ZoneId: ${ZoneId}
      InstanceChargeType: ${InstanceChargeType}
  SystemDiskCategory:
    Type: String
    Description:
      en: '<font color=''blue''><b>Nilai opsional:</font>[cloud_efficiency: <font color=''green''>Cloud Disk Efisien</font>]<br>[cloud_ssd: <font color=''green''>SSD Cloud Disk</font>]<br>[cloud_essd: <font color=''green''>ESSD Cloud Disk</font>]<br>[cloud: <font color=''green''>Cloud Disk</font>]<br>[ephemeral_ssd: <font color=''green''>Local SSD Cloud Disk</font>]' 
    AssociationProperty: ALIYUN::ECS::Disk::SystemDiskCategory
    AssociationPropertyMetadata:
      ZoneId: ${ZoneId}
      InstanceType: ${EcsInstanceType}
    Label:
      en: Tipe Disk Sistem  
  SystemDiskSize:
    Default: 40
    Type: Number
    Label:
      en: Ruang Disk Sistem
  DataDiskCategory:
    AssociationProperty: ALIYUN::ECS::Disk::DataDiskCategory
    AssociationPropertyMetadata:
      ZoneId: ${ZoneId}
      InstanceType: ${EcsInstanceType}
    Type: String
    Description:
      en: '<font color=''blue''><b>Nilai opsional:</font>[cloud_efficiency: <font color=''green''>Cloud Disk Efisien</font>]<br>[cloud_ssd: <font color=''green''>SSD Cloud Disk</font>]<br>[cloud_essd: <font color=''green''>ESSD Cloud Disk</font>]<br>[cloud: <font color=''green''>Cloud Disk</font>]'
    Label: 
      en: Tipe Disk Data
  DataDiskSize:
    Default: 100
    MaxValue: 32768
    MinValue: 20
    Label: 
      en: Ruang Disk Data
    Type: Number
  InstancePassword:
    NoEcho: true
    Type: String
       
       
    AllowedPattern: '[0-9A-Za-z\_\-\&:;''<>,=%`~!@#\(\)\$\^\*\+\|\{\}\[\]\.\?\/]+$'
    Label:
      en: Kata Sandi Instance
       
    ConstraintDescription:
      en: Panjang 8~30, harus mencakup tiga (Huruf kapital, huruf kecil, angka, ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ Simbol khusus).
       
    MinLength: 8
    MaxLength: 30
    AssociationProperty: ALIYUN::ECS::Instance::Password
  PayType:
    Type: String
    Label:
      en: Jenis Pembayaran Instance ECS
       
    Default: PostPaid
    AllowedValues:
      - PostPaid
      - PrePaid
    AssociationProperty: ChargeType
    AssociationPropertyMetadata:
      LocaleKey: InstanceChargeType
  PayPeriodUnit:
    Type: String
    Description:
      en: Siklus panjang pembelian sumber daya. <br>Week adalah Minggu dan Month adalah Bulan. <br> Nilai default adalah bulan.<br><b><font color='red'> Saat jenis instance ECS adalah PrePaid valid.</font>
        </b></font>
    Label:
      en: Unit Periode Pembayaran
       
    Default: Month
    AllowedValues:
      - Month
      - Year
    AssociationProperty: PayPeriodUnit
    AssociationPropertyMetadata:
      Visible:
        Condition:
          Fn::Not:
            Fn::Equals:
              - ${PayType}
              - PostPaid
  PayPeriod:
    Type: Number
    Label:
      en: Periode
       
    Default: 1
    AllowedValues:
      - 1
      - 2
      - 3
      - 4
      - 5
      - 6
      - 7
      - 8
      - 9
    AssociationProperty: PayPeriod
    AssociationPropertyMetadata:
      Visible:
        Condition:
          Fn::Not:
            Fn::Equals:
              - ${PayType}
              - PostPaid
  LoadBalancerSpec:
    Type: String
    AssociationProperty: ALIYUN::SLB::Instance::InstanceType
    Label:
      en: Spesifikasi LoadBalancer
       
    AssociationPropertyMetadata:
      ZoneId: ${ZoneId}
  Bandwidth:
    Description:
       
      en: 'Rentang nilai: [0, 1000], Satuan: Mbps.'
    Default: 10
    MaxValue: 1000
    Label:
       
      en: Bandwidth Elastic IP CLB
    MinValue: 1
    Type: Number
Resources:
  Vpc:
    Type: ALIYUN::ECS::VPC
    Properties:
      CidrBlock:
        Ref: VpcCidrBlock
      VpcName:
        Ref: ALIYUN::StackName
  VSwitch:
    Type: ALIYUN::ECS::VSwitch
    Properties:
      VSwitchName:
        Ref: ALIYUN::StackName
      VpcId:
        Ref: Vpc
      ZoneId:
        Ref: ZoneId
      CidrBlock:
        Ref: VSwitchCidrBlock
  EcsSecurityGroup:
    Type: ALIYUN::ECS::SecurityGroup
    Properties:
      SecurityGroupName:
        Ref: ALIYUN::StackName
      VpcId:
        Ref: Vpc
      SecurityGroupIngress:
        - PortRange: 80/80
          Priority: 1
          SourceCidrIp: 0.0.0.0/0
          IpProtocol: tcp
          NicType: internet
      SecurityGroupEgress:
        - PortRange: '-1/-1'
          Priority: 1
          IpProtocol: all
          DestCidrIp: 0.0.0.0.0/0
          NicType: internet
        - PortRange: '-1/-1'
          Priority: 1
          IpProtocol: all
          DestCidrIp: 0.0.0.0/0
          NicType: intranet
  WaitCondition:
    Type: ALIYUN::ROS::WaitCondition
    Properties:
      Count: 1
      Handle:
        Ref: WaitConditionHandle
      Timeout: 300
  WaitConditionHandle:
    Type: ALIYUN::ROS::WaitConditionHandle
  EcsInstanceGroup:
    Type: ALIYUN::ECS::InstanceGroup
    Properties:
      InstanceChargeType:
        Ref: PayType
      PeriodUnit:
        Ref: PayPeriodUnit
      Period:
        Ref: PayPeriod
      IoOptimized: optimized
      SystemDiskCategory:
        Ref: SystemDiskCategory
      SystemDiskSize:
        Ref: SystemDiskSize
      DiskMappings:
        - Category:
            Ref: DataDiskCategory
          Size:
            Ref: DataDiskSize
      VpcId:
        Ref: Vpc
      SecurityGroupId:
        Ref: EcsSecurityGroup
      VSwitchId:
        Ref: VSwitch
      MaxAmount: 2
      ImageId: centos_7
      InstanceType:
        Ref: EcsInstanceType
      Password:
        Ref: InstancePassword
      AllocatePublicIP: false
      UserData:
        Fn::Sub:
          - |
            #!/bin/bash
            # Lampirkan disk ke direktori /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
            rm -f 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.
            systemctl start nginx.service
            # Saat eksekusi skrip berhasil, ROS memanggil balik WaitConditionHandle dan gagal WaitCondition. 
            ${CurlCli} -d "{\"Data\" : \"Success\", \"status\" : \"SUCCESS\"}"
          - CurlCli:
              Fn::GetAtt:
                - WaitConditionHandle
                - CurlCli
  Slb:
    Type: ALIYUN::SLB::LoadBalancer
    Properties:
      VpcId:
        Ref: Vpc
      VSwitchId:
        Ref: VSwitch
      LoadBalancerName:
        Fn::Sub: slb-${ALIYUN::StackName}
      PayType:
        Ref: PayType
      PricingCycle:
        Ref: PayPeriodUnit
      Duration:
        Ref: PayPeriod
      AddressType: intranet
      LoadBalancerSpec:
        Ref: LoadBalancerSpec
      AutoPay: true
  EipSlbAddress:
    Type: ALIYUN::VPC::EIP
    Properties:
      Name:
        Ref: ALIYUN::StackName
      InternetChargeType: PayByTraffic
      Bandwidth:
        Ref: Bandwidth
  EipSlbAddressAssociation:
    Type: ALIYUN::VPC::EIPAssociation
    Properties:
      InstanceId:
        Ref: Slb
      AllocationId:
        Ref: EipSlbAddress
  SlbBackendServerAttachment:
    DependsOn:
      - EcsInstanceGroup
    Type: ALIYUN::SLB::BackendServerAttachment
    Properties:
      BackendServerList:
        Fn::GetAtt:
          - EcsInstanceGroup
          - InstanceIds
      LoadBalancerId:
        Ref: Slb
      BackendServerWeightList:
        - 100
        - 100
  SlbListener:
    DependsOn:
      - Slb
    Type: ALIYUN::SLB::Listener
    Properties:
      Persistence:
        CookieTimeout: 60
        StickySession: 'on'
        PersistenceTimeout: 180
        XForwardedFor: 'off'
        StickySessionType: insert
      ListenerPort: 80
      Bandwidth: -1
      HealthCheck:
        HttpCode: http_2xx,http_3xx,http_4xx,http_5xx
        HealthCheckType: tcp
        UnhealthyThreshold: 3
        Timeout: 5
        HealthyThreshold: 3
        Port: 80
        URI: /
        Interval: 2
      LoadBalancerId:
        Ref: Slb
      BackendServerPort: 80
      Protocol: tcp
Outputs:
  Endpoint:
    Description:
       
      en: Alamat IP Publik.
    Value:
      Fn::Sub:
        - http://${ServerAddress}
        - ServerAddress:
            Fn::GetAtt:
              - EipSlbAddress
              - EipAddress

Tambahkan grup parameter ke template dan tampilkan nilai valid dari parameter berdasarkan kondisi filter

Pada template sebelumnya, beberapa sumber daya didefinisikan dan dihubungkan. Nilai properti LoadBalancerSpec dari sumber daya Slb serta nilai-nilai properti InstanceType dan SystemDiskCategory dari sumber daya EcsInstanceGroup merujuk pada nilai parameter tertentu. Setiap kali Anda membuat stack di wilayah yang berbeda, Anda harus memodifikasi struktur template dan mengubah nilai propertinya.

Dalam hal ini, Anda dapat menambahkan bagian Parameters untuk meningkatkan fleksibilitas dan kemampuan penggunaan ulang template.

Tambahkan grup parameter ke template

Anda dapat menambahkan bagian Metadata ke template untuk mengelompokkan parameter yang didefinisikan di bagian Parameters dan mendefinisikan label untuk setiap grup.

Setelah Anda mendefinisikan sumber daya dan parameter dalam sebuah template, Anda dapat mengelompokkan parameter berdasarkan sumber daya atau berdasarkan parameter sumber daya.

Tabel berikut mencantumkan kelompok parameter yang ditambahkan berdasarkan template sampel lengkap. Dalam contoh ini, parameter dikelompokkan berdasarkan nama sumber daya atau nama parameter sumber daya.

Kelompok parameter

Nama sumber daya

Nama parameter sumber daya

Konfigurasi jaringan dasar

Vpc, VSwitch, dan EcsSecurityGroup

ZoneId, VpcCidrBlock, VSwitchCidrBlock

Konfigurasi CLB

Slb dan EipSlbAddress

LoadBalancerSpec dan Bandwidth

Konfigurasi ECS

EcsInstanceGroup

PayType, PayPeriodUnit, PayPeriod, ECSInstanceType, ECSDiskSize, ECSDiskCategory, dan EcsInstancePassword

Tampilkan nilai-nilai valid dari sebuah parameter berdasarkan kondisi filter

Jika Anda ingin menentukan kondisi filter untuk sebuah parameter dan mengaitkan nilai parameter dengan kondisi filter yang dipilih di konsol ROS, Anda dapat menentukan AssociationProperty dan AssociationPropertyMetadata di dalam template Anda. Dalam contoh ini, nilai-nilai valid dari parameter ECSInstanceType ditampilkan berdasarkan nilai dari ZoneId dan InstanceChargeType. Untuk menentukan AssociationProperty dan AssociationPropertyMetadata di ECSInstanceType, gunakan ALIYUN::ECS::InstanceGroup untuk memeriksa nilai AssociationProperty yang didukung oleh ECSInstanceType di dalam dokumentasi ROS. Nilai berikut ditemukan: ALIYUN::ECS::Instance::InstanceType. Kemudian, periksa nilai AssociationPropertyMetadata ketika AssociationProperty disetel ke ALIYUN::ECS::Instance::InstanceType dan ketika ZoneId dan InstanceChargeType digunakan sebagai kondisi filter. Untuk informasi lebih lanjut tentang dokumentasi, lihat AssociationProperty dan AssociationPropertyMetadata.

Template sampel lengkap

ROSTemplateFormatVersion: '2015-09-01'
Description:
  en: Buat VPC dan vSWitch baru, buat satu CLB, dua instance ECS, dan ikat semua instance ECS ke CLB.
   
Parameters:
  ZoneId:
    Type: String
    AssociationProperty: ALIYUN::ECS::Instance::ZoneId
    Label:
      en: Zona Ketersediaan vSwitch
       
  VpcCidrBlock:
    Default: 192.168.0.0/16
    Label:
       
      en: Blok CIDR VPC
    Type: String
    Description:
       
      en: Rentang segmen alamat IP jaringan eksklusif baru, disarankan menggunakan segmen IP berikut<font color='green'>[10.0.0.0/8]</font><br><font color='green'>[172.16.0.0/12]</font><br><font color='green'>[192.168.0.0/16]</font>
  VSwitchCidrBlock:
    Default: 192.168.0.0/24
    Type: String
    Description:
       
      en: Harus merupakan segmen sub-jaringan dari jaringan eksklusif dan tidak ditempati oleh vSwitch lain.
    Label:
       
      en: Blok CIDR vSwitch
  EcsInstanceType:
    Type: String
    Label:
      en: Tipe Instance
       
    AssociationProperty: ALIYUN::ECS::Instance::InstanceType
    AssociationPropertyMetadata:
      ZoneId: ${ZoneId}
      InstanceChargeType: ${InstanceChargeType}
  SystemDiskCategory:
    Type: String
    Description:
      en: '<font color=''blue''><b>Nilai opsional:</font>[cloud_efficiency: <font color=''green''>Cloud Disk Efisien</font>]<br>[cloud_ssd: <font color=''green''>SSD Cloud Disk</font>]<br>[cloud_essd: <font color=''green''>ESSD Cloud Disk</font>]<br>[cloud: <font color=''green''>Cloud Disk</font>]<br>[ephemeral_ssd: <font color=''green''>Local SSD Cloud Disk</font>]'
       
    AssociationProperty: ALIYUN::ECS::Disk::SystemDiskCategory
    AssociationPropertyMetadata:
      ZoneId: ${ZoneId}
      InstanceType: ${EcsInstanceType}
    Label:
      en: Tipe Disk Sistem
       
  SystemDiskSize:
    Default: 40
    Type: Number
    Description:
       
      en: 'Ukuran disk sistem, rentang nilai: 40-500, satuan: GB.'
    Label:
       
      en: Ruang Disk Sistem
  DataDiskCategory:
    AssociationProperty: ALIYUN::ECS::Disk::DataDiskCategory
    AssociationPropertyMetadata:
      ZoneId: ${ZoneId}
      InstanceType: ${EcsInstanceType}
    Type: String
    Description:
       
      en: '<font color=''blue''><b>Nilai opsional:</font>[cloud_efficiency: <font color=''green''>Cloud Disk Efisien</font>]<br>[cloud_ssd: <font color=''green''>SSD Cloud Disk</font>]<br>[cloud_essd: <font color=''green''>ESSD Cloud Disk</font>]<br>[cloud: <font color=''green''>Cloud Disk</font>]'
    Label:
       
      en: Tipe Disk Data
  DataDiskSize:
    Description:
        
      en: 'Ukuran disk instance ECS, rentang nilai: 20-32768, satuan: GB.'
    Default: 100
    MaxValue: 32768
    MinValue: 20
    Label:
       
      en: Ruang Disk Data
    Type: Number
  InstancePassword:
    NoEcho: true
    Type: String
    Description:
      en: Kata sandi login server, Panjang 8~30, harus mencakup tiga (Huruf kapital, huruf kecil, angka, ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ Simbol khusus).
       
    AllowedPattern: '[0-9A-Za-z\_\-\&:;''<>,=%`~!@#\(\)\$\^\*\+\|\{\}\[\]\.\?\/]+$'
    Label:
      en: Kata Sandi Instance
       
    ConstraintDescription:
      en: Panjang 8~30, harus mencakup tiga (Huruf kapital, huruf kecil, angka, ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ Simbol khusus).
       
    MinLength: 8
    MaxLength: 30
    AssociationProperty: ALIYUN::ECS::Instance::Password
  PayType:
    Type: String
    Label:
      en: Jenis Pembayaran Instance ECS
       
    Default: PostPaid
    AllowedValues:
      - PostPaid
      - PrePaid
    AssociationProperty: ChargeType
    AssociationPropertyMetadata:
      LocaleKey: InstanceChargeType
  PayPeriodUnit:
    Type: String
    Description:
      en: Siklus panjang pembelian sumber daya. <br>Week adalah Minggu dan Month adalah Bulan. <br> Nilai default adalah bulan.<br><b><font color='red'> Saat jenis instance ECS adalah PrePaid valid.</font>
        </b></font>
    Label:
      en: Unit Periode Pembayaran
       
    Default: Month
    AllowedValues:
      - Month
      - Year
    AssociationProperty: PayPeriodUnit
    AssociationPropertyMetadata:
      Visible:
        Condition:
          Fn::Not:
            Fn::Equals:
              - ${PayType}
              - PostPaid
  PayPeriod:
    Type: Number
    Label:
      en: Periode
       
    Default: 1
    AllowedValues:
      - 1
      - 2
      - 3
      - 4
      - 5
      - 6
      - 7
      - 8
      - 9
    AssociationProperty: PayPeriod
    AssociationPropertyMetadata:
      Visible:
        Condition:
          Fn::Not:
            Fn::Equals:
              - ${PayType}
              - PostPaid
  LoadBalancerSpec:
    Type: String
    AssociationProperty: ALIYUN::SLB::Instance::InstanceType
    Label:
      en: Spesifikasi LoadBalancer
       
    AssociationPropertyMetadata:
      ZoneId: ${ZoneId}
  Bandwidth:
    Description:
       
      en: 'Rentang nilai: [0, 1000], Satuan: Mbps.'
    Default: 10
    MaxValue: 1000
    Label:
       
      en: Bandwidth Elastic IP CLB
    MinValue: 1
    Type: Number
Resources:
  Vpc:
    Type: ALIYUN::ECS::VPC
    Properties:
      CidrBlock:
        Ref: VpcCidrBlock
      VpcName:
        Ref: ALIYUN::StackName
  VSwitch:
    Type: ALIYUN::ECS::VSwitch
    Properties:
      VSwitchName:
        Ref: ALIYUN::StackName
      VpcId:
        Ref: Vpc
      ZoneId:
        Ref: ZoneId
      CidrBlock:
        Ref: VSwitchCidrBlock
  EcsSecurityGroup:
    Type: ALIYUN::ECS::SecurityGroup
    Properties:
      SecurityGroupName:
        Ref: ALIYUN::StackName
      VpcId:
        Ref: Vpc
      SecurityGroupIngress:
        - PortRange: 80/80
          Priority: 1
          SourceCidrIp: 0.0.0.0/0
          IpProtocol: tcp
          NicType: internet
      SecurityGroupEgress:
        - PortRange: '-1/-1'
          Priority: 1
          IpProtocol: all
          DestCidrIp: 0.0.0.0/0
          NicType: internet
        - PortRange: '-1/-1'
          Priority: 1
          IpProtocol: all
          DestCidrIp: 0.0.0.0/0
          NicType: intranet
  WaitCondition:
    Type: ALIYUN::ROS::WaitCondition
    Properties:
      Count: 1
      Handle:
        Ref: WaitConditionHandle
      Timeout: 300
  WaitConditionHandle:
    Type: ALIYUN::ROS::WaitConditionHandle
  EcsInstanceGroup:
    Type: ALIYUN::ECS::InstanceGroup
    Properties:
      InstanceChargeType:
        Ref: PayType
      PeriodUnit:
        Ref: PayPeriodUnit
      Period:
        Ref: PayPeriod
      IoOptimized: optimized
      SystemDiskCategory:
        Ref: SystemDiskCategory
      SystemDiskSize:
        Ref: SystemDiskSize
      DiskMappings:
        - Category:
            Ref: DataDiskCategory
          Size:
            Ref: DataDiskSize
      VpcId:
        Ref: Vpc
      SecurityGroupId:
        Ref: EcsSecurityGroup
      VSwitchId:
        Ref: VSwitch
      MaxAmount: 2
      ImageId: centos_7
      InstanceType:
        Ref: EcsInstanceType
      Password:
        Ref: InstancePassword
      AllocatePublicIP: false
      UserData:
        Fn::Sub:
          - |
            #!/bin/bash
            # Lampirkan disk ke direktori /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
            rm -f 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.
            systemctl start nginx.service
            # Saat eksekusi skrip berhasil, ROS memanggil balik WaitConditionHandle dan gagal WaitCondition. 
            ${CurlCli} -d "{\"Data\" : \"Success\", \"status\" : \"SUCCESS\"}"
          - CurlCli:
              Fn::GetAtt:
                - WaitConditionHandle
                - CurlCli
  Slb:
    Type: ALIYUN::SLB::LoadBalancer
    Properties:
      VpcId:
        Ref: Vpc
      VSwitchId:
        Ref: VSwitch
      LoadBalancerName:
        Fn::Sub: slb-${ALIYUN::StackName}
      PayType:
        Ref: PayType
      PricingCycle:
        Ref: PayPeriodUnit
      Duration:
        Ref: PayPeriod
      AddressType: intranet
      LoadBalancerSpec:
        Ref: LoadBalancerSpec
      AutoPay: true
  EipSlbAddress:
    Type: ALIYUN::VPC::EIP
    Properties:
      Name:
        Ref: ALIYUN::StackName
      InternetChargeType: PayByTraffic
      Bandwidth:
        Ref: Bandwidth
  EipSlbAddressAssociation:
    Type: ALIYUN::VPC::EIPAssociation
    Properties:
      InstanceId:
        Ref: Slb
      AllocationId:
        Ref: EipSlbAddress
  SlbBackendServerAttachment:
    DependsOn:
      - EcsInstanceGroup
    Type: ALIYUN::SLB::BackendServerAttachment
    Properties:
      BackendServerList:
        Fn::GetAtt:
          - EcsInstanceGroup
          - InstanceIds
      LoadBalancerId:
        Ref: Slb
      BackendServerWeightList:
        - 100
        - 50
  SlbListener:
    DependsOn:
      - Slb
    Type: ALIYUN::SLB::Listener
    Properties:
      Persistence:
        CookieTimeout: 60
        StickySession: 'on'
        PersistenceTimeout: 180
        XForwardedFor: 'off'
        StickySessionType: insert
      ListenerPort: 80
      Bandwidth: -1
      HealthCheck:
        HttpCode: http_2xx,http_3xx,http_4xx,http_5xx
        HealthCheckType: tcp
        UnhealthyThreshold: 3
        Timeout: 5
        HealthyThreshold: 3
        Port: 80
        URI: /
        Interval: 2
      LoadBalancerId:
        Ref: Slb
      BackendServerPort: 80
      Protocol: tcp
Outputs:
  Endpoint:
    Description:
       
      en: Alamat IP Publik
    Value:
      Fn::Sub:
        - http://${ServerAddress}
        - ServerAddress:
            Fn::GetAtt:
              - EipSlbAddress
              - EipAddress
Metadata:
  ALIYUN::ROS::Interface:
    ParameterGroups:
      - Parameters:
          - ZoneId
          - VpcCidrBlock
          - VSwitchCidrBlock
        Label:
          default:
             
            en: Konfigurasi Jaringan Dasar
      - Parameters:
          - PayType
          - PayPeriodUnit
          - PayPeriod
        Label:
          default:
            en: Konfigurasi Jenis Pembayaran
             
      - Parameters:
          - EcsInstanceType
          - SystemDiskCategory
          - SystemDiskSize
          - DataDiskCategory
          - DataDiskSize
          - InstancePassword
        Label:
          default:
            en: Konfigurasi Instance
             
      - Parameters:
          - LoadBalancerSpec
          - Bandwidth
        Label:
          default:
            en: Konfigurasi CLB