AWSTOE でループ構文を使用する
このセクションでは、AWSTOE でループ構文を作成する際に役立つ情報を提供します。ループは、繰り返される命令シーケンスを定義する。AWSTOE では以下のタイプのループ構文を使用できます。
-
for
コンストラクト — 制限付きの整数のシーケンスを反復処理します。 -
forEach
コンストラクト-
入力リストによる
forEach
ループ — 有限数の文字列を反復処理します。 -
区切りリストによる
forEach
ループ — 区切り文字で結合された有限の文字列のコレクションを反復処理します。
-
注記
ループ構文は文字列データ型のみをサポートします。
イテレーション変数の参照
現在のイテレーション変数のインデックスと値を参照するには、ループ構文を含むステップの入力ボディ内で参照式 {{ loop.* }}
を使用する必要があります。この式は、別のステップのループ構文のイテレーション変数を参照する場合には使用できません。
参照式は、次のメンバーで構成されます。
{{ loop.index }}
—0
でインデックスが付けられていまる現在のイテレーションの序数位置。{{ loop.value }}
— 現在のイテレーション変数に関連付けられた値。
ループ名
ループ構文にはすべて、識別用のオプションの名前フィールドがあります。ループ名を指定すると、そのループ名を使用してステップの入力ボディ内のイテレーション変数を参照できます。名前付きループのイテレーションインデックスと値を参照するには、ステップの入力ボディで {{ <loop_name>.* }}
と {{ loop.* }}
を使用してください。この式は、他のステップの名前付きループ構成を参照するために使用することはできない。
参照式は、次のメンバーで構成されます。
{{ <loop_name>.index }}
—0
でインデックスされる指定されたループの現在のイテレーションの序数位置。{{ <loop_name>.value }}
— 指定したループの現在のイテレーション変数に関連付けられた値。
参照式を解決する
AWSTOE は以下のように参照式を解決します。
{{ <loop_name>.* }}
— AWSTOE 以下のロジックを使用してこの式を解決します。現在実行中のステップのループが
<loop_name>
値と一致すると、参照式は現在実行中のステップのループ構文に変換されます。現在実行中のステップ内に指定されたループ構文がある場合は、
<loop_name>
はそのループ構文に解決されます。
{{ loop.* }}
— AWSTOE は現在実行中のステップで定義されているループ構文を使用して解析式を解決します。
ループを含まないステップ内で参照式が使用された場合、AWSTOE 式は解決されず、置換されることなくステップに表示されます。
注記
YAML コンパイラーが参照式を正しく解釈するには、二重引用符で囲む必要があります。
ループ構文のタイプ
このセクションでは、AWSTOE で使用できるループ構文タイプに関する情報と例を紹介します。
for
ループ
for
ループは、変数の先頭と末尾で囲まれた境界内で指定された整数の範囲で反復処理を行います。イテレーション値は [start, end]
のセットに含まれており、境界値も含まれます。
AWSTOE は start
、end
および updateBy
の値を確認して、組み合わせによって無限ループが発生しないことを確認します。
for
ループスキーマ
- name: "StepName" action: "ActionModule" loop: name: "string" for: start: int end: int updateBy: int inputs: ...
フィールド | 説明 | タイプ | 必須 | デフォルト |
---|---|---|---|---|
|
ループの一意の名前。同じフェーズの他のループ名と比べると一意でなければなりません。 |
文字列 |
いいえ |
"" |
|
イテレーションの開始値。連鎖式は受け付けません。 |
整数 |
はい |
該当なし |
|
反復の終了値。連鎖式は受け付けません。 | 整数 | はい | 該当なし |
|
加算によってイテレーション値が更新される場合の違い。負または正の 0 以外の値でなければなりません。連鎖式は受け付けません。 | 整数 | はい | 該当なし |
for
ループ入力の例
- name: "CalculateFileUploadLatencies" action: "ExecutePowerShell" loop: for: start: 100000 end: 1000000 updateBy: 100000 inputs: commands: - | $f = new-object System.IO.FileStream c:\temp\test{{ loop.index }}.txt, Create, ReadWrite $f.SetLength({{ loop.value }}MB) $f.Close() - c:\users\administrator\downloads\latencyTest.exe --file c:\temp\test{{ loop.index }}.txt - AWS s3 cp c:\users\administrator\downloads\latencyMetrics.json s3://bucket/latencyMetrics.json - | Remove-Item -Path c:\temp\test{{ loop.index }}.txt Remove-Item -Path c:\users\administrator\downloads\latencyMetrics.json
forEach
ループ (入力リスト付き)
forEach
ループは明示的な値リスト (文字列でも連鎖式でもかまいません) を繰り返し処理します。
入力リストのスキーマを含む forEach
ループ
- name: "StepName" action: "ActionModule" loop: name: "string" forEach: - "string" inputs: ...
フィールド | 説明 | タイプ | 必須 | デフォルト |
---|---|---|---|---|
|
ループの一意の名前。同じフェーズの他のループ名と比べると一意でなければなりません。 |
文字列 |
いいえ |
"" |
|
反復処理用の文字列のリスト。連鎖式をリスト内の文字列として受け入れます。YAML コンパイラが正しく解釈するために、連鎖式は二重引用符で囲む必要があります。 |
文字列のリスト |
はい |
該当なし |
入力リストによる forEach
ループ (例 1)
- name: "ExecuteCustomScripts" action: "ExecuteBash" loop: name: BatchExecLoop forEach: - /tmp/script1.sh - /tmp/script2.sh - /tmp/script3.sh inputs: commands: - echo "Count {{ BatchExecLoop.index }}" - sh "{{ loop.value }}" - | retVal=$? if [ $retVal -ne 0 ]; then echo "Failed" else echo "Passed" fi
入力リストによる forEach
ループ (例 2)
- name: "RunMSIWithDifferentArgs" action: "ExecuteBinary" loop: name: MultiArgLoop forEach: - "ARG1=C:\Users ARG2=1" - "ARG1=C:\Users" - "ARG1=C:\Users ARG3=C:\Users\Administrator\Documents\f1.txt" inputs: commands: path: "c:\users\administrator\downloads\runner.exe" args: - "{{ MultiArgLoop.value }}"
入力リストによる forEach
ループ (例 3)
- name: "DownloadAllBinaries" action: "S3Download" loop: name: MultiArgLoop forEach: - "bin1.exe" - "bin10.exe" - "bin5.exe" inputs: - source: "s3://bucket/{{ loop.value }}" destination: "c:\temp\{{ loop.value }}"
区切りリストによる forEach
ループ
ループは、区切り文字で区切られた値を含む文字列を繰り返し処理します。文字列の構成要素を反復処理するには、AWSTOE は区切り文字を使用して文字列を反復処理に適した配列に分割します。
区切りリストスキーマによる forEach
ループ
- name: "StepName" action: "ActionModule" loop: name: "string" forEach: list: "string" delimiter: ".,;:\n\t -_" inputs: ...
フィールド | 説明 | タイプ | 必須 | デフォルト |
---|---|---|---|---|
|
ループに付けられた一意の名前。同じフェーズの他のループ名と比較した場合、ユニークでなければならない。 |
文字列 |
いいえ |
"" |
|
構成文字列を共通の区切り文字で結合した文字列です。連鎖式も受け付けます。連鎖式の場合は、YAML コンパイラが正しく解釈できるように、必ず二重引用符で囲んでください。 | 文字列 |
はい |
該当なし |
|
ブロック内の文字列を区切るために使用する文字。デフォルトはカンマ文字です。与えられたリストで使用できる区切り文字は 1 つだけです。
連鎖式は使用できません。 |
文字列 | いいえ | カンマ: "," |
注記
list
の値は不変の文字列として扱われます。ランタイムに list
のソースが変更されても、実行中には反映されません。
forEach
区切りリストによるループ 例1
次の例では、<phase_name>.<step_name>.[inputs | outputs].<var_name>
という連鎖式パターンを使用して別のステップの出力を参照します。
- name: "RunMSIs" action: "ExecuteBinary" loop: forEach: list: "{{ build.GetAllMSIPathsForInstallation.outputs.stdout }}" delimiter: "\n" inputs: commands: path: "{{ loop.value }}"
forEach
区切りリストによるループ 例2
- name: "UploadMetricFiles" action: "S3Upload" loop: forEach: list: "/tmp/m1.txt,/tmp/m2.txt,/tmp/m3.txt,..." inputs: commands: - source: "{{ loop.value }}" destination: "s3://bucket/key/{{ loop.value }}"
ステップフィールド
ループはステップの一部です。ステップの実行に関連するフィールドは、個々の反復には適用されません。ステップフィールドは、以下のようにステップレベルでのみ適用されます。
-
timeoutSeconds - ループのすべての反復は、このフィールドで指定された時間内に実行されなければならない。ループの実行がタイムアウトになった場合は、AWSTOE はステップの再試行ポリシーを実行し、新しい試行ごとにタイムアウトパラメータをリセットします。最大再試行回数に達した後でループ実行がタイムアウト値を超えると、ステップの失敗メッセージにループ実行がタイムアウトになったことが示されます。
-
onFailure - 以下のようにステップに失敗処理が適用される:
-
onFailure が
Abort
に設定されている場合、AWSTOE はループを抜け、リトライポリシーに従ってステップをリトライする。再試行回数が最大に達すると、AWSTOE は現在のステップを失敗としてマークし、プロセスの実行を停止します。AWSTOE は親フェーズとドキュメントのステータスコードを
Failed
に設定します。注記
失敗したステップの後に、それ以上のステップは実行されません。
-
onFailure が
Continue
に設定されている場合、AWSTOE はループを抜け、リトライポリシーに従ってステップをリトライする。再試行回数が最大に達すると、AWSTOE は現在のステップを失敗としてマークし、次のステップを続行します。AWSTOE は親フェーズとドキュメントのステータスコードを
Failed
に設定します。 -
onFailure が
Ignore
に設定されている場合、AWSTOE はループを抜け、リトライポリシーに従ってステップをリトライする。再試行回数が最大に達すると、AWSTOE は現在のステップをIgnoredFailure
としてマークし、次のステップの実行を続行します。AWSTOE は親フェーズとドキュメントのステータスコードを
SuccessWithIgnoredFailure
に設定します。注記
これでも実行は成功したとみなされますが、1 つ以上のステップが失敗して無視されたことを知らせる情報が含まれます。
-
maxAttempts - 再試行ごとに、全ステップと全反復が最初から実行されます。
status - ステップの実行の全体的なステータス。
status
は個々の反復のステータスを表すものではない。ループを含むステップのステータスは次のように決定されます。1 回のイテレーションが実行に失敗した場合、ステップのステータスは失敗を示します。
すべてのイテレーションが成功すると、ステップのステータスは成功を示します。
startTime - ステップ実行の全体的な開始時間。個々のイテレーションの開始時間を表すものではありません。
endTime - ステップ実行の全体的な終了時間。個々の反復の終了時刻を表すものではない。
failureMessage - タイムアウト以外のエラーの場合に失敗した反復インデックスを含みます。タイムアウトエラーの場合、メッセージにはループの実行が失敗したことが示されます。失敗メッセージのサイズを最小限に抑えるため、イテレーションごとに個別のエラーメッセージは表示されません。
ステップとイテレーションの出力
すべてのイテレーションには出力が含まれます。ループ実行の最後に、AWSTOE は成功したすべてのイテレーション出力を detailedOutput.json
に統合します。統合出力は、アクションモジュールの出力スキーマで定義されている対応する出力キーに属する値を照合したものです。次の例では、出力の統合方法を示しています。
イテレーション 1 の ExecuteBash
の出力
{ "stdout":"Hello" }
イテレーション 2 の ExecuteBash
の出力
{ "stdout":"World" }
ステップ ExecuteBash
の出力
{ "stdout":"Hello\nWorld" }
例えば、ExecuteBash
、ExecutePowerShell
、および ExecuteBinary
はアクションモジュール出力として STDOUT
を返すアクションモジュールです。 STDOUT
メッセージは改行文字で結合され、detailedOutput.json
のステップの全体的な出力が生成されます。
AWSTOE は失敗したイテレーションの出力を統合しません。