AWSTOEでループ構文を使用する - EC2 Image Builder

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

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 は、startend、および updateByの値を検証して、組み合わせが無限ループにならないことを確認します。

for ループスキーマ

- name: "StepName" action: "ActionModule" loop: name: "string" for: start: int end: int updateBy: int inputs: ...
for ループ入力
フィールド 説明 タイプ 必須 デフォルト

name

ループの一意の名前。同じフェーズの他のループ名と比べると一意でなければなりません。

文字列

なし

""

start

イテレーションの開始値。連鎖式は受け付けません。

整数

あり

該当なし

end

反復の終了値。連鎖式は受け付けません。 整数 あり 該当なし

updateBy

加算によってイテレーション値が更新される場合の違い。負または正の 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: ...
forEach ループ (入力リスト付き)
フィールド 説明 タイプ 必須 デフォルト

name

ループの一意の名前。同じフェーズの他のループ名と比べると一意でなければなりません。

文字列

なし

""

forEach ループの文字列のリスト

反復処理用の文字列のリスト。連鎖式をリスト内の文字列として受け入れます。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: ...
区切りリスト入力による forEach ループ
フィールド 説明 タイプ 必須 デフォルト

name

ループに付けられた一意の名前。同じフェーズの他のループ名と比較した場合、ユニークでなければならない。

文字列

なし

""

list

構成文字列を共通の区切り文字で結合した文字列です。連鎖式も受け付けます。連鎖式の場合は、YAML コンパイラが正しく解釈できるように、必ず二重引用符で囲んでください。 文字列

あり

該当なし

delimiter

ブロック内の文字列を区切るために使用する文字。デフォルトはカンマ文字です。与えられたリストで使用できる区切り文字は 1 つだけです。
  • ドット: "."

  • カンマ: ","

  • セミコロン: ";"

  • コロン: ":"

  • 改行: "\n"

  • タブ: "\t"

  • スペース: " "

  • ハイフン: "-"

  • 下線: "_"

連鎖式は使用できません。

文字列 なし カンマ: ","
注記

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" }

例えば、ExecuteBashExecutePowerShell、および ExecuteBinary はアクションモジュール出力として STDOUT を返すアクションモジュールです。 STDOUT メッセージは改行文字で結合され、detailedOutput.json のステップの全体的な出力が生成されます。

AWSTOE は、失敗したイテレーションの出力を統合しません。