Operation Orchestration Service ( OOS ) は、単一のタスクをループするために使用される特別なタスク属性であるループを提供します。
API アクションとクラウドプロダクトアクションに基づいて開発されたタスクはループをサポートしますが、Trigger や Sleep などの機能アクションに基づいて開発されたタスクはループをサポートしません。
複数のループ項目を同時に実行できます。ただし、手動モードでは、ループ項目を 1 つずつ実行する必要があります。
制限
ループ項目の最大数は 1,000 です。
構文
- YAML 形式
---
Tasks:
- Name: TaskName1 # 必須。タスクの名前。名前には、小文字、大文字、数字、アンダースコア (_)、およびハイフン (-) を使用できます。最大 200 文字まで指定できます。キャメルケースを使用することをお勧めします。例: StartInstance。
Action: TaskType # 必須。タスクまたはアクションのタイプ。詳細については、関連ドキュメントをご参照ください。
Description: description # オプション。タスクの説明 (タスクの目的など)。
Properties: # タスクの属性。属性リストは、使用されるアクションによって異なります。詳細については、関連ドキュメントをご参照ください。
Property1: Value1 # アクションが依存する属性。
Outputs: # タスクの出力パラメーター。これらのパラメーターは、後続のタスクの入力またはテンプレートの出力として使用できます。
OutputParameterName1:
Type: TypeName # オプション。出力パラメーターのタイプ。デフォルト値: String。
ValueSelector: "jq selector" # 必要な JSON データを選択するための jQuery セレクター。たとえば、タスクに対して API 操作を呼び出すと、jQuery セレクターは返された JSON データから必要な情報を抽出します。詳細については、クラウドプロダクトアクションとパブリックテンプレートの例をご参照ください。
Loop:
Items: [i-id1,i-id2,i-id3,i-id4] # 必須。[i-id1,i-id2,i-id3,i-id4] などの項目を含むリスト、または {{describeInstance.InstanceIds}} などのリストタイプのパラメーター。リストをトラバースして取得された項目は、ループタスクの次の反復を実行するための入力として機能します。
RateControl:
MaxErrors: 0 # オプション。エラー制限。この属性は、10 や 10% などの数値またはパーセンテージに設定できます。デフォルト値: 0。
Mode: "Batch/Concurrency" # 必須。ループ実行率を制御するモード。有効な値: Concurrency および Batch。Concurrency は同時実行を示し、Batch はバッチ実行を示します。
Batch: [1, 2, 3] # オプション。バッチ制御モード。このパラメーターは、Mode パラメーターが Batch に設定されている場合に有効です。詳細については、「バッチサイズを制御する」セクションをご参照ください。
ConcurrencyInBatches: [1, 1, 1] # オプション。各バッチの同時実行項目の最大数。デフォルト値: 20。このパラメーターは、Mode パラメーターが Batch に設定されている場合に有効です。括弧 ([]) 内に各バッチの同時実行項目数を入力します。
Concurrency: 1 # オプション。同時実行項目の最大数。このパラメーターは、Mode パラメーターが Concurrency に設定されている場合に有効です。この属性は、数値またはパーセンテージに設定できます。デフォルト値: 1。
BatchPauseOption: "FirstBatchPause/Automatic/EveryBatchPause" # オプション。各バッチの完了時にバッチ実行を一時停止するかどうかを指定します。このパラメーターは、Mode が Batch に設定されている場合に有効です。有効な値: FirstBatchPause、Automatic、および EveryBatchPause。FirstBatchPause は、最初のバッチが完了した後の実行の一時停止を示します。Automatic は、一時停止なしの自動実行を示します。FirstBatchPause は、各バッチが完了した後の実行の一時停止を示します。
Outputs:
FinalOutputParameterName1: # 関数によってループタスクが処理された後の出力パラメーターの名前。
AggregateType: BuiltInFunctionName1 # 出力を集計するための組み込み関数 (Fn::Sum、Fn::Max、Fn::ListJoin など)。
AggregateField: OutputParameterName1 # ループタスクの出力パラメーター。
- JSON 形式 (詳細については、YAML 形式のパラメーターの説明をご参照ください。)
{
"Tasks": [
{
"Name": "TaskName1",
"Action": "TaskType",
"Description": "description",
"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 属性は、List: [item1, item2, item3] などのリストタイプにすることができます。
また、リストタイプの前のタスクの出力パラメーターなど、リストタイプのパラメーターに設定することもできます。
- リストとしての項目
- YAML 形式
Loop: Items: [item1,item2,item3,item4] # [i-id1,i-id2,i-id3,i-id4] などの複数の項目を含むリスト。ループの各反復で返される項目は、次の反復を実行するための入力として機能します。
- JSON 形式 (詳細については、YAML 形式のパラメーターの説明をご参照ください。)
{ "Items": [ "item1", "item2", "item3", "item4" ] }
- リストタイプのパラメーターとしての項目
- YAML 形式
Items: '{{ParameterName1}} ' # describeInstance.InstanceIds などのリストタイプのパラメーター。ループの各反復で返されるパラメーター値は、次の反復を実行するための入力として機能します。
- JSON 形式 (詳細については、YAML 形式のパラメーターの説明をご参照ください。)
{ "Items": "{{ParameterName1}}" }
ループ実行率を制御する
ループ実行率は、次の方法で制御できます。
- 同時実行項目数を制御します。項目は、指定された同時実行項目数に基づいて、すべての項目が実行されるまで実行されます。
- バッチサイズを制御します。すべての項目は複数のバッチに分割されます。バッチは 1 つずつ実行されます。次のバッチは、前のバッチの実行が完了した後にのみ実行できます。
同時実行項目数を制御する
- リストに 10 個の項目が含まれていて、同時実行数が 3 であるとします。この場合、3 つの項目が毎回同時に実行され、すべての項目が実行されます。
- YAML 形式
Concurrency: 3 # 同時実行項目数。例: 3。 Mode: Concurrency
- JSON 形式 (詳細については、YAML 形式のパラメーターの説明をご参照ください。)
{ "Concurrency": 3, "Mode": "Concurrency" }
-
リストに 10 個の項目が含まれていて、同時実行数が 20% であるとします。この場合、項目の 20%、つまり 2 つの項目が毎回同時に実行され、すべての項目が実行されます。
-
YAML 形式
Concurrency: 20% # オプション。毎回同時に実行される項目のすべての項目に対するパーセンテージ。例: 20%。 Mode: Concurrency
- JSON 形式 (詳細については、YAML 形式のパラメーターの説明をご参照ください。)
{ "Concurrency": "20%", "Mode": "Concurrency" }
-
バッチサイズを制御する
- リストに 10 個の項目が含まれていて、バッチサイズが [3] であるとします。この場合、すべての項目は、3 つの項目を 1 つのバッチとして、4 つのバッチに分割されます。すべての項目が正常に実行された場合、4 つの各バッチの項目数はそれぞれ 3、3、3、1 です。
- YAML 形式
Batch: [1, 2, 3] # オプション。各バッチの項目数。例: [3]。 Mode: Batch
- JSON 形式 (詳細については、YAML 形式のパラメーターの説明をご参照ください。)
{ "Batch": [ 1, 2, 3 ], "Mode": "Batch" }
-
リストに 10 個の項目が含まれていて、バッチサイズが [30%] であるとします。この場合、すべての項目は、項目の 30%、つまり 3 つの項目を 1 つのバッチとして、4 つのバッチに分割されます。すべての項目が正常に実行された場合、4 つの各バッチの項目数はそれぞれ 3、3、3、1 です。
-
YAML 形式
Batch: [30%] # オプション。各バッチの項目のすべての項目に対するパーセンテージ。例: 30%。 Mode: Batch
- JSON 形式 (詳細については、YAML 形式のパラメーターの説明をご参照ください。)
{ "Batch": [ "30%" ], "Mode": "Batch" }
-
-
リストに 10 個の項目が含まれていて、バッチサイズが [3, 10%, 30%] であるとします。この場合、最初のバッチには 3 つの項目が含まれます。項目の 10%、つまり 1 つの項目が 2 番目のバッチに含まれます。項目の [30%]、つまり 3 つの項目が 3 番目のバッチと後続の各バッチに含まれます。すべての項目が正常に実行された場合、4 つの各バッチの項目数はそれぞれ 3、1、3、3 です。
-
YAML 形式
Mode: Batch Batch: [3, 10%, 30%] # オプション。各バッチの項目数を示す数値とパーセンテージのリスト。例: [3, 10%, 30%]。
- JSON 形式 (詳細については、YAML 形式のパラメーターの説明をご参照ください。)
{ "Mode": "Batch", "Batch": [ 3, "10%", "30%" ] }
-
MaxErrors
次の説明に基づいて、ループタスクの MaxErrors を定義できます。
- この属性は、10 や 10% などの数値またはパーセンテージに設定できます。属性がパーセンテージに設定されている場合は、項目の総数にパーセンテージを掛けて、許容される最大エラー数を取得します。デフォルト値は 0 で、エラーが発生するとループタスクが停止することを示します。
- ループの最初の項目は常に実行されます。
- MaxErrors と ErrorCount の関係によって、2 番目以降の項目を実行できるかどうかが決まります。
- ErrorCount の値が MaxErrors の値よりも大きい場合、後続の項目は実行されず、ループタスクは失敗としてマークされます。
- ErrorCount の値が MaxErrors 以下である場合、後続の項目を実行できます。
-
ループタスクの実行ステータスは、比較条件 ErrorCount > MaxErrors に基づいて決定されます。条件が true の場合、実行ステータスは Failed です。条件が false の場合、実行ステータスは Success です。
-
数値としての MaxErrors
-
YAML 形式
MaxErrors: 2 # オプション。許容される最大エラー数。例: 2。
-
JSON 形式 (詳細については、YAML 形式のパラメーターの説明をご参照ください。)
{ "MaxErrors": 2 }
-
- パーセンテージとしての MaxErrors
-
YAML 形式
MaxErrors: 25% # オプション。許容される最大エラー数の項目の総数に対するパーセンテージ。この属性を 25% に設定し、リストに 4 つの項目が含まれているとします。この場合、許容される最大エラー数は 1 です。
-
JSON 形式 (詳細については、YAML 形式のパラメーターの説明をご参照ください。)
{ "MaxErrors": "25%" }
-
ループ出力
テンプレートでは、各ループタスクだけでなく、ループタスクの各反復も出力を生成します。実際のループ出力には、複数の項目の出力値が含まれます。したがって、複数の子タスクの出力を集計して、最終的なループ出力を取得する必要があります。AggregateType を組み込み関数に設定して、ループ出力を集計できます。
AggregateType を定義します。
- YAML 形式
AggregateType: Fn::Max # ループ出力を集計するための組み込み関数 (Fn::Max など)。これは、すべての子タスクの最大の OutputParameterName1 値をループの出力値として選択します。
- JSON 形式 (詳細については、YAML 形式のパラメーターの説明をご参照ください。)
{
"AggregateType": "Fn::Max"
}
例
同時実行モード
- YAML 形式
FormatVersion: OOS-2019-06-01
Description: 1 つ以上の ECS インスタンスを作成します。
Parameters:
regionId:
Description: リージョンの ID。
Type: String
Default: '{{ ACS::RegionId }}'
imageId:
Description: インスタンスの作成時に指定するイメージリソースの ID。
Type: String
AllowedPattern: '[A-Za-z0-9_\-\.] *'
MinLength: 1
MaxLength: 100
instanceType:
Description: インスタンスのタイプ。
Type: String
AllowedPattern: ecs\.[ A-Za-z0-9\. \-]*
MaxLength: 30
MinLength: 1
securityGroupId:
Description: インスタンスが属するセキュリティグループの ID。
Type: String
AllowedPattern: sg-[A-Za-z0-9]*
MaxLength: 30
MinLength: 1
vSwitchId:
Description: VSwitch の ID。
Type: String
AllowedPattern: vsw-[A-Za-z0-9]*
MaxLength: 30
MinLength: 1
amount:
Description: 作成するインスタンスの指定数。
Type: Number
Default: 1
internetMaxBandwidthIn:
Description: パブリックインバウンドの最大帯域幅。
Type: Number
Default: 200
internetMaxBandwidthOut:
Description: パブリックアウトバウンドの最大帯域幅。
Type: Number
Default: 0
Tasks:
- Name: runInstances
Action: ACS::ExecuteAPI
Description: 1 つ以上のインスタンスを作成します。
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: 作成されたインスタンスが 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 }}'
- JSON 形式
{
"FormatVersion": "OOS-2019-06-01",
"Description": "1 つ以上の ECS インスタンスを作成します。",
"Parameters": {
"regionId": {
"Description": "リージョンの ID。",
"Type": "String",
"Default": "{{ ACS::RegionId }}"
},
"imageId": {
"Description": "インスタンスの作成時に指定するイメージリソースの ID。",
"Type": "String",
"AllowedPattern": "[A-Za-z0-9_\\-\\.] *",
"MinLength": 1,
"MaxLength": 100
},
"instanceType": {
"Description": "インスタンスのタイプ。",
"Type": "String",
"AllowedPattern": "ecs\\.[ A-Za-z0-9\\. \\-]*",
"MaxLength": 30,
"MinLength": 1
},
"securityGroupId": {
"Description": "インスタンスが属するセキュリティグループの ID。",
"Type": "String",
"AllowedPattern": "sg-[A-Za-z0-9]*",
"MaxLength": 30,
"MinLength": 1
},
"vSwitchId": {
"Description": "VSwitch の ID。",
"Type": "String",
"AllowedPattern": "vsw-[A-Za-z0-9]*",
"MaxLength": 30,
"MinLength": 1
},
"amount": {
"Description": "作成するインスタンスの指定数。",
"Type": "Number",
"Default": 1
},
"internetMaxBandwidthIn": {
"Description": "パブリックインバウンドの最大帯域幅。",
"Type": "Number",
"Default": 200
},
"internetMaxBandwidthOut": {
"Description": "パブリックアウトバウンドの最大帯域幅。",
"Type": "Number",
"Default": 0
}
},
"Tasks": [
{
"Name": "runInstances",
"Action": "ACS::ExecuteAPI",
"Description": "1 つ以上のインスタンスを作成します。",
"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": "作成されたインスタンスが 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 }}"
}
}
}
バッチモード
- YAML 形式
FormatVersion: OOS-2019-06-01
Description: 1 つ以上の ECS インスタンスを作成します。
Parameters:
regionId:
Description: リージョンの ID。
Type: String
Default: '{{ ACS::RegionId }}'
imageId:
Description: インスタンスの作成時に指定するイメージリソースの ID。
Type: String
AllowedPattern: '[A-Za-z0-9_\-\.] *'
MinLength: 1
MaxLength: 100
instanceType:
Description: インスタンスのタイプ。
Type: String
AllowedPattern: ecs\.[ A-Za-z0-9\. \-]*
MaxLength: 30
MinLength: 1
securityGroupId:
Description: インスタンスが属するセキュリティグループの ID。
Type: String
AllowedPattern: sg-[A-Za-z0-9]*
MaxLength: 30
MinLength: 1
vSwitchId:
Description: VSwitch の ID。
Type: String
AllowedPattern: vsw-[A-Za-z0-9]*
MaxLength: 30
MinLength: 1
amount:
Description: 作成するインスタンスの指定数。
Type: Number
Default: 1
internetMaxBandwidthIn:
Description: パブリックインバウンドの最大帯域幅。
Type: Number
Default: 200
internetMaxBandwidthOut:
Description: パブリックアウトバウンドの最大帯域幅。
Type: Number
Default: 0
Tasks:
- Name: runInstances
Action: ACS::ExecuteAPI
Description: 1 つ以上のインスタンスを作成します。
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: 作成されたインスタンスが 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 }}'
- JSON 形式
{
"FormatVersion": "OOS-2019-06-01",
"Description": "1 つ以上の ECS インスタンスを作成します。",
"Parameters": {
"regionId": {
"Description": "リージョンの ID。",
"Type": "String",
"Default": "{{ ACS::RegionId }}"
},
"imageId": {
"Description": "インスタンスの作成時に指定するイメージリソースの ID。",
"Type": "String",
"AllowedPattern": "[A-Za-z0-9_\\-\\.] *",
"MinLength": 1,
"MaxLength": 100
},
"instanceType": {
"Description": "インスタンスのタイプ。",
"Type": "String",
"AllowedPattern": "ecs\\.[ A-Za-z0-9\\. \\-]*",
"MaxLength": 30,
"MinLength": 1
},
"securityGroupId": {
"Description": "インスタンスが属するセキュリティグループの ID。",
"Type": "String",
"AllowedPattern": "sg-[A-Za-z0-9]*",
"MaxLength": 30,
"MinLength": 1
},
"vSwitchId": {
"Description": "VSwitch の ID。",
"Type": "String",
"AllowedPattern": "vsw-[A-Za-z0-9]*",
"MaxLength": 30,
"MinLength": 1
},
"amount": {
"Description": "作成するインスタンスの指定数。",
"Type": "Number",
"Default": 1
},
"internetMaxBandwidthIn": {
"Description": "パブリックインバウンドの最大帯域幅。",
"Type": "Number",
"Default": 200
},
"internetMaxBandwidthOut": {
"Description": "パブリックアウトバウンドの最大帯域幅。",
"Type": "Number",
"Default": 0
}
},
"Tasks": [
{
"Name": "runInstances",
"Action": "ACS::ExecuteAPI",
"Description": "1 つ以上のインスタンスを作成します。",
"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": "作成されたインスタンスが 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 }}"
}
}
}