

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 에서 반복 구문 사용 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` 루프 입력**  

| 필드 | 설명 | 형식 | 필수 | 기본값 | 
| --- | --- | --- | --- | --- | 
|  `name`  | 루프의 고유 이름. 동일한 단계의 다른 루프 이름과 비교하여 고유해야 합니다. |  문자열  |  No  |  ""  | 
|  `start`  | 반복 시작 값. 체인 표현식은 허용되지 않습니다. |  Integer  |  예  |  해당 사항 없음  | 
| `end` | 반복 종료 값. 체인 표현식은 허용되지 않습니다. | Integer | 예 | 해당 사항 없음 | 
| `updateBy` | 덧셈을 통해 반복 값이 업데이트되는 경우의 차이. 0이 아닌 음수 또는 양수여야 합니다. 체인 표현식은 허용되지 않습니다. | Integer | 예 | 해당 사항 없음 | 

`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` 루프**  

| 필드 | 설명 | 형식 | 필수 | 기본값 | 
| --- | --- | --- | --- | --- | 
|  `name`  | 루프의 고유 이름. 동일한 단계의 다른 루프 이름과 비교하여 고유해야 합니다. |  문자열  |  No  |  ""  | 
|  `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` 루프**  

| 필드 | 설명 | 형식 | 필수 | 기본값 | 
| --- | --- | --- | --- | --- | 
|  `name`  | 루프에 부여된 고유 이름입니다. 동일한 단계의 다른 루프 이름과 비교할 때 고유해야 합니다. |  문자열  |  No  |  ""  | 
|  `list`  | 구성 문자열이 공통 구분 문자로 연결된 문자열로 구성된 문자열입니다. 체인 표현식도 사용할 수 있습니다. 연결된 표현식의 경우 YAML 컴파일러가 올바르게 해석할 수 있도록 큰따옴표로 묶어야 합니다. | 문자열 |  예  |  해당 사항 없음  | 
| `delimiter` | 블록 내에서 문자열을 구분하는 데 사용되는 문자입니다. 기본값은 쉼표 문자입니다. 지정된 목록에서 구분자를 하나만 사용할 수 있습니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/imagebuilder/latest/userguide/toe-looping-constructs.html) 체인 표현식은 사용할 수 없습니다. | 문자열 | No | 쉼표: "," | 

**참고**  
`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`.
**참고**  
이는 여전히 성공적인 실행으로 간주되지만 하나 이상의 단계가 실패하여 무시되었음을 알려주는 정보가 포함되어 있습니다.
+ *maxAttempts * – 모든 재시도에 대해 전체 단계와 모든 반복이 처음부터 실행됩니다.
+ *status* – `status`단계 실행의 전체 상태에서 개별 반복의 상태를 나타내지는 않습니다. 루프가 있는 단계의 상태는 다음과 같이 결정합니다.
  + 단일 반복 실행에 실패할 경우, 단계 상태는 실패로 표시됩니다.
  + 모든 반복이 성공하면, 단계 상태가 성공으로 표시됩니다.
+ *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 는 실패한 반복의 출력을 통합하지 않습니다.