

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

# 사용자 지정 AWSTOE 구성 요소에 구성 요소 문서 프레임워크 사용
<a name="toe-use-documents"></a>

 AWS Task Orchestrator and Executor (AWSTOE) 구성 요소 프레임워크를 사용하여 구성 요소를 빌드하려면 생성한 구성 요소에 적용되는 단계와 단계를 나타내는 YAML 기반 문서를 제공해야 합니다. 새 Amazon Machine Image(AMI) 또는 컨테이너 이미지를 생성할 때 구성 요소를 AWS 서비스 사용합니다.

**Topics**
+ [구성 요소 문서 워크플로우](#component-doc-workflow)
+ [구성 요소 로깅](#component-logging)
+ [입력 및 출력 체인화](#document-chaining)
+ [문서 스키마 및 정의](#document-schema)
+ [문서 예제](#document-example)
+ [사용자 지정 구성 요소 문서에서 변수 사용](toe-user-defined-variables.md)
+ [에서 조건부 구문 사용 AWSTOE](toe-conditional-constructs.md)
+ [AWSTOE 구성 요소 문서에서 비교 연산자 사용](toe-comparison-operators.md)
+ [AWSTOE 구성 요소 문서에서 논리 연산자 사용](toe-logical-operators.md)
+ [에서 반복 구문 사용 AWSTOE](toe-looping-constructs.md)

## 구성 요소 문서 워크플로우
<a name="component-doc-workflow"></a>

 AWSTOE 구성 요소 문서는 단계와 단계를 사용하여 관련 작업을 그룹화하고 해당 작업을 구성 요소의 논리적 워크플로로 구성합니다.

**작은 정보**  
구성 요소를 사용하여 이미지를 빌드하는 서비스는 빌드 프로세스에 사용할 단계와 해당 단계의 실행 허용 시기에 대한 규칙을 구현할 수 있습니다. 이는 구성 요소를 설계할 때 고려해야 할 중요한 사항입니다.

**단계**  
단계는 이미지 빌드 프로세스를 통한 워크플로우의 진행 상황을 나타냅니다. 예를 들어 Image Builder 서비스는 생성한 이미지에 대해 *빌드 단계*에서 `build` 및 `validate` 단계를 사용합니다. *테스트 단계*에서 `test` 및 `container-host-test` 단계를 사용하여 최종 AMI를 생성하거나 컨테이너 이미지를 배포하기 전에 이미지 스냅샷 또는 컨테이너 이미지가 예상 결과를 생성하는지 확인합니다.

구성 요소가 실행되면 각 단계의 관련 명령이 구성 요소 문서에 표시된 순서대로 적용됩니다.

**단계 규칙**
+ 각 단계 이름은 문서 내에서 고유해야 합니다.
+ 문서에 여러 단계를 정의할 수 있습니다.
+ 문서에 다음 단계 중 하나 이상을 포함해야 합니다.
  + **빌드** — Image Builder의 경우 이 단계는 일반적으로 *빌드 단계*에서 사용됩니다.
  + **검증** — Image Builder의 경우 이 단계는 일반적으로 *빌드 단계*에서 사용됩니다.
  + **테스트** — Image Builder의 경우 이 단계는 일반적으로 *테스트 단계*에서 사용됩니다.
+ 단계는 항상 문서에 정의된 순서대로 실행됩니다. 의 AWSTOE 명령 AWS CLI 에 지정된 순서는 영향을 주지 않습니다.

**단계(Steps)**  
단계는 각 단계 내의 워크플로우를 정의하는 개별 작업 단위입니다. 단계는 순차적으로 실행됩니다. 하지만 한 단계의 입력 또는 출력이 다음 단계에 입력으로 제공될 수도 있습니다. 이를 ‘체인화’라고 합니다.

**단계 규칙**
+ 단계 이름은 해당 단계에 대해 고유해야 합니다.
+ 단계는 종료 코드를 반환하는 지원되는 작업(작업 모듈)을 사용해야 합니다.

  지원되는 작업 모듈의 전체 목록, 작동 방식, 입력/출력 값 및 예제는 [AWSTOE 구성 요소 관리자가 지원하는 작업 모듈](toe-action-modules.md)(을)를 참조하세요.

## 구성 요소 로깅
<a name="component-logging"></a>

AWSTOE 는 구성 요소가 실행될 때마다 새 이미지를 빌드하고 테스트하는 데 사용되는 새 로그 폴더를 EC2 인스턴스에 생성합니다. 컨테이너 이미지의 경우 로그 폴더가 컨테이너에 저장됩니다.

이미지 생성 프로세스 중에 문제가 발생하는 경우 문제를 해결하는 데 도움이 되도록 구성 요소를 실행하는 동안 AWSTOE 생성되는 모든 출력 파일과 입력 문서가 로그 폴더에 저장됩니다.

로그 폴더 이름은 다음과 같은 부분으로 구성됩니다.

1. **로그 디렉터리** - 서비스가 AWSTOE 구성 요소를 실행하면 명령에 대한 다른 설정과 함께 로그 디렉터리를 전달합니다. 다음 예제에서는 Image Builder에서 사용하는 로그 파일 형식을 보여 줍니다.
   + **Linux 및 macOS**: `/var/lib/amazon/toe/`
   + **Windows**: `$env:ProgramFiles\Amazon\TaskOrchestratorAndExecutor\`

1. **파일 접두사** - 모든 구성 요소에 사용되는 표준 접두사입니다: ‘`TOE_`‘.

1. **런타임** — YYYY-MM-DD\$1HH-MM-SS\$1UTC-0 형식의 타임스탬프입니다.

1. **실행 ID** -가 하나 이상의 구성 요소를 AWSTOE 실행할 때 할당되는 GUID입니다.

예시: `/var/lib/amazon/toe/TOE_2021-07-01_12-34-56_UTC-0_a1bcd2e3-45f6-789a-bcde-0fa1b2c3def4`

AWSTOE 는 로그 폴더에 다음 코어 파일을 저장합니다.

**입력 파일**
+ **document.yaml** — 명령의 입력으로 사용되는 문서. 구성 요소가 실행된 후 이 파일은 아티팩트로 저장됩니다.

**출력 파일**
+ **application.log** - 애플리케이션 로그에는 구성 요소가 실행될 때 발생하는 상황에 대한 AWSTOE 의 타임스탬프가 있는 디버그 수준 정보가 들어 있습니다.
+ **detailedoutput.json** — 이 JSON 파일에는 구성 요소 실행 시 적용되는 모든 문서, 단계에 대한 실행 상태, 입력, 출력 및 실패에 대한 자세한 정보가 들어 있습니다.
+ **console.log** - 콘솔 로그에는 구성 요소가 실행되는 동안 콘솔에 AWSTOE 쓰는 모든 표준 출력(stdout) 및 표준 오류(stderr) 정보가 포함됩니다.
+ **chaining.json** -이 JSON 파일은 체인 표현식을 해석하는 데 AWSTOE 적용된 최적화를 나타냅니다.

**참고**  
로그 폴더에는 여기에서 다루지 않은 다른 임시 파일도 포함될 수 있습니다.

## 입력 및 출력 체인화
<a name="document-chaining"></a>

 AWSTOE 구성 관리 애플리케이션은 다음 형식으로 참조를 작성하여 입력과 출력을 연결하는 기능을 제공합니다.

`{{ phase_name.step_name.inputs/outputs.variable }}`

또는

`{{ phase_name.step_name.inputs/outputs[index].variable }}`

체인화 기능을 사용하면 코드를 재활용하고 문서의 유지 관리 용이성을 개선할 수 있습니다.

**체인화 규칙**
+ 체인화 표현식은 각 단계의 입력 섹션에서만 사용할 수 있습니다.
+ 체인화 표현식이 포함된 명령문은 따옴표로 묶어야 합니다. 예제:
  + **잘못된 표현식**: `echo {{ phase.step.inputs.variable }}`
  + **유효한 표현식**: `"echo {{ phase.step.inputs.variable }}"`
  + **유효한 표현식**: `'echo {{ phase.step.inputs.variable }}'`
+ 체인화 표현식은 동일한 문서 내 다른 단계의 변수를 참조할 수 있습니다. 하지만 호출 서비스에는 체인화 표현식이 단일 단계 컨텍스트 내에서만 작동하도록 요구하는 규칙이 있을 수 있습니다. 예를 들어 Image Builder는 각 단계를 독립적으로 실행하므로 *빌드 단계*에서 *테스트 단계*로의 체인화를 지원하지 않습니다.
+ 체인화 표현식의 인덱스는 0부터 시작하는 인덱싱을 따릅니다. 첫 번째 요소를 참조하는 인덱스는 0으로 시작합니다.

**예시**

다음 예제 단계의 두 번째 항목에서 소스 변수를 참조하기 위한 체인화 패턴은 다음과 같습니다.`{{ build.SampleS3Download.inputs[1].source }}`

```
phases:
  - name: 'build'
    steps:
      - name: SampleS3Download
        action: S3Download
        timeoutSeconds: 60
        onFailure: Abort
        maxAttempts: 3
        inputs:
          - source: 's3://sample-bucket/sample1.ps1'
            destination: 'C:\sample1.ps1'
          - source: 's3://sample-bucket/sample2.ps1'
            destination: 'C:\sample2.ps1'
```

다음 예제 단계의 출력 변수(‘Hello’와 동등)를 참조하기 위한 체인화 패턴은 다음과 같습니다.`{{ build.SamplePowerShellStep.outputs.stdout }}`

```
phases:
  - name: 'build'
    steps:
      - name: SamplePowerShellStep
        action: ExecutePowerShell
        timeoutSeconds: 120
        onFailure: Abort
        maxAttempts: 3
        inputs:
          commands:
            - 'Write-Host "Hello"'
```

## 문서 스키마 및 정의
<a name="document-schema"></a>

다음은 문서의 YAML 스키마입니다.

```
name: (optional)
description: (optional)
schemaVersion: "string"

phases:
  - name: "string"
    steps:
      - name: "string"
        action: "string"
        timeoutSeconds: integer
        onFailure: "Abort|Continue|Ignore"
        maxAttempts: integer
        inputs:
```

문서의 스키마 정의는 다음과 같습니다.


| 필드 | 설명 | 형식 | 필수 | 
| --- | --- | --- | --- | 
| 이름 | 문서의 이름. | 문자열 | No | 
| 설명 | 문서에 대한 설명. | 문자열 |  No  | 
| schemaVersion | 문서의 스키마 버전, 현재 1.0입니다. | 문자열 |  예  | 
| 단계 | 단계를 포함한 단계 목록. |  List  |  예  | 

단계의 스키마 정의는 다음과 같습니다.


| 필드 | 설명 | 형식 | 필수 | 
| --- | --- | --- | --- | 
| 이름 | 단계 이름. | 문자열 | 예 | 
| 단계(steps) | 단계의 단계 목록. | List  |  예  | 

단계의 스키마 정의는 다음과 같습니다.


| 필드 | 설명 | 형식 | 필수 | 기본값  | 
| --- | --- | --- | --- | --- | 
| 이름 | 단계에 대한 사용자 정의 이름. | 문자열 |  |  | 
| 작업 | 단계를 실행하는 모듈과 관련된 키워드. | 문자열 |  |  | 
| timeoutSeconds |  실패하거나 재시도하기 전에 단계가 실행되는 시간(초)  또한 무한 타임아웃을 나타내는 -1 값을 지원합니다. 0 및 기타 음수 값은 허용되지 않습니다.  | Integer |  아니요  | 7,200초(120분) | 
| onFailure |  장애 발생 시 단계에서 취해야 할 조치를 지정합니다. 유효한 값은 다음과 같습니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/imagebuilder/latest/userguide/toe-use-documents.html)  |  문자열  |  No  | 중단 | 
| maxAttempts | 단계가 실패하기 전까지 허용되는 최대 시도 횟수. | Integer |  아니요  | 1 | 
| 입력 | 작업 모듈이 단계를 실행하는 데 필요한 파라미터를 포함. | Dict |  예  |  | 

## 문서 예제
<a name="document-example"></a>

다음 예제는 대상 운영 체제에 대한 작업을 수행하는 AWSTOE 구성 요소 문서를 보여줍니다.

------
#### [ Linux ]

**예제 1: 사용자 지정 바이너리 파일 실행**  
다음은 Linux 인스턴스에서 사용자 지정 바이너리 파일을 다운로드하고 실행하는 예제 문서입니다.

```
name: LinuxBin
description: Download and run a custom Linux binary file.
schemaVersion: 1.0
phases:
  - name: build
    steps:
      - name: Download
        action: S3Download
        inputs:
          - source: s3://<replaceable>amzn-s3-demo-source-bucket</replaceable>/<replaceable>myapplication</replaceable>
            destination: /tmp/<replaceable>myapplication</replaceable>
      - name: Enable
        action: ExecuteBash
        onFailure: Continue
        inputs:
          commands:
            - 'chmod u+x {{ build.Download.inputs[0].destination }}'
      - name: Install
        action: ExecuteBinary
        onFailure: Continue
        inputs:
          path: '{{ build.Download.inputs[0].destination }}'
          arguments:
            - '--install'
      - name: Delete
        action: DeleteFile
        inputs:
          - path: '{{ build.Download.inputs[0].destination }}'
```

------
#### [ Windows ]

**예제 1: Windows 업데이트 설치**  
다음은 사용 가능한 모든 Windows 업데이트를 설치하고, 구성 스크립트를 실행하고, AMI를 생성하기 전에 변경 사항을 검증하고, AMI가 생성된 후 변경 사항을 테스트하는 예제 문서입니다.

```
name: RunConfig_UpdateWindows
description: 'This document will install all available Windows updates and run a config script. It will then validate the changes before an AMI is created. Then after AMI creation, it will test all the changes.'
schemaVersion: 1.0
phases:
  - name: build
    steps:
      - name: DownloadConfigScript
        action: S3Download
        timeoutSeconds: 60
        onFailure: Abort
        maxAttempts: 3
        inputs:
          - source: 's3://customer-bucket/config.ps1'
            destination: 'C:\config.ps1'

      - name: RunConfigScript
        action: ExecutePowerShell
        timeoutSeconds: 120
        onFailure: Abort
        maxAttempts: 3
        inputs:
          file: '{{build.DownloadConfigScript.inputs[0].destination}}'

      - name: Cleanup
        action: DeleteFile
        onFailure: Abort
        maxAttempts: 3
        inputs:
          - path: '{{build.DownloadConfigScript.inputs[0].destination}}'

      - name: RebootAfterConfigApplied
        action: Reboot
        inputs:
          delaySeconds: 60

      - name: InstallWindowsUpdates
        action: UpdateOS

  - name: validate
    steps:
      - name: DownloadTestConfigScript
        action: S3Download
        timeoutSeconds: 60
        onFailure: Abort
        maxAttempts: 3
        inputs:
          - source: 's3://customer-bucket/testConfig.ps1'
            destination: 'C:\testConfig.ps1'

      - name: ValidateConfigScript
        action: ExecutePowerShell
        timeoutSeconds: 120
        onFailure: Abort
        maxAttempts: 3
        inputs:
          file: '{{validate.DownloadTestConfigScript.inputs[0].destination}}'

      - name: Cleanup
        action: DeleteFile
        onFailure: Abort
        maxAttempts: 3
        inputs:
          - path: '{{validate.DownloadTestConfigScript.inputs[0].destination}}'

  - name: test
    steps:
      - name: DownloadTestConfigScript
        action: S3Download
        timeoutSeconds: 60
        onFailure: Abort
        maxAttempts: 3
        inputs:
          - source: 's3://customer-bucket/testConfig.ps1'
            destination: 'C:\testConfig.ps1'

      - name: ValidateConfigScript
        action: ExecutePowerShell
        timeoutSeconds: 120
        onFailure: Abort
        maxAttempts: 3
        inputs:
          file: '{{test.DownloadTestConfigScript.inputs[0].destination}}'
```

**예제 2: Windows 인스턴스 AWS CLI 에 설치**  
다음은 설정 파일을 사용하여 Windows 인스턴스 AWS CLI 에를 설치하는 예제 문서입니다.

```
name: InstallCLISetUp
description: Install &CLI; using the setup file
schemaVersion: 1.0
phases:
  - name: build
    steps:
      - name: Download
        action: S3Download
        inputs:
          - source: s3://aws-cli/AWSCLISetup.exe
            destination: C:\Windows\temp\AWSCLISetup.exe
      - name: Install
        action: ExecuteBinary
        onFailure: Continue
        inputs:
          path: '{{ build.Download.inputs[0].destination }}'
          arguments:
            - '/install'
            - '/quiet'
            - '/norestart'
      - name: Delete
        action: DeleteFile
        inputs:
          - path: '{{ build.Download.inputs[0].destination }}'
```

**예제 3: MSI 설치 관리자를 AWS CLI 사용하여 설치**  
다음은 MSI 설치 관리자를 AWS CLI 사용하여를 설치하는 예제 문서입니다.

```
name: InstallCLIMSI
description: Install &CLI; using the MSI installer
schemaVersion: 1.0
phases:
  - name: build
    steps:
      - name: Download
        action: S3Download
        inputs:
          - source: s3://aws-cli/AWSCLI64PY3.msi
            destination: C:\Windows\temp\AWSCLI64PY3.msi
      - name: Install
        action: ExecuteBinary
        onFailure: Continue
        inputs:
          path: 'C:\Windows\System32\msiexec.exe'
          arguments:
            - '/i'
            - '{{ build.Download.inputs[0].destination }}'
            - '/quiet'
            - '/norestart'
      - name: Delete
        action: DeleteFile
        inputs:
          - path: '{{ build.Download.inputs[0].destination }}'
```

------
#### [ macOS ]

**예제 1: 사용자 지정 macOS 바이너리 파일 실행**  
다음은 macOS 인스턴스에서 사용자 지정 바이너리 파일을 다운로드하고 실행하는 예제 문서입니다.

```
name: macOSBin
description: Download and run a binary file on macOS.
schemaVersion: 1.0
phases:
  - name: build
    steps:
      - name: Download
        action: S3Download
        inputs:
          - source: s3://<replaceable>amzn-s3-demo-source-bucket</replaceable>/<replaceable>myapplication</replaceable>
            destination: /tmp/<replaceable>myapplication</replaceable>
      - name: Enable
        action: ExecuteBash
        onFailure: Continue
        inputs:
          commands:
            - 'chmod u+x {{ build.Download.inputs[0].destination }}'
      - name: Install
        action: ExecuteBinary
        onFailure: Continue
        inputs:
          path: '{{ build.Download.inputs[0].destination }}'
          arguments:
            - '--install'
      - name: Delete
        action: DeleteFile
        inputs:
          - path: '{{ build.Download.inputs[0].destination }}'
```

------