All Products
Search
Document Center

CloudOps Orchestration Service:Loop

Last Updated:Jun 28, 2025

Operation Orchestration Service (OOS) menyediakan atribut tugas khusus Loop, yang digunakan untuk mengulang satu tugas.

Tugas yang dikembangkan berdasarkan API actions dan cloud product actions mendukung loop, sedangkan tugas yang dikembangkan berdasarkan functional actions seperti Trigger dan Sleep tidak mendukung loop.

Beberapa item loop dapat dieksekusi secara bersamaan. Namun, dalam mode manual, item loop harus dieksekusi satu per satu.

Batasan

Jumlah maksimum item loop adalah 1.000.

Sintaksis

  • Format YAML

---
Tasks:
  - Name: TaskName1 # Wajib. Nama tugas. Nama dapat berisi huruf kecil, huruf besar, angka, garis bawah (_), dan tanda hubung (-). Panjangnya bisa mencapai 200 karakter. Kami merekomendasikan Anda menggunakan camel case untuk nama. Contoh: StartInstance.
    Action: TaskType # Wajib. Jenis tugas atau aksi. Untuk informasi lebih lanjut, lihat dokumentasi terkait.
    Description: deskripsi # Opsional. Deskripsi tugas, seperti tujuan dari tugas.
    Properties: # Atribut tugas. Daftar atribut bervariasi tergantung pada aksi yang digunakan. Untuk informasi lebih lanjut, lihat dokumentasi terkait.
      Property1: Value1 # Atribut yang bergantung pada aksi.
    Outputs: # Parameter keluaran tugas. Parameter ini dapat digunakan sebagai masukan tugas berikutnya atau keluaran template.
      OutputParameterName1:
        Type: TypeName # Opsional. Jenis parameter keluaran. Nilai default: String.
        ValueSelector: "jq selector" # jQuery selector untuk memilih data JSON yang diperlukan. Misalnya, ketika Anda memanggil operasi API untuk suatu tugas, jQuery selector mengekstrak informasi yang diperlukan dari data JSON yang dikembalikan. Untuk informasi lebih lanjut, lihat contoh aksi produk cloud dan template publik.
    Loop:
      Items: [i-id1,i-id2,i-id3,i-id4] # Wajib. Daftar yang berisi item, seperti [i-id1,i-id2,i-id3,i-id4], atau parameter bertipe List, seperti {{describeInstance.InstanceIds}}. Item yang diperoleh dengan melintasi daftar bertindak sebagai masukan untuk menjalankan iterasi berikutnya dari tugas loop.
      RateControl:
          MaxErrors: 0 # Opsional. Batas kesalahan. Anda dapat mengatur atribut ini ke angka atau persentase, seperti 10 atau 10%. Nilai default: 0.
          Mode: "Batch/Concurrency" # Wajib. Mode untuk mengontrol laju eksekusi loop. Nilai valid: Concurrency dan Batch. Concurrency menunjukkan eksekusi bersamaan dan Batch menunjukkan eksekusi batch.
          Batch: [1, 2, 3] # Opsional. Mode kontrol batch. Parameter ini valid ketika parameter Mode diatur ke Batch. Untuk informasi lebih lanjut, lihat bagian "Kontrol ukuran batch".
          ConcurrencyInBatches: [1, 1, 1] # Opsional. Jumlah maksimum item bersamaan dari setiap batch. Nilai default: 20. Parameter ini valid ketika parameter Mode diatur ke Batch. Masukkan jumlah item bersamaan dari setiap batch dalam tanda kurung ([]).
          Concurrency: 1 # Opsional. Jumlah maksimum item bersamaan. Parameter ini valid ketika parameter Mode diatur ke Concurrency. Anda dapat mengatur atribut ini ke angka atau persentase. Nilai default: 1.
          BatchPauseOption: "FirstBatchPause/Automatic/EveryBatchPause" # Opsional. Tentukan apakah akan menangguhkan eksekusi batch ketika setiap batch selesai. Parameter ini valid ketika Mode diatur ke Batch. Nilai valid: FirstBatchPause, Automatic, dan EveryBatchPause. FirstBatchPause menunjukkan penangguhan eksekusi setelah batch pertama selesai. Automatic menunjukkan eksekusi otomatis tanpa penangguhan. EveryBatchPause menunjukkan penangguhan eksekusi setelah setiap batch selesai.
      Outputs:
        FinalOutputParameterName1: # Nama parameter keluaran setelah tugas loop diproses oleh fungsi.
          AggregateType: BuiltInFunctionName1 # Fungsi bawaan untuk menggabungkan keluaran, seperti Fn::Sum, Fn::Max, dan Fn::ListJoin.
          AggregateField: OutputParameterName1 # Parameter keluaran dari tugas loop.
  • Format JSON (Untuk informasi lebih lanjut, lihat deskripsi parameter untuk format YAML.)

{
  "Tasks": [
    {
      "Name": "TaskName1",
      "Action": "TaskType",
      "Description": "deskripsi",
      "Properties": {
        "Property1": "Value1"
      },
      "Outputs": {
        "OutputParameterName1": {
          "Type": "TypeName",
          "ValueSelector": "jq selector"
        }
      },
      "Loop": {
        "Items": [
          "i-id1",
          "i-id2",
          "i-id3",
          "i-id4"
        ],
        "RateControl": {
          "MaxErrors": 0,
          "Mode": "Concurrency/Batch",
          "Batch": [
            1,
            2,
            3
          ],
          "ConcurrencyInBatches": [
            1,
            1,
            1
          ],
          "Concurrency": 1,
          "BatchPauseOption": "FirstBatchPause/Automatic/EveryBatchPause"
        },
        "Outputs": {
          "FinalOutputParameterName1": {
            "AggregateType": "BuiltInFunctionName1",
            "AggregateField": "OutputParameterName1"
          }
        }
      }
    }
  ]
}

Items

Atribut Items dapat bertipe List, seperti List: [item1, item2, item3].

Atribut ini juga dapat diatur ke parameter bertipe List, seperti parameter keluaran dari tugas sebelumnya yang bertipe List.

  • Items sebagai daftar

    • Format YAML

    Loop:
      Items: [item1,item2,item3,item4] # Daftar yang berisi beberapa item, seperti [i-id1,i-id2,i-id3,i-id4]. Item yang dikembalikan untuk setiap iterasi loop bertindak sebagai masukan untuk menjalankan iterasi berikutnya.					
    • Format JSON (Untuk informasi lebih lanjut, lihat deskripsi parameter untuk format YAML.)

    {
      "Items": [
        "item1",
        "item2",
        "item3",
        "item4"
      ]
    }		
  • Items sebagai parameter bertipe List

    • Format YAML

    Items: '{{ParameterName1}} ' # Parameter bertipe List, seperti describeInstance.InstanceIds. Nilai parameter yang dikembalikan untuk setiap iterasi loop bertindak sebagai masukan untuk menjalankan iterasi berikutnya.	
    • Format JSON (Untuk informasi lebih lanjut, lihat deskripsi parameter untuk format YAML.)

    {
      "Items": "{{ParameterName1}}"
    }		

Kontrol laju eksekusi loop

Anda dapat mengontrol laju eksekusi loop dengan cara berikut:

  1. Kontrol jumlah item bersamaan. Item dieksekusi berdasarkan jumlah item bersamaan yang ditentukan hingga semua item selesai dieksekusi.

  2. Kontrol ukuran batch. Semua item dibagi menjadi beberapa batch. Batch dieksekusi satu per satu, dan batch berikutnya hanya dapat dieksekusi setelah batch sebelumnya menyelesaikan eksekusi.

Kontrol jumlah item bersamaan

  • Misalnya, jika daftar berisi 10 item dan konkurensi adalah 3, maka tiga item akan dieksekusi secara bersamaan setiap kali hingga semua item selesai dieksekusi.

    • Format YAML

    Concurrency: 3 # Jumlah item bersamaan. Contoh: 3.
    Mode: Concurrency
    • Format JSON (Untuk informasi lebih lanjut, lihat deskripsi parameter untuk format YAML.)

    {
      "Concurrency": 3,
      "Mode": "Concurrency"
    }
  • Misalnya, jika daftar berisi 10 item dan konkurensi adalah 20%, maka 20% dari item, yaitu dua item, akan dieksekusi secara bersamaan setiap kali hingga semua item selesai dieksekusi.

    • Format YAML

    Concurrency: 20% # Opsional. Persentase item yang dieksekusi bersamaan setiap kali terhadap semua item. Contoh: 20%.
    Mode: Concurrency
    • Format JSON (Untuk informasi lebih lanjut, lihat deskripsi parameter untuk format YAML.)

    {
      "Concurrency": "20%",
      "Mode": "Concurrency"
    }

Kontrol ukuran batch

  • Misalnya, jika daftar berisi 10 item dan ukuran batch adalah [3], maka semua item akan dibagi menjadi empat batch dengan tiga item per batch. Jumlah item di masing-masing dari empat batch adalah 3, 3, 3, dan 1 jika semua item berhasil dieksekusi.

    • Format YAML

    Batch: [1, 2, 3] # Opsional. Jumlah item di setiap batch. Contoh: [3].
    Mode: Batch
    • Format JSON (Untuk informasi lebih lanjut, lihat deskripsi parameter untuk format YAML.)

    {
      "Batch": [
        1,
        2,
        3
      ],
      "Mode": "Batch"
    }
  • Misalnya, jika daftar berisi 10 item dan ukuran batch adalah [30%], maka semua item akan dibagi menjadi empat batch dengan 30% dari item, yaitu tiga item per batch. Jumlah item di masing-masing dari empat batch adalah 3, 3, 3, dan 1 jika semua item berhasil dieksekusi.

    • Format YAML

    Batch: [30%] # Opsional. Persentase item di setiap batch terhadap semua item. Contoh: 30%.
    Mode: Batch
    					
    • Format JSON (Untuk informasi lebih lanjut, lihat deskripsi parameter untuk format YAML.)

    {
      "Batch": [
        "30%"
      ],
      "Mode": "Batch"
    }
  • Misalnya, jika daftar berisi 10 item dan ukuran batch adalah [3, 10%, 30%], maka tiga item ada di batch pertama, 10% dari item, yaitu satu item, ada di batch kedua, dan [30%] dari item, yaitu tiga item, ada di batch ketiga dan setiap batch berikutnya. Jumlah item di masing-masing dari empat batch adalah 3, 1, 3, dan 3 jika semua item berhasil dieksekusi.

    • Format YAML

    Mode: Batch
    Batch: [3, 10%, 30%] # Opsional. Daftar angka dan persentase yang menunjukkan jumlah item di setiap batch. Contoh: [3, 10%, 30%].
    					
    • Format JSON (Untuk informasi lebih lanjut, lihat deskripsi parameter untuk format YAML.)

    {
      "Mode": "Batch",
      "Batch": [
        3,
        "10%",
        "30%"
      ]
    }

MaxErrors

Anda dapat mendefinisikan MaxErrors untuk tugas loop berdasarkan deskripsi berikut:

  1. Anda dapat mengatur atribut ini ke angka atau persentase, seperti 10 atau 10%. Jika atribut diatur ke persentase, kalikan jumlah total item dengan persentase untuk mendapatkan jumlah maksimum kesalahan yang diizinkan. Nilai default adalah 0, yang menunjukkan bahwa tugas loop berhenti begitu terjadi kesalahan.

  2. Item pertama dalam loop selalu dieksekusi.

  3. Hubungan antara MaxErrors dan ErrorCount menentukan apakah item kedua atau item berikutnya dapat dieksekusi.

    • Jika nilai ErrorCount lebih besar dari MaxErrors, item berikutnya tidak dapat dieksekusi dan tugas loop ditandai gagal.

    • Jika nilai ErrorCount sama dengan atau lebih kecil dari MaxErrors, item berikutnya dapat dieksekusi.

  4. Status eksekusi tugas loop ditentukan berdasarkan kondisi perbandingan: ErrorCount > MaxErrors. Jika kondisi benar, status eksekusi adalah Gagal. Jika kondisi salah, status eksekusi adalah Sukses.

  • MaxErrors sebagai angka

    • Format YAML

      MaxErrors: 2 # Opsional. Jumlah maksimum kesalahan yang diizinkan. Contoh: 2.
    • Format JSON (Untuk informasi lebih lanjut, lihat deskripsi parameter untuk format YAML.)

      {
       "MaxErrors": 2 
      }
  • MaxErrors sebagai persentase

    • Format YAML

      MaxErrors: 25% # Opsional. Persentase jumlah maksimum kesalahan yang diizinkan terhadap jumlah total item. Anggaplah Anda mengatur atribut ini ke 25% dan daftar berisi 4 item. Dalam hal ini, jumlah maksimum kesalahan yang diizinkan adalah 1.
    • Format JSON (Untuk informasi lebih lanjut, lihat deskripsi parameter untuk format YAML.)

      {
       "MaxErrors": "25%"
      }

Keluaran loop

Dalam template, bukan hanya setiap tugas loop tetapi juga setiap iterasi dari tugas loop menghasilkan keluaran. Keluaran loop aktual berisi keluaran dari beberapa item. Oleh karena itu, Anda perlu menggabungkan keluaran dari beberapa tugas anak untuk mendapatkan keluaran loop akhir. Anda dapat mengatur AggregateType ke fungsi bawaan untuk menggabungkan keluaran loop.

Definisikan AggregateType.

  • Format YAML

AggregateType: Fn::Max # Fungsi bawaan untuk menggabungkan keluaran loop, seperti Fn::Max, yang memilih nilai OutputParameterName1 terbesar dari semua tugas anak sebagai nilai keluaran loop.
  • Format JSON (Untuk informasi lebih lanjut, lihat deskripsi parameter untuk format YAML.)

{
"AggregateType": "Fn::Max"
}		

Contoh

Mode konkurensi

  • Format YAML

FormatVersion: OOS-2019-06-01
Description: Membuat satu atau lebih instance ECS.
Parameters:
  regionId:
    Description: ID wilayah.
    Type: String
    Default: '{{ ACS::RegionId }}'
  imageId:
    Description: ID sumber daya gambar yang Anda tentukan saat membuat instance.
    Type: String
    AllowedPattern: '[A-Za-z0-9_\-\.] *'
    MinLength: 1
    MaxLength: 100
  instanceType:
    Description: Jenis instance.
    Type: String
    AllowedPattern: ecs\.[ A-Za-z0-9\. \-]*
    MaxLength: 30
    MinLength: 1
  securityGroupId:
    Description: ID grup keamanan tempat instance termasuk.
    Type: String
    AllowedPattern: sg-[A-Za-z0-9]*
    MaxLength: 30
    MinLength: 1
  vSwitchId:
    Description: ID VSwitch.
    Type: String
    AllowedPattern: vsw-[A-Za-z0-9]*
    MaxLength: 30
    MinLength: 1
  amount:
    Description: Jumlah instance yang ingin Anda buat.
    Type: Number
    Default: 1
  internetMaxBandwidthIn:
    Description: Bandwidth publik masuk maksimum.
    Type: Number
    Default: 200
  internetMaxBandwidthOut:
    Description: Bandwidth publik keluar maksimum.
    Type: Number
    Default: 0
Tasks:
- Name: runInstances
  Action: ACS::ExecuteAPI
  Description: Membuat satu atau lebih instance.
  Properties:
    Service: ECS
    API: RunInstances
    Parameters:
      RegionId: '{{ regionId }}'
      Amount: '{{ amount }}'
      ImageId: '{{ imageId }}'
      InstanceType: '{{ instanceType }}'
      SecurityGroupId: '{{ securityGroupId }}'
      VSwitchId: '{{ vSwitchId }}'
      InternetMaxBandwidthIn: '{{ internetMaxBandwidthIn }}'
      InternetMaxBandwidthOut: '{{ internetMaxBandwidthOut }}'
  Outputs:
    instanceIds:
      Type: List
      ValueSelector: InstanceIdSets.InstanceIdSet[]
- Name: untilInstanceReady
  Action: ACS::WaitFor
  Description: Menunggu instance yang dibuat menjadi Running.
  Properties:
    Service: ECS
    API: DescribeInstances
    Parameters:
      RegionId: '{{ regionId }}'
      InstanceIds:
      - '{{ ACS::TaskLoopItem }}'
    DesiredValues:
    - Running
    PropertySelector: Instances.Instance[].Status
  Loop:
    RateControl:
      Mode: Concurrency
      MaxErrors: 0
      Concurrency: 1
    Items: '{{ runInstances.instanceIds }}'
Outputs:
  instanceIds:
    Type: List
    Value: '{{ runInstances.instanceIds }}'
			
  • Format JSON

{
  "FormatVersion": "OOS-2019-06-01",
  "Description": "Membuat satu atau lebih instance ECS.",
  "Parameters": {
    "regionId": {
      "Description": "ID wilayah.",
      "Type": "String",
      "Default": "{{ ACS::RegionId }}"
    },
    "imageId": {
      "Description": "ID sumber daya gambar yang Anda tentukan saat membuat instance.",
      "Type": "String",
      "AllowedPattern": "[A-Za-z0-9_\\-\\.] *",
      "MinLength": 1,
      "MaxLength": 100
    },
    "instanceType": {
      "Description": "Jenis instance.",
      "Type": "String",
      "AllowedPattern": "ecs\\.[ A-Za-z0-9\\. \\-]*",
      "MaxLength": 30,
      "MinLength": 1
    },
    "securityGroupId": {
      "Description": "ID grup keamanan tempat instance termasuk.",
      "Type": "String",
      "AllowedPattern": "sg-[A-Za-z0-9]*",
      "MaxLength": 30,
      "MinLength": 1
    },
    "vSwitchId": {
      "Description": "ID VSwitch.",
      "Type": "String",
      "AllowedPattern": "vsw-[A-Za-z0-9]*",
      "MaxLength": 30,
      "MinLength": 1
    },
    "amount": {
      "Description": "Jumlah instance yang ingin Anda buat.",
      "Type": "Number",
      "Default": 1
    },
    "internetMaxBandwidthIn": {
      "Description": "Bandwidth publik masuk maksimum.",
      "Type": "Number",
      "Default": 200
    },
    "internetMaxBandwidthOut": {
      "Description": "Bandwidth publik keluar maksimum.",
      "Type": "Number",
      "Default": 0
    }
  },
  "Tasks": [
    {
      "Name": "runInstances",
      "Action": "ACS::ExecuteAPI",
      "Description": "Membuat satu atau lebih instance.",
      "Properties": {
        "Service": "ECS",
        "API": "RunInstances",
        "Parameters": {
          "RegionId": "{{ regionId }}",
          "Amount": "{{ amount }}",
          "ImageId": "{{ imageId }}",
          "InstanceType": "{{ instanceType }}",
          "SecurityGroupId": "{{ securityGroupId }}",
          "VSwitchId": "{{ vSwitchId }}",
          "InternetMaxBandwidthIn": "{{ internetMaxBandwidthIn }}",
          "InternetMaxBandwidthOut": "{{ internetMaxBandwidthOut }}"
        }
      },
      "Outputs": {
        "instanceIds": {
          "Type": "List",
          "ValueSelector": "InstanceIdSets.InstanceIdSet[]"
        }
      }
    },
    {
      "Name": "untilInstanceReady",
      "Action": "ACS::WaitFor",
      "Description": "Menunggu instance yang dibuat menjadi Running.",
      "Properties": {
        "Service": "ECS",
        "API": "DescribeInstances",
        "Parameters": {
          "RegionId": "{{ regionId }}",
          "InstanceIds": [
            "{{ ACS::TaskLoopItem }}"
          ]
        },
        "DesiredValues": [
          "Running"
        ],
        "PropertySelector": "Instances.Instance[].Status"
      },
      "Loop": {
        "RateControl": {
          "Mode": "Concurrency",
          "MaxErrors": 0,
          "Concurrency": 1
        },
        "Items": "{{ runInstances.instanceIds }}"
      }
    }
  ],
  "Outputs": {
    "instanceIds": {
      "Type": "List",
      "Value": "{{ runInstances.instanceIds }}"
    }
  }
}

Mode batch

  • Format YAML

FormatVersion: OOS-2019-06-01
Description: Membuat satu atau lebih instance ECS.
Parameters:
  regionId:
    Description: ID wilayah.
    Type: String
    Default: '{{ ACS::RegionId }}'
  imageId:
    Description: ID sumber daya gambar yang Anda tentukan saat membuat instance.
    Type: String
    AllowedPattern: '[A-Za-z0-9_\-\.] *'
    MinLength: 1
    MaxLength: 100
  instanceType:
    Description: Jenis instance.
    Type: String
    AllowedPattern: ecs\.[ A-Za-z0-9\. \-]*
    MaxLength: 30
    MinLength: 1
  securityGroupId:
    Description: ID grup keamanan tempat instance termasuk.
    Type: String
    AllowedPattern: sg-[A-Za-z0-9]*
    MaxLength: 30
    MinLength: 1
  vSwitchId:
    Description: ID VSwitch.
    Type: String
    AllowedPattern: vsw-[A-Za-z0-9]*
    MaxLength: 30
    MinLength: 1
  amount:
    Description: Jumlah instance yang ingin Anda buat.
    Type: Number
    Default: 1
  internetMaxBandwidthIn:
    Description: Bandwidth publik masuk maksimum.
    Type: Number
    Default: 200
  internetMaxBandwidthOut:
    Description: Bandwidth publik keluar maksimum.
    Type: Number
    Default: 0
Tasks:
- Name: runInstances
  Action: ACS::ExecuteAPI
  Description: Membuat satu atau lebih instance.
  Properties:
    Service: ECS
    API: RunInstances
    Parameters:
      RegionId: '{{ regionId }}'
      Amount: '{{ amount }}'
      ImageId: '{{ imageId }}'
      InstanceType: '{{ instanceType }}'
      SecurityGroupId: '{{ securityGroupId }}'
      VSwitchId: '{{ vSwitchId }}'
      InternetMaxBandwidthIn: '{{ internetMaxBandwidthIn }}'
      InternetMaxBandwidthOut: '{{ internetMaxBandwidthOut }}'
  Outputs:
    instanceIds:
      Type: List
      ValueSelector: InstanceIdSets.InstanceIdSet[]
- Name: untilInstanceReady
  Action: ACS::WaitFor
  Description: Menunggu instance yang dibuat menjadi Running.
  Properties:
    Service: ECS
    API: DescribeInstances
    Parameters:
      RegionId: '{{ regionId }}'
      InstanceIds:
      - '{{ ACS::TaskLoopItem }}'
    DesiredValues:
    - Running
    PropertySelector: Instances.Instance[].Status
  Loop:
    RateControl:
      Mode: Batch
      MaxErrors: 0
      Batch: [1, 2, 3]
      BatchPauseOption: Automatic
      ConcurrencyInBatches: [1, 2, 3]
    Items: '{{ runInstances.instanceIds }}'
Outputs:
  instanceIds:
    Type: List
    Value: '{{ runInstances.instanceIds }}'
            
  • Format JSON

{
  "FormatVersion": "OOS-2019-06-01",
  "Description": "Membuat satu atau lebih instance ECS.",
  "Parameters": {
    "regionId": {
      "Description": "ID wilayah.",
      "Type": "String",
      "Default": "{{ ACS::RegionId }}"
    },
    "imageId": {
      "Description": "ID sumber daya gambar yang Anda tentukan saat membuat instance.",
      "Type": "String",
      "AllowedPattern": "[A-Za-z0-9_\\-\\.] *",
      "MinLength": 1,
      "MaxLength": 100
    },
    "instanceType": {
      "Description": "Jenis instance.",
      "Type": "String",
      "AllowedPattern": "ecs\\.[ A-Za-z0-9\\. \\-]*",
      "MaxLength": 30,
      "MinLength": 1
    },
    "securityGroupId": {
      "Description": "ID grup keamanan tempat instance termasuk.",
      "Type": "String",
      "AllowedPattern": "sg-[A-Za-z0-9]*",
      "MaxLength": 30,
      "MinLength": 1
    },
    "vSwitchId": {
      "Description": "ID VSwitch.",
      "Type": "String",
      "AllowedPattern": "vsw-[A-Za-z0-9]*",
      "MaxLength": 30,
      "MinLength": 1
    },
    "amount": {
      "Description": "Jumlah instance yang ingin Anda buat.",
      "Type": "Number",
      "Default": 1
    },
    "internetMaxBandwidthIn": {
      "Description": "Bandwidth publik masuk maksimum.",
      "Type": "Number",
      "Default": 200
    },
    "internetMaxBandwidthOut": {
      "Description": "Bandwidth publik keluar maksimum.",
      "Type": "Number",
      "Default": 0
    }
  },
  "Tasks": [
    {
      "Name": "runInstances",
      "Action": "ACS::ExecuteAPI",
      "Description": "Membuat satu atau lebih instance.",
      "Properties": {
        "Service": "ECS",
        "API": "RunInstances",
        "Parameters": {
          "RegionId": "{{ regionId }}",
          "Amount": "{{ amount }}",
          "ImageId": "{{ imageId }}",
          "InstanceType": "{{ instanceType }}",
          "SecurityGroupId": "{{ securityGroupId }}",
          "VSwitchId": "{{ vSwitchId }}",
          "InternetMaxBandwidthIn": "{{ internetMaxBandwidthIn }}",
          "InternetMaxBandwidthOut": "{{ internetMaxBandwidthOut }}"
        }
      },
      "Outputs": {
        "instanceIds": {
          "Type": "List",
          "ValueSelector": "InstanceIdSets.InstanceIdSet[]"
        }
      }
    },
    {
      "Name": "untilInstanceReady",
      "Action": "ACS::WaitFor",
      "Description": "Menunggu instance yang dibuat menjadi Running.",
      "Properties": {
        "Service": "ECS",
        "API": "DescribeInstances",
        "Parameters": {
          "RegionId": "{{ regionId }}",
          "InstanceIds": [
            "{{ ACS::TaskLoopItem }}"
          ]
        },
        "DesiredValues": [
          "Running"
        ],
        "PropertySelector": "Instances.Instance[].Status"
      },
      "Loop": {
        "RateControl": {
          "Mode": "Batch",
          "MaxErrors": 0,
          "Batch": [
            1,
            2,
            3
          ],
          "BatchPauseOption": "Automatic",
          "ConcurrencyInBatches": [
            1,
            2,
            3
          ]
        },
        "Items": "{{ runInstances.instanceIds }}"
      }
    }
  ],
  "Outputs": {
    "instanceIds": {
      "Type": "List",
      "Value": "{{ runInstances.instanceIds }}"
    }
  }
}