

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

# でループコンストラクトを使用する AWSTOE
<a name="toe-looping-constructs"></a>

このセクションでは、 AWSTOEでループ構文を作成する際に役立つ情報を提供します。ループは、繰り返される命令シーケンスを定義する。 AWSTOEでは以下のタイプのループ構文を使用できます。
+ `for` コンストラクト — 制限付きの整数のシーケンスを反復処理します。
+ `forEach` コンストラクト
  + 入力リストによる `forEach` ループ — 有限数の文字列を反復処理します。
  + 区切りリストによる `forEach` ループ — 区切り文字で結合された有限の文字列のコレクションを反復処理します。

**注記**  
ループ構文は文字列データ型のみをサポートします。

**Topics**
+ [イテレーション変数の参照](#toe-loop-iteration-variables)
+ [ループ構文のタイプ](#toe-loop-types)
+ [ステップフィールド](#toe-loop-step-fields)
+ [ステップとイテレーションの出力](#toe-loop-step-output)

## イテレーション変数の参照
<a name="toe-loop-iteration-variables"></a>

現在のイテレーション変数のインデックスと値を参照するには、ループ構文を含むステップの入力ボディ内で参照式 `{{ loop.* }}` を使用する必要があります。この式は、別のステップのループ構文のイテレーション変数を参照する場合には使用できません。

参照式は、次のメンバーで構成されます。
+ `{{ loop.index }}` — `0` でインデックスが付けられていまる現在のイテレーションの序数位置。
+ `{{ loop.value }}` — 現在のイテレーション変数に関連付けられた値。

### ループ名
<a name="toe-loop-iteration-variables-names"></a>

 ループ構文にはすべて、識別用のオプションの名前フィールドがあります。ループ名を指定すると、そのループ名を使用してステップの入力ボディ内のイテレーション変数を参照できます。名前付きループのイテレーションインデックスと値を参照するには、ステップの入力ボディで `{{ <loop_name>.* }}` と `{{ loop.* }}` を使用してください。この式は、他のステップの名前付きループ構成を参照するために使用することはできない。

参照式は、次のメンバーで構成されます。
+ `{{ <loop_name>.index }}` — `0` でインデックスされる指定されたループの現在のイテレーションの序数位置。
+ `{{ <loop_name>.value }}` — 指定したループの現在のイテレーション変数に関連付けられた値。

### 参照式を解決する
<a name="toe-loop-iteration-variables-expressions"></a>

は参照式を次のように AWSTOE 解決します。
+ `{{ <loop_name>.* }}` – 次のロジックを使用してこの式を AWSTOE 解決します。
  + 現在実行中のステップのループが `<loop_name>` 値と一致すると、参照式は現在実行中のステップのループ構文に変換されます。
  + 現在実行中のステップ内に指定されたループ構文がある場合は、`<loop_name>` はそのループ構文に解決されます。
+ `{{ loop.* }}` – 現在実行中のステップで定義されているループコンストラクトを使用して式を AWSTOE 解決します。

参照式がループを含まないステップ内で使用されている場合、 AWSTOE は式を解決せず、置き換えなしでステップに表示されます。

**注記**  
YAML コンパイラーが参照式を正しく解釈するには、二重引用符で囲む必要があります。

## ループ構文のタイプ
<a name="toe-loop-types"></a>

このセクションでは、 AWSTOEで使用できるループ構文タイプに関する情報と例を紹介します。

**Topics**
+ [`for` ループ](#toe-loop-types-for)
+ [`forEach` ループ (入力リスト付き)](#toe-loop-types-foreach)
+ [区切りリストによる `forEach` ループ](#toe-loop-types-foreach-delimited)

### `for` ループ
<a name="toe-loop-types-for"></a>

`for` ループは、変数の先頭と末尾で囲まれた境界内で指定された整数の範囲で反復処理を行います。イテレーション値は `[start, end]` のセットに含まれており、境界値も含まれます。

AWSTOE は、`start`、`end`、および `updateBy`の値を検証して、組み合わせが無限ループにならないようにします。

`for` ループスキーマ

```
  - name: "StepName"
    action: "ActionModule"
    loop:
      name: "string"
      for:
        start: int
        end: int
        updateBy: int
inputs:
  ...
```


**`for` ループ入力**  

| フィールド | 説明 | タイプ | [Required] (必須) | [Default] (デフォルト) | 
| --- | --- | --- | --- | --- | 
|  `name`  | ループの一意の名前。同じフェーズの他のループ名と比べると一意でなければなりません。 |  String  |  いいえ  |  ""  | 
|  `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` ループ (入力リスト付き)
<a name="toe-loop-types-foreach"></a>

`forEach` ループは明示的な値リスト (文字列でも連鎖式でもかまいません) を繰り返し処理します。

入力リストのスキーマを含む `forEach` ループ

```
  - name: "StepName"
    action: "ActionModule"
    loop:
      name: "string"
      forEach:
        - "string"
    inputs:
  ...
```


**`forEach` ループ (入力リスト付き)**  

| フィールド | 説明 | タイプ | [Required] (必須) | [Default] (デフォルト) | 
| --- | --- | --- | --- | --- | 
|  `name`  | ループの一意の名前。同じフェーズの他のループ名と比べると一意でなければなりません。 |  String  |  いいえ  |  ""  | 
|  `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` ループ
<a name="toe-loop-types-foreach-delimited"></a>

ループは、区切り文字で区切られた値を含む文字列を繰り返し処理します。文字列の構成要素を反復処理するには、 は区切り文字 AWSTOE を使用して文字列を反復処理に適した配列に分割します。

区切りリストスキーマによる `forEach` ループ

```
  - name: "StepName"
    action: "ActionModule"
    loop:
      name: "string"
      forEach:
        list: "string"
        delimiter: ".,;:\n\t -_"
    inputs:
  ...
```


**区切りリスト入力による `forEach` ループ**  

| フィールド | 説明 | タイプ | [Required] (必須) | [Default] (デフォルト) | 
| --- | --- | --- | --- | --- | 
|  `name`  | ループに付けられた一意の名前。同じフェーズの他のループ名と比較した場合、ユニークでなければならない。 |  String  |  いいえ  |  ""  | 
|  `list`  | 構成文字列を共通の区切り文字で結合した文字列です。連鎖式も受け付けます。連鎖式の場合は、YAML コンパイラが正しく解釈できるように、必ず二重引用符で囲んでください。 | String |  はい  |  該当なし  | 
| `delimiter` | ブロック内の文字列を区切るために使用する文字。デフォルトはカンマ文字です。与えられたリストで使用できる区切り文字は 1 つだけです。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/imagebuilder/latest/userguide/toe-looping-constructs.html) 連鎖式は使用できません。 | String | いいえ | カンマ: "," | 

**注記**  
`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 }}"
```

## ステップフィールド
<a name="toe-loop-step-fields"></a>

ループはステップの一部です。ステップの実行に関連するフィールドは、個々の反復には適用されません。ステップフィールドは、以下のようにステップレベルでのみ適用されます。
+ *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 - タイムアウト以外のエラーの場合に失敗した反復インデックスを含みます。タイムアウトエラーの場合、メッセージにはループの実行が失敗したことが示されます。失敗メッセージのサイズを最小限に抑えるため、イテレーションごとに個別のエラーメッセージは表示されません。

## ステップとイテレーションの出力
<a name="toe-loop-step-output"></a>

すべてのイテレーションには出力が含まれます。ループ実行の終了時に、 は成功したすべての反復出力を AWSTOE に統合します`detailedOutput.json`。統合出力は、アクションモジュールの出力スキーマで定義されている対応する出力キーに属する値を照合したものです。次の例では、出力の統合方法を示しています。

**イテレーション 1 の `ExecuteBash` の出力**

```
{
	"stdout":"Hello"
}
```

**イテレーション 2 の `ExecuteBash` の出力**

```
{
	"stdout":"World"
}
```

**ステップ `ExecuteBash` の出力**

```
{
	"stdout":"Hello\nWorld"
}
```

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

AWSTOE は、失敗した反復の出力を統合しません。