

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

# AWS IoT Greengrass 구성 요소 개발
<a name="develop-greengrass-components"></a>

Greengrass 코어 디바이스에서 구성 요소를 개발하고 테스트할 수 있습니다. 따라서 AWS 클라우드와 상호 작용하지 않아도 AWS IoT Greengrass 소프트웨어를 생성하고 반복할 수 있습니다. 구성 요소의 버전을 마치면 클라우드의AWS IoT Greengrass 에 업로드할 수 있으므로 자신과 소속 팀이 구성 요소를 플릿의 다른 디바이스에 배포할 수 있습니다. 구성 요소를 배포하는 방법에 대한 자세한 내용은 [디바이스에 AWS IoT Greengrass 구성 요소 배포](manage-deployments.md) 단원을 참조하세요.

모든 구성 요소는 *레시피*와 *아티팩트 *로 구성되어 있습니다.
+ <a name="component-recipe-definition"></a>**레시피**

  모든 구성 요소에는 메타데이터가 정의되는 레시피 파일이 있습니다. 레시피에서는 구성 요소의 구성 파라미터, 구성 요소 종속성, 수명 주기 및 플랫폼 호환성도 지정됩니다. 구성 요소 수명 주기에서는 구성 요소 설치, 실행 및 종료 명령이 정의됩니다. 자세한 내용은 [AWS IoT Greengrass 구성 요소 레시피 참조](component-recipe-reference.md) 섹션을 참조하세요.

  레시피를 [JSON](https://en.wikipedia.org/wiki/JSON) 또는 [YAML](https://en.wikipedia.org/wiki/YAML) 형식으로 정의할 수 있습니다.
+ <a name="component-artifacts-definition"></a>**아티팩트**

  구성 요소의 구성 요소 바이너리인 아티팩트는 수량 제한이 없습니다. 아티팩트에는 구성 요소에서 사용되는 스크립트, 컴파일된 코드, 정적 리소스 및 기타 파일이 포함될 수 있습니다. 구성 요소에서는 구성 요소 종속성의 아티팩트도 사용될 수도 있습니다.

AWS IoT Greengrass에서는 애플리케이션에서 사용하고 디바이스에 배포할 수 있는 사전 빌드된 구성 요소가 제공됩니다. 예를 들어 스트림 관리자 구성 요소를 사용하여 다양한 AWS 서비스에 데이터를 업로드하거나 CloudWatch 지표 구성 요소를 사용하여 사용자 지정 지표를 Amazon CloudWatch에 게시할 수 있습니다. 자세한 내용은 [AWS 제공 구성 요소](public-components.md) 섹션을 참조하세요.

AWS IoT Greengrass에서는 Greengrass 소프트웨어 카탈로그라는 Greengrass 구성 요소의 인덱스가 큐레이팅됩니다. 이 카탈로그에서는 Greengrass 커뮤니티에서 개발하는 Greengrass 구성 요소가 추적됩니다. 이 카탈로그에서 구성 요소를 다운로드, 수정 및 배포하여 Greengrass 애플리케이션을 생성할 수 있습니다. 자세한 내용은 [커뮤니티 구성 요소](greengrass-software-catalog.md) 섹션을 참조하세요.

AWS IoT Greengrass 코어 소프트웨어에서는 코어 디바이스에서 구성하는 시스템 사용자 및 그룹(예: `ggc_user` 및 `ggc_group`)으로 구성 요소가 실행됩니다. 즉, 구성 요소에 해당 시스템 사용자의 권한이 있습니다. 홈 디렉터리가 없는 시스템 사용자를 사용하는 경우에는 홈 디렉터리가 사용되는 실행 명령 또는 코드가 구성 요소에서 사용될 수 없습니다. 즉, `pip install some-library --user` 명령을 사용하여 예컨대 Python 패키지를 설치할 수 없습니다. [시작하기 자습서](getting-started.md)에 따라 코어 디바이스를 설정했다면 시스템 사용자에게 홈 디렉터리가 없습니다. 구성 요소가 실행되는 사용자 및 그룹을 구성하는 방법에 대한 자세한 내용은 [구성 요소를 실행하는 사용자 구성](configure-greengrass-core-v2.md#configure-component-user) 단원을 참조하세요.

**참고**  <a name="semver-note"></a>
<a name="semver-para"></a>AWS IoT Greengrass에서는 구성 요소에 의미 체계 버전이 사용됩니다. *시맨틱 버전은 메이저*.*마이너*.*패치* 번호 시스템을 따릅니다. 예를 들어 `1.0.0` 버전은 구성 요소의 첫 번째 주요 릴리스를 나타냅니다. 자세한 내용은 [의미 체계 버전 사양](https://semver.org/)을 참조하세요.

**Topics**
+ [구성 요소 수명 주기](#component-lifecycle)
+ [구성 요소 유형](#component-types)
+ [AWS IoT Greengrass 구성 요소 생성](create-components.md)
+ [로컬 배포를 사용한 AWS IoT Greengrass 구성 요소 테스트](test-components.md)
+ [코어 디바이스에 배포할 구성 요소를 게시하세요.](publish-components.md)
+ [AWS 서비스와 상호 작용](interact-with-aws-services.md)
+ [Docker 컨테이너 실행](run-docker-container.md)
+ [AWS IoT Greengrass 구성 요소 레시피 참조](component-recipe-reference.md)
+ [구성 요소 환경 변수 참조](component-environment-variables.md)

## 구성 요소 수명 주기
<a name="component-lifecycle"></a>

*구성 요소 수명 주기*에서는 AWS IoT Greengrass 코어 소프트웨어의 구성 요소 설치 및 실행에 사용되는 스테이지가 정의됩니다. 각 스테이지에서는 구성 요소의 작동 방식이 지정되는 스크립트 및 기타 정보가 정의됩니다. 예를 들어 구성 요소를 설치할 때 AWS IoT Greengrass 코어 소프트웨어에서는 해당 구성 요소에 대한 `install` 수명 주기 스크립트가 실행됩니다. 코어 디바이스의 구성 요소에는 다음 수명 주기 상태가 있습니다.
+ `NEW` - 코어 디바이스에서 구성 요소의 레시피와 아티팩트가 로드되지만, 구성 요소는 설치되지 않습니다. 구성 요소가 이 상태로 전환되면 [스크립트 설치](component-recipe-reference.md#install-lifecycle-definition)가 실행됩니다.
+ `INSTALLED` - 코어 디바이스에서 구성 요소가 설치됩니다. 구성 요소가 [스크립트 설치](component-recipe-reference.md#install-lifecycle-definition)가 실행된 후 이 상태로 전환됩니다.
+ `STARTING` - 코어 디바이스에서 구성 요소가 시작됩니다. [시작 스크립트](component-recipe-reference.md#startup-lifecycle-definition)가 실행되면 구성 요소가 이 상태로 전환됩니다. 시작되면 구성 요소가 `RUNNING` 상태로 전환됩니다.
+ `RUNNING` - 코어 디바이스에서 구성 요소가 실행됩니다. [스크립트 실행](component-recipe-reference.md#run-lifecycle-definition)이 실행되거나 시작 스크립트의 활성 백그라운드 프로세스가 있으면 구성 요소가 이 상태로 전환됩니다.
+ `FINISHED` – 구성 요소가 실행되고 실행이 완료되었습니다.
+ `STOPPING` - 구성 요소가 중지되고 있습니다. [스크립트 종료](component-recipe-reference.md#shutdown-lifecycle-definition)가 실행되면 구성 요소가 이 상태로 전환됩니다.
+ `ERRORED` - 구성 요소에서 오류가 발생했습니다. 구성 요소가 이 상태로 전환되면 [스크립트 복구](component-recipe-reference.md#recover-lifecycle-definition)가 실행됩니다. 그런 다음에 구성 요소가 다시 시작되어 정상 사용으로 돌아가기가 시도됩니다. 구성 요소가 실행되지 않고 `ERRORED` 상태로 세 번 전환되면 구성 요소는 `BROKEN`으로 됩니다.
+ `BROKEN` - 오류가 여러 번 발생하여 구성 요소를 복구할 수 없습니다. 오류를 해결하려면 구성 요소를 다시 배포해야 합니다.

## 구성 요소 유형
<a name="component-types"></a>

*구성 요소 유형*에서는 AWS IoT Greengrass 코어 소프트웨어에서 구성 요소가 실행되는 방식이 지정됩니다. 구성 요소에는 다음 유형이 있을 수 있습니다.
+ **Nucleus**(`aws.greengrass.nucleus`)

  Greengrass nucleus는 AWS IoT Greengrass 코어 소프트웨어의 최소 기능이 제공되는 구성 요소입니다. 자세한 내용은 [Greengrass nucleus](greengrass-nucleus-component.md) 섹션을 참조하세요.
+ **플러그인**(`aws.greengrass.plugin`)

  Greengrass nucleus에서는 플러그인 구성 요소가 nucleus와 동일한 Java 가상 머신(JVM)에서 실행됩니다. 코어 디바이스에서 플러그인 구성 요소의 버전을 변경하면 nucleus가 다시 시작됩니다. 플러그인 구성 요소를 설치하고 실행하려면 시스템 서비스로 실행되도록 Greengrass nucleus를 구성해야 합니다. 자세한 내용은 [Greengrass nucleus를 시스템 서비스로 구성](configure-greengrass-core-v2.md#configure-system-service) 섹션을 참조하세요.

  AWS에서 제공하는 여러 구성 요소는 Greengrass nucleus와 직접 인터페이스로 연결될 수 있는 플러그인 구성 요소입니다. 플러그인 구성 요소에서는 Greengrass nucleus와 동일한 로그 파일이 사용됩니다. 자세한 내용은 [AWS IoT Greengrass 로그 모니터링](monitor-logs.md) 섹션을 참조하세요.
+ **일반:**(`aws.greengrass.generic`)

  구성 요소에서 수명 주기가 정의되는 경우 Greengrass nucleus에서는 일반 구성 요소의 수명 주기 스크립트가 실행됩니다.

  이 유형은 사용자 지정 구성 요소의 기본 유형입니다.
+ **Lambda**(`aws.greengrass.lambda`)

  Greengrass nucleus에서는 Lambda 함수 실행에 [Lambda 런처 구성 요소](lambda-launcher-component.md)가 사용됩니다.

  Lambda 함수에서 구성 요소를 생성할 때 구성 요소에 이 유형이 있습니다. 자세한 내용은 [AWS Lambda 함수 실행](run-lambda-functions.md) 섹션을 참조하세요.

**참고**  <a name="recipe-component-type-recommendation"></a>
레시피에서는 구성 요소 유형을 지정하지 않는 것이 좋습니다. 구성 요소를 생성할 때 자동으로 AWS IoT Greengrass에서 유형이 설정됩니다.

# AWS IoT Greengrass 구성 요소 생성
<a name="create-components"></a>

로컬 개발 컴퓨터 또는 Greengrass 코어 디바이스에서 사용자 지정 AWS IoT Greengrass 구성 요소를 개발할 수 있습니다. 사전 정의된 구성 요소 템플릿 및 [커뮤니티 구성 요소](greengrass-software-catalog.md)로부터 구성 요소를 생성, 빌드 및 게시하는 데 도움이 되는 [AWS IoT Greengrass 개발 키트 명령줄 인터페이스(GDK CLI)](greengrass-development-kit-cli.md)가 AWS IoT Greengrass에서 제공됩니다. 기본 제공 쉘 명령을 실행하여 구성 요소를 생성, 빌드 및 게시할 수도 있습니다. 다음 옵션 중에서 선택하여 사용자 지정 Greengrass 구성 요소를 생성합니다.
+ **Greengrass 개발 키트 CLI 사용**

  GDK CLI를 사용하여 로컬 개발 컴퓨터에서 구성 요소를 개발합니다. GDK CLI에서는 구성 요소 소스 코드가 빌드되어 AWS IoT Greengrass 서비스에 프라이빗 구성 요소로 게시할 수 있는 레시피 및 아티팩트에 패키징됩니다. 구성 요소를 게시할 때 구성 요소의 버전 및 아티팩트 URI가 자동으로 업데이트되도록 GDK CLI를 구성할 수 있으므로 매번 레시피를 업데이트할 필요가 없습니다. GDK CLI를 사용하여 구성 요소를 개발하려면 [Greengrass 소프트웨어 카탈로그](greengrass-software-catalog.md)의 템플릿 또는 커뮤니티 구성 요소에서 시작할 수 있습니다. 자세한 내용은 [AWS IoT Greengrass 개발 키트 명령줄 인터페이스](greengrass-development-kit-cli.md) 섹션을 참조하세요.
+ **기본 제공 쉘 명령 실행**

  기본 제공 쉘 명령을 실행하여 로컬 개발 컴퓨터 또는 Greengrass 코어 디바이스에서 구성 요소를 개발할 수 있습니다. 쉘 명령을 사용하여 구성 요소 소스 코드를 아티팩트에 복사하거나 빌드합니다. 새 구성 요소 버전을 생성할 때마다 새 구성 요소 버전으로 레시피를 생성하거나 업데이트해야 합니다. AWS IoT Greengrass 서비스에 구성 요소를 게시할 때 레시피의 각 구성 요소 아티팩트에 대해 URI를 업데이트해야 합니다.

**Topics**
+ [구성 요소 생성(GDK CLI)](#create-component-gdk-cli)
+ [구성 요소 생성(쉘 명령)](#create-component-shell-commands)

## 구성 요소 생성(GDK CLI)
<a name="create-component-gdk-cli"></a>

이 단원의 지침에 따라 GDK CLI를 사용하여 구성 요소를 생성하고 빌드합니다.

**Greengrass 구성 요소(GDK CLI)를 개발하려면**

1. 아직 설치하지 않았다면 개발 컴퓨터에 GDK CLI를 설치합니다. 자세한 내용은 [AWS IoT Greengrass 개발 키트 명령줄 인터페이스 설치 또는 업데이트](install-greengrass-development-kit-cli.md) 섹션을 참조하세요.

1. 구성 요소 폴더를 생성하려는 폴더로 변경합니다.

------
#### [ Linux or Unix ]

   ```
   mkdir ~/greengrassv2
   cd ~/greengrassv2
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   mkdir %USERPROFILE%\greengrassv2
   cd %USERPROFILE%\greengrassv2
   ```

------
#### [ PowerShell ]

   ```
   mkdir ~/greengrassv2
   cd ~/greengrassv2
   ```

------

1. 다운로드할 구성 요소 템플릿 또는 커뮤니티 구성 요소를 선택합니다. 템플릿 또는 커뮤니티 구성 요소는 GDK CLI에서 다운로드되므로 작동 예제부터 시작할 수 있습니다. [구성 요소 목록](greengrass-development-kit-cli-component.md#greengrass-development-kit-cli-component-list) 명령을 사용하여 사용 가능한 템플릿 또는 커뮤니티 구성 요소 목록을 검색합니다.
   + 구성 요소 템플릿을 나열하려면 다음 명령을 실행합니다. 응답의 각 줄에 템플릿의 이름과 프로그래밍 언어가 포함되어 있습니다.

     ```
     gdk component list --template
     ```
   + 커뮤니티 구성 요소를 나열하려면 다음 명령을 실행합니다.

     ```
     gdk component list --repository
     ```

1. GDK CLI에서 템플릿 또는 커뮤니티 구성 요소가 다운로드되는 구성 요소 폴더를 생성하여 변경합니다. 구성 요소의 이름 또는 이 구성 요소 폴더를 식별하는 데 도움이 되는 다른 이름으로 *HelloWorld*를 바꿉니다.

------
#### [ Linux or Unix ]

   ```
   mkdir HelloWorld
   cd HelloWorld
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   mkdir HelloWorld
   cd HelloWorld
   ```

------
#### [ PowerShell ]

   ```
   mkdir HelloWorld
   cd HelloWorld
   ```

------

1. 템플릿 또는 커뮤니티 구성 요소를 현재 폴더에 다운로드합니다. [component init](greengrass-development-kit-cli-component.md#greengrass-development-kit-cli-component-init) 명령을 사용합니다.
   + 템플릿으로부터 구성 요소 폴더를 생성하려면 다음 명령을 실행합니다. 템플릿의 이름으로 *HelloWorld*를 바꾸고, 프로그래밍 언어의 이름으로 *python*을 바꿉니다.

     ```
     gdk component init --template HelloWorld --language python
     ```
   + 커뮤니티 구성 요소로부터 구성 요소 폴더를 생성하려면 다음 명령을 실행합니다. 커뮤니티 구성 요소의 이름으로 *ComponentName*을 바꿉니다.

     ```
     gdk component init --repository ComponentName
     ```
**참고**  
<a name="gdk-cli-component-init-empty-folder-requirement"></a>GDK CLI v1.0.0을 사용하는 경우 빈 폴더에서 이 명령을 실행해야 합니다. GDK CLI는 템플릿 또는 커뮤니티 구성 요소를 현재 폴더에 다운로드합니다.  
<a name="gdk-cli-component-init-empty-folder-requirement-gdk-cli-v1.1.0"></a>GDK CLI v1.1.0 이상을 사용하는 경우 `--name` 인수를 지정하여 GDK CLI가 템플릿 또는 커뮤니티 구성 요소를 다운로드하는 폴더를 지정할 수 있습니다. 이 인수를 사용하는 경우 존재하지 않는 폴더를 지정해야 합니다. GDK CLI가 폴더를 생성합니다. 이 인수를 지정하지 않으면 GDK CLI에서 현재 폴더를 사용하고, 이 폴더는 비어 있어야 합니다.

1. GDK CLI에서는 `gdk-config.json`라는 [GDK CLI 구성 파일](gdk-cli-configuration-file.md)의 구성 요소 읽기, 빌드 및 게시가 진행됩니다. 이 구성 파일은 구성 요소 폴더의 루트에 있습니다. 이전 단계에서 이 파일이 자동으로 생성됩니다. 이 단계에서는 구성 요소에 대한 정보로 `gdk-config.json`을 업데이트합니다. 다음을 수행합니다.

   1. 텍스트 편집기에서 `gdk-config.json`을 엽니다.

   1. (선택 사항) 구성 요소의 이름을 변경합니다. 구성 요소 이름은 `component` 객체에 있는 키입니다.

   1. 구성 요소의 작성자를 변경합니다.

   1. (선택 사항) 구성 요소의 버전을 변경합니다. 다음 중 하나를 지정하세요.<a name="gdk-cli-configuration-file-component-version-options"></a>
      + `NEXT_PATCH` – 이 옵션을 선택하면 구성 요소를 게시할 때 GDK CLI에서 버전이 설정됩니다. GDK CLI에서는 AWS IoT Greengrass 서비스 쿼리를 통해 구성 요소의 최신 게시 버전이 식별됩니다. 그런 다음에 버전이 해당 버전 이후의 다음 패치 버전으로 설정됩니다. 이전에 구성 요소를 게시하지 않았으면 GDK CLI에서는 `1.0.0` 버전이 사용됩니다.

        이 옵션을 선택하면 [Greengrass CLI](greengrass-cli-component.md)를 사용하여 AWS IoT Greengrass 코어 소프트웨어를 실행하는 로컬 개발 컴퓨터에 구성 요소를 로컬로 배포하고 테스트할 수 없습니다. 로컬 배포를 활성화하려면 대신 의미 체계 버전을 지정해야 합니다.
      + 의미 체계 버전(예: **1.0.0**). 의미 체계 버전에서는 *major*.*minor*.*patch* 번호 매기기 시스템이 사용됩니다. 자세한 내용은 [의미 체계 버전 사양](https://semver.org/)을 참조하세요.

        구성 요소를 배포하고 테스트하려는 Greengrass 코어 디바이스에서 구성 요소를 개발하는 경우 이 옵션을 선택합니다. [Greengrass CLI](greengrass-cli-component.md)를 사용하여 로컬 배포를 생성하려면 특정 버전으로 구성 요소를 빌드해야 합니다.

   1. (선택 사항) 구성 요소의 빌드 구성을 변경합니다. 빌드 구성에서는 GDK CLI에서 구성 요소의 소스가 아티팩트에 빌드되는 방식이 정의됩니다. `build_system`의 경우 다음 옵션 중에서 선택합니다.<a name="gdk-cli-configuration-file-component-build-system-options"></a>
      + `zip` - 구성 요소의 폴더를 ZIP 파일로 패키징하여 구성 요소의 유일한 아티팩트로 정의합니다. 다음 유형의 구성 요소에 대해 이 옵션을 선택합니다.
        + Python 또는 JavaScript와 같이 해석된 프로그래밍 언어가 사용되는 구성 요소.
        + 기계 학습 모델 또는 기타 리소스와 같이 코드 이외의 파일이 패키징되는 구성 요소.

        GDK CLI에서는 구성 요소의 폴더를 이름이 동일한 zip 파일로 압축됩니다. 예를 들어, 구성 요소 폴더의 이름이 `HelloWorld`라면 GDK CLI에서는 `HelloWorld.zip`이라는 파일이 생성됩니다.
**참고**  
Windows 디바이스에서 GDK CLI 버전 1.0.0을 사용하는 경우 구성 요소 폴더 및 zip 파일 이름에는 소문자만 포함되어야 합니다.

        GDK CLI에서는 구성 요소의 폴더가 zip 파일로 압축하면 다음 파일을 건너뜁니다.
        + `gdk-config.json` 파일
        + 레시피 파일(`recipe.json` 또는 `recipe.yaml`)
        + 빌드 폴더(예: `greengrass-build`)
      + `maven` - `mvn clean package` 명령을 실행하여 구성 요소의 소스를 아티팩트에 빌드합니다. Java 구성 요소와 같이 [Maven](https://maven.apache.org/)을 사용하는 구성 요소의 경우 이 옵션을 선택합니다.

        Windows 디바이스에서 이 기능은 GDK CLI v1.1.0 이상에서 사용할 수 있습니다.
      + `gradle` - `gradle build` 명령을 실행하여 구성 요소의 소스를 아티팩트에 빌드합니다. [Gradle](https://gradle.org/)을 사용하는 구성 요소의 경우 이 옵션을 선택합니다. 이 기능은 GDK CLI v1.1.0 이상에서 사용할 수 있습니다.

        `gradle` 빌드 시스템에서는 빌드 파일로 Kotlin DSL이 지원됩니다. 이 기능은 GDK CLI v1.2.0 이상에서 사용할 수 있습니다.
      + `gradlew` - `gradlew` 명령을 실행하여 구성 요소의 소스를 아티팩트에 빌드합니다. [Gradle Wrapper](https://docs.gradle.org/current/userguide/gradle_wrapper.html)를 사용하는 구성 요소의 경우 이 옵션을 선택합니다.

        이 기능은 GDK CLI v1.2.0 이상에서 사용할 수 있습니다.
      + `custom` - 사용자 지정 명령을 실행하여 구성 요소의 소스를 레시피 및 아티팩트에 빌드합니다. `custom_build_command` 파라미터에서 사용자 지정 명령을 지정합니다.

   1. `build_system`에 `custom`을 지정하는 경우 `build` 객체에 `custom_build_command`를 추가합니다. `custom_build_command`에서 각 문자열은 명령의 단어인 단일 문자열 또는 문자열 목록을 지정합니다. 예를 들어, C\$1\$1 구성 요소에 대한 사용자 지정 빌드 명령을 실행하려면 **["cmake", "--build", "build", "--config", "Release"]**를 지정할 수 있습니다.

   1. <a name="gdk-cli-s3-bucket-name-formation"></a>GDK CLI v1.1.0 이상을 사용하는 경우 `--bucket` 인수를 지정하여 GDK CLI가 구성 요소의 아티팩트를 업로드하는 S3 버킷을 지정할 수 있습니다. <a name="gdk-cli-s3-bucket-name-formation-format"></a>이 인수를 지정하지 않으면 GDK CLI가 이름이 `bucket-region-accountId`인 S3 버킷에 업로드합니다. 여기서 *bucket*과 *region*은 `gdk-config.json`에서 지정하는 값이고, *accountId*는 AWS 계정 ID입니다. GDK CLI는 버킷이 없는 경우 버킷을 생성합니다.

      구성 요소의 게시 구성을 변경합니다. 다음을 수행합니다.

      1. 구성 요소 아티팩트를 호스팅하는 데 사용할 S3 버킷의 이름을 지정합니다.

      1. GDK CLI에서 구성 요소가 게시되는 AWS 리전을 지정합니다.

   이 단계를 완료하면 `gdk-config.json` 파일이 다음 예제와 비슷하게 보일 수 있습니다.

   ```
   {
     "component": {
       "com.example.PythonHelloWorld": {
         "author": "Amazon",
         "version": "NEXT_PATCH",
         "build": {
           "build_system" : "zip"
         },
         "publish": {
           "bucket": "greengrass-component-artifacts",
           "region": "us-west-2"
         }
       }
     },
     "gdk_version": "1.0.0"
   }
   ```

1. `recipe.yaml` 또는 `recipe.json`이라는 구성 요소 레시피 파일을 업데이트합니다. 다음을 수행합니다.

   1. `zip` 빌드 시스템이 사용되는 템플릿 또는 커뮤니티 구성 요소를 다운로드한 경우 zip 아티팩트 이름이 구성 요소 폴더의 이름과 일치하는지 확인합니다. GDK CLI에서는 구성 요소 폴더를 이름이 동일한 zip 파일로 압축됩니다. 레시피의 구성 요소 아티팩트 목록과 zip 아티팩트의 파일이 사용되는 수명 주기 스크립트에 zip 아티팩트 이름이 있습니다. zip 파일 이름이 구성 요소 폴더의 이름과 일치하도록 `Artifacts` 및 `Lifecycle` 정의를 업데이트합니다. 다음 부분 레시피 예제에서는 `Artifacts` 및 `Lifecycle` 정의의 zip 파일 이름이 강조 표시됩니다.

------
#### [ JSON ]

      ```
      {
        ...
        "Manifests": [
          {
            "Platform": {
              "os": "all"
            },
            "Artifacts": [
              {
                "URI": "s3://{COMPONENT_NAME}/{COMPONENT_VERSION}/HelloWorld.zip",
                "Unarchive": "ZIP"
              }
            ],
            "Lifecycle": {
              "Run": "python3 -u {artifacts:decompressedPath}/HelloWorld/main.py {configuration:/Message}"
            }
          }
        ]
      }
      ```

------
#### [ YAML ]

      ```
      ---
      ...
      Manifests:
        - Platform:
            os: all
          Artifacts:
            - URI: "s3://BUCKET_NAME/COMPONENT_NAME/COMPONENT_VERSION/HelloWorld.zip"
              Unarchive: ZIP
          Lifecycle:
            Run: "python3 -u {artifacts:decompressedPath}/HelloWorld/main.py {configuration:/Message}"
      ```

------

   1. (선택 사항) 구성 요소 설명, 기본 구성, 아티팩트, 수명 주기 스크립트 및 플랫폼 지원을 업데이트합니다. 자세한 내용은 [AWS IoT Greengrass 구성 요소 레시피 참조](component-recipe-reference.md) 섹션을 참조하세요.

   이 단계를 완료하면 레시피 파일이 다음 예제와 비슷하게 보일 수 있습니다.

------
#### [ JSON ]

   ```
   {
     "RecipeFormatVersion": "2020-01-25",
     "ComponentName": "{COMPONENT_NAME}",
     "ComponentVersion": "{COMPONENT_VERSION}",
     "ComponentDescription": "This is a simple Hello World component written in Python.",
     "ComponentPublisher": "{COMPONENT_AUTHOR}",
     "ComponentConfiguration": {
       "DefaultConfiguration": {
         "Message": "World"
       }
     },
     "Manifests": [
       {
         "Platform": {
           "os": "all"
         },
         "Artifacts": [
           {
             "URI": "s3://{COMPONENT_NAME}/{COMPONENT_VERSION}/HelloWorld.zip",
             "Unarchive": "ZIP"
           }
         ],
         "Lifecycle": {
           "Run": "python3 -u {artifacts:decompressedPath}/HelloWorld/main.py {configuration:/Message}"
         }
       }
     ]
   }
   ```

------
#### [ YAML ]

   ```
   ---
   RecipeFormatVersion: "2020-01-25"
   ComponentName: "{COMPONENT_NAME}"
   ComponentVersion: "{COMPONENT_VERSION}"
   ComponentDescription: "This is a simple Hello World component written in Python."
   ComponentPublisher: "{COMPONENT_AUTHOR}"
   ComponentConfiguration:
     DefaultConfiguration:
       Message: "World"
   Manifests:
     - Platform:
         os: all
       Artifacts:
         - URI: "s3://BUCKET_NAME/COMPONENT_NAME/COMPONENT_VERSION/HelloWorld.zip"
           Unarchive: ZIP
       Lifecycle:
         Run: "python3 -u {artifacts:decompressedPath}/HelloWorld/main.py {configuration:/Message}"
   ```

------

1. Greengrass 구성 요소를 개발하고 빌드합니다. [구성 요소 빌드](greengrass-development-kit-cli-component.md#greengrass-development-kit-cli-component-build) 명령에서는 구성 요소 폴더의 `greengrass-build` 폴더에 레시피와 아티팩트가 생성됩니다. 다음 명령을 실행합니다.

   ```
   gdk component build
   ```

구성 요소를 테스트할 준비가 되면 GDK CLI를 사용하여 AWS IoT Greengrass 서비스에 게시합니다. 그런 다음에 구성 요소를 다른 코어 디바이스에 배포할 수 있습니다. 자세한 내용은 [코어 디바이스에 배포할 구성 요소를 게시하세요.](publish-components.md) 섹션을 참조하세요.

## 구성 요소 생성(쉘 명령)
<a name="create-component-shell-commands"></a>

이 단원의 지침에 따라 여러 구성 요소에 대한 소스 코드 및 아티팩트가 있는 레시피 및 아티팩트 폴더를 생성합니다.

**Greengrass 구성 요소를 개발하려면(쉘 명령)**

1. <a name="create-component-recipes-artifacts-folder-step"></a>레시피 및 아티팩트의 하위 폴더로 구성 요소의 폴더를 생성합니다. Greengrass 코어 디바이스에서 다음 명령을 실행하여 이러한 폴더를 생성하고 구성 요소 폴더로 변경합니다. 로컬 개발에 사용할 폴더 경로로 *\$1/greengrassv2* 또는 *%USERPROFILE%\$1greengrassv2*를 바꿉니다.

------
#### [ Linux or Unix ]

   ```
   mkdir -p ~/greengrassv2/{recipes,artifacts}
   cd ~/greengrassv2
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   mkdir %USERPROFILE%\greengrassv2\\recipes, %USERPROFILE%\greengrassv2\\artifacts
   cd %USERPROFILE%\greengrassv2
   ```

------
#### [ PowerShell ]

   ```
   mkdir ~/greengrassv2/recipes, ~/greengrassv2/artifacts
   cd ~/greengrassv2
   ```

------

1. <a name="create-component-recipe-file-step"></a>텍스트 편집기를 사용하여 구성 요소의 메타데이터, 파라미터, 종속성, 수명 주기 및 플랫폼 기능이 정의되는 레시피 파일을 생성합니다. 레시피에 반영되는 구성 요소 버전을 식별할 수 있도록 레시피 파일 이름에 구성 요소 버전을 포함합니다. 레시피에 YAML 또는 JSON 형식을 선택할 수 있습니다.

   <a name="nano-command-intro"></a>예를 들어 Linux 기반 시스템에서 다음 명령을 실행하면 GNU nano를 사용하여 파일을 생성할 수 있습니다.

------
#### [ JSON ]

   ```
   nano recipes/com.example.HelloWorld-1.0.0.json
   ```

------
#### [ YAML ]

   ```
   nano recipes/com.example.HelloWorld-1.0.0.yaml
   ```

------
**참고**  
<a name="semver-para"></a>AWS IoT Greengrass에서는 구성 요소에 의미 체계 버전이 사용됩니다. *시맨틱 버전은 메이저*.*마이너*.*패치* 번호 시스템을 따릅니다. 예를 들어 `1.0.0` 버전은 구성 요소의 첫 번째 주요 릴리스를 나타냅니다. 자세한 내용은 [의미 체계 버전 사양](https://semver.org/)을 참조하세요.

1. 구성 요소의 레시피를 정의합니다. 자세한 내용은 [AWS IoT Greengrass 구성 요소 레시피 참조](component-recipe-reference.md) 섹션을 참조하세요.

   레시피는 다음 Hello World 예제 레시피와 비슷하게 보일 수 있습니다.

------
#### [ JSON ]

   ```
   {
     "RecipeFormatVersion": "2020-01-25",
     "ComponentName": "com.example.HelloWorld",
     "ComponentVersion": "1.0.0",
     "ComponentDescription": "My first AWS IoT Greengrass component.",
     "ComponentPublisher": "Amazon",
     "ComponentConfiguration": {
       "DefaultConfiguration": {
         "Message": "world"
       }
     },
     "Manifests": [
       {
         "Platform": {
           "os": "linux"
         },
         "Lifecycle": {
           "run": "python3 -u {artifacts:path}/hello_world.py {configuration:/Message}"
         }
       },
       {
         "Platform": {
           "os": "windows"
         },
         "Lifecycle": {
           "run": "py -3 -u {artifacts:path}/hello_world.py {configuration:/Message}"
         }
       }
     ]
   }
   ```

------
#### [ YAML ]

   ```
   ---
   RecipeFormatVersion: '2020-01-25'
   ComponentName: com.example.HelloWorld
   ComponentVersion: '1.0.0'
   ComponentDescription: My first AWS IoT Greengrass component.
   ComponentPublisher: Amazon
   ComponentConfiguration:
     DefaultConfiguration:
       Message: world
   Manifests:
     - Platform:
         os: linux
       Lifecycle:
         run: |
           python3 -u {artifacts:path}/hello_world.py "{configuration:/Message}"
     - Platform:
         os: windows
       Lifecycle:
         run: |
           py -3 -u {artifacts:path}/hello_world.py "{configuration:/Message}"
   ```

------

   이 레시피에서는 다음 예제 스크립트와 비슷하게 보일 수 있는 Hello World Python 스크립트가 실행됩니다.

   ```
   import sys
   
   message = "Hello, %s!" % sys.argv[1]
   
   # Print the message to stdout, which Greengrass saves in a log file.
   print(message)
   ```

1. 개발할 구성 요소 버전의 폴더를 생성합니다. 각 구성 요소 버전의 아티팩트를지 식별할 수 있도록 각 구성 요소 버전의 아티팩트에 별도의 폴더를 사용하는 것이 좋습니다. 다음 명령을 실행합니다.

------
#### [ Linux or Unix ]

   ```
   mkdir -p artifacts/com.example.HelloWorld/1.0.0
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   mkdir artifacts/com.example.HelloWorld/1.0.0
   ```

------
#### [ PowerShell ]

   ```
   mkdir artifacts/com.example.HelloWorld/1.0.0
   ```

------
**중요**  <a name="local-artifact-folder-name-requirements"></a>
아티팩트 폴더 경로에는 다음 형식을 사용해야 합니다. 레시피에서 지정하는 구성 요소 이름과 버전을 포함합니다.  

   ```
   artifacts/componentName/componentVersion/
   ```

1. 이전 단계에서 생성한 폴더에서 구성 요소의 아티팩트를 생성합니다. 아티팩트에는 소프트웨어, 이미지, 구성 요소에서 사용되는 기타 바이너리가 포함될 수 있습니다.

   구성 요소가 준비되면 [구성 요소를 테스트](test-components.md)합니다.

# 로컬 배포를 사용한 AWS IoT Greengrass 구성 요소 테스트
<a name="test-components"></a>

코어 디바이스에서 Greengrass 구성 요소를 개발하는 경우 로컬 배포를 생성하여 설치하고 테스트할 수 있습니다. 이 섹션의 단계에 따라 로컬 배포를 생성합니다.

다른 컴퓨터(예: 로컬 개발 컴퓨터)에서 구성 요소를 개발하는 경우 로컬 배포를 생성할 수 없습니다. 그 대신에 구성 요소를 AWS IoT Greengrass 서비스에 게시하여 Greengrass 코어 디바이스에 배포하고 테스트할 수 있습니다. 자세한 내용은 [코어 디바이스에 배포할 구성 요소를 게시하세요.](publish-components.md) 및 [디바이스에 AWS IoT Greengrass 구성 요소 배포](manage-deployments.md)(을)를 참조하세요.

**Greengrass 코어 디바이스에서 구성 요소를 테스트하려면**

1. 코어 디바이스는 구성 요소 업데이트와 같은 이벤트를 기록합니다. 이 로그 파일을 보고 잘못된 레시피와 같은 구성 요소 오류를 검색하고 해결할 수 있습니다. 이 로그 파일에는 구성 요소가 표준 출력(stdout)으로 출력하는 메시지도 표시됩니다. 새로운 로그 메시지를 실시간으로 관찰하려면 코어 디바이스에서 터미널 세션을 추가로 열어두는 것이 좋습니다. SSH 등을 통해 새 터미널 세션을 열고 다음 명령을 실행하여 로그를 확인합니다. `/greengrass/v2`를 AWS IoT Greengrass 루트 폴더의 경로로 바꿉니다.

------
#### [ Linux or Unix ]

   ```
   sudo tail -f /greengrass/v2/logs/greengrass.log
   ```

------
#### [ PowerShell ]

   ```
   gc C:\greengrass\v2\logs\greengrass.log -Tail 10 -Wait
   ```

------

   구성 요소의 로그 파일을 볼 수도 있습니다.

------
#### [ Linux or Unix ]

   ```
   sudo tail -f /greengrass/v2/logs/com.example.HelloWorld.log
   ```

------
#### [ PowerShell ]

   ```
   gc C:\greengrass\v2\logs\com.example.HelloWorld.log -Tail 10 -Wait
   ```

------

1. 원래 터미널 세션에서 다음 명령을 실행하여 구성 요소로 코어 디바이스를 업데이트합니다. `/greengrass/v2`를 AWS IoT Greengrass 루트 폴더의 경로로 바꾸고 *\$1/greengrassv2*를 로컬 개발 폴더의 경로로 바꿉니다.

------
#### [ Linux or Unix ]

   ```
   sudo /greengrass/v2/bin/greengrass-cli deployment create \
     --recipeDir ~/greengrassv2/recipes \
     --artifactDir ~/greengrassv2/artifacts \
     --merge "com.example.HelloWorld=1.0.0"
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   C:\greengrass\v2\bin\greengrass-cli deployment create ^
     --recipeDir %USERPROFILE%\greengrassv2\recipes ^
     --artifactDir %USERPROFILE%\greengrassv2\artifacts ^
     --merge "com.example.HelloWorld=1.0.0"
   ```

------
#### [ PowerShell ]

   ```
   C:\greengrass\v2\bin\greengrass-cli deployment create `
     --recipeDir ~/greengrassv2/recipes `
     --artifactDir ~/greengrassv2/artifacts `
     --merge "com.example.HelloWorld=1.0.0"
   ```

------
**참고**  
`greengrass-cli deployment create` 명령을 사용하여 구성 요소의 구성 파라미터 값을 설정할 수도 있습니다. 자세한 내용은 [생성](gg-cli-deployment.md#deployment-create) 섹션을 참조하세요.

1. `greengrass-cli deployment status` 명령을 사용하여 구성 요소의 배포 진행 상황을 모니터링합니다.

------
#### [ Unix or Linux ]

   ```
   sudo /greengrass/v2/bin/greengrass-cli deployment status \
     -i deployment-id
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   C:\greengrass\v2\bin\greengrass-cli deployment status ^
     -i deployment-id
   ```

------
#### [ PowerShell ]

   ```
   C:\greengrass\v2\bin\greengrass-cli deployment status `
     -i deployment-id
   ```

------

1. Greengrass 코어 디바이스에서 실행되는 구성 요소를 테스트합니다. 이 버전의 구성 요소를 완료하면 이를 AWS IoT Greengrass 서비스에 업로드할 수 있습니다. 그런 다음 구성 요소를 다른 코어 디바이스에 배포할 수 있습니다. 자세한 내용은 [코어 디바이스에 배포할 구성 요소를 게시하세요.](publish-components.md) 섹션을 참조하세요.

# 코어 디바이스에 배포할 구성 요소를 게시하세요.
<a name="publish-components"></a>

구성 요소의 버전을 빌드하거나 완료한 후 AWS IoT Greengrass 서비스에 게시할 수 있습니다. 그런 다음 Greengrass 코어 디바이스에 배포할 수 있습니다.

[Greengrass 개발 키트 CLI(GDK CLI)](greengrass-development-kit-cli.md)를 사용하여 [구성 요소를 개발하고 빌드하는 경우](create-components.md) [GDK CLI를 사용](#publish-component-gdk-cli)하여 구성 요소를 AWS 클라우드에 게시할 수 있습니다. 그렇지 않으면 [기본 제공 쉘 명령과 AWS CLI를 사용](#publish-component-shell-commands)하여 구성 요소를 게시합니다.

또한 AWS CloudFormation을 사용하여 템플릿에서 구성 요소 및 기타 AWS 리소스를 생성할 수도 있습니다. 자세한 내용은 *AWS CloudFormation 사용 설명서*의 [AWS CloudFormation이란?](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) 및 [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrassv2-componentversion.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrassv2-componentversion.html)을 참조하세요.

**Topics**
+ [구성 요소 게시(GDK CLI)](#publish-component-gdk-cli)
+ [구성 요소 게시(쉘 명령)](#publish-component-shell-commands)

## 구성 요소 게시(GDK CLI)
<a name="publish-component-gdk-cli"></a>

이 섹션의 지침에 따라 GDK CLI를 사용하여 구성 요소를 게시합니다. GDK CLI는 빌드 아티팩트를 S3 버킷에 업로드하고, 레시피에서 아티팩트 URI를 업데이트하고, 레시피에서 구성 요소를 생성합니다. [GDK CLI 구성 파일](gdk-cli-configuration-file.md)에서 사용할 S3 버킷 및 리전을 지정합니다.

<a name="gdk-cli-s3-bucket-name-formation"></a>GDK CLI v1.1.0 이상을 사용하는 경우 `--bucket` 인수를 지정하여 GDK CLI가 구성 요소의 아티팩트를 업로드하는 S3 버킷을 지정할 수 있습니다. <a name="gdk-cli-s3-bucket-name-formation-format"></a>이 인수를 지정하지 않으면 GDK CLI가 이름이 `bucket-region-accountId`인 S3 버킷에 업로드합니다. 여기서 *bucket*과 *region*은 `gdk-config.json`에서 지정하는 값이고, *accountId*는 AWS 계정 ID입니다. GDK CLI는 버킷이 없는 경우 버킷을 생성합니다.

**중요**  <a name="publish-component-s3-bucket-token-exchange-role-permissions"></a>
코어 디바이스 역할에서는 기본적으로 S3 버킷에 대한 액세스를 허용하지 않습니다. 이 S3 버킷을 처음 사용하는 경우 코어 디바이스가 이 S3 버킷에서 구성 요소 아티팩트를 검색하도록 허용하는 권한을 역할에 추가해야 합니다. 자세한 내용은 [구성 요소 아티팩트에 대한 S3 버킷 액세스 허용](device-service-role.md#device-service-role-access-s3-bucket) 섹션을 참조하세요.

**Greengrass 구성 요소를 게시하려면(GDK CLI)**

1. 명령 프롬프트 또는 터미널에서 구성 요소 폴더를 엽니다.

1. 아직 하지 않은 경우 Greengrass 구성 요소를 빌드합니다. [구성 요소 빌드](greengrass-development-kit-cli-component.md#greengrass-development-kit-cli-component-build) 명령에서는 구성 요소 폴더의 `greengrass-build` 폴더에 레시피와 아티팩트가 생성됩니다. 다음 명령을 실행합니다.

   ```
   gdk component build
   ```

1. 구성 요소를 AWS 클라우드에 게시합니다. [component publish](greengrass-development-kit-cli-component.md#greengrass-development-kit-cli-component-publish) 명령은 구성 요소의 아티팩트를 Amazon S3에 업로드하고 각 아티팩트의 URI로 구성 요소의 레시피를 업데이트합니다. 그런 다음 AWS IoT Greengrass 서비스에서 구성 요소를 생성합니다.
**참고**  <a name="publish-component-s3-bucket-artifact-digest-warning"></a>
AWS IoT Greengrass는 구성 요소를 생성할 때 각 아티팩트의 다이제스트를 계산합니다. 따라서 구성 요소를 생성한 후에는 S3 버킷에서 아티팩트 파일을 수정할 수 없습니다. 수정하는 경우 파일 다이제스트가 일치하지 않게 되므로 이 구성 요소가 포함된 배포가 실패합니다. 아티팩트 파일을 수정하는 경우 구성 요소의 새 버전을 생성해야 합니다.

   GDK CLI 구성 파일에서 구성 요소 버전에 `NEXT_PATCH`를 지정하는 경우 GDK CLI는 AWS IoT Greengrass 서비스에 아직 없는 다음 패치 버전을 사용합니다.

   다음 명령을 실행합니다.

   ```
   gdk component publish
   ```

   출력에서는 GDK CLI가 생성한 구성 요소의 버전을 알려줍니다.

   구성 요소를 게시한 후 코어 디바이스에 구성 요소를 배포할 수 있습니다. 자세한 내용은 [디바이스에 AWS IoT Greengrass 구성 요소 배포](manage-deployments.md) 섹션을 참조하세요.

## 구성 요소 게시(쉘 명령)
<a name="publish-component-shell-commands"></a>

다음 절차에 따라 쉘 명령과 AWS Command Line Interface(AWS CLI)를 사용하여 구성 요소를 게시합니다. 구성 요소를 게시할 때 다음을 수행합니다.

1. 구성 요소 아티팩트를 S3 버킷에 게시합니다.

1. 각 아티팩트의 Amazon S3 URI를 구성 요소 레시피에 추가합니다.

1. AWS IoT Greengrass에서 구성 요소 레시피를 통해 구성 요소 버전을 생성합니다.

**참고**  <a name="component-version-uniqueness-note"></a>
<a name="component-version-uniqueness-para"></a>업로드하는 각 구성 요소 버전은 고유해야 합니다. 업로드한 후에는 편집할 수 없으므로 올바른 구성 요소 버전을 업로드해야 합니다.

다음 단계에 따라 개발 컴퓨터 또는 Greengrass 코어 디바이스에서 구성 요소를 게시할 수 있습니다.

**구성 요소를 게시하려면(쉘 명령)**

1. 구성 요소가 AWS IoT Greengrass 서비스에 있는 버전을 사용하는 경우 구성 요소의 버전을 변경해야 합니다. 텍스트 편집기에서 레시피를 열고 버전을 늘리고 파일을 저장합니다. 구성 요소에 대해 변경한 사항을 반영하는 새 버전을 선택합니다.
**참고**  <a name="semver-note"></a>
<a name="semver-para"></a>AWS IoT Greengrass에서는 구성 요소에 의미 체계 버전이 사용됩니다. *시맨틱 버전은 메이저*.*마이너*.*패치* 번호 시스템을 따릅니다. 예를 들어 `1.0.0` 버전은 구성 요소의 첫 번째 주요 릴리스를 나타냅니다. 자세한 내용은 [의미 체계 버전 사양](https://semver.org/)을 참조하세요.

1. 구성 요소에 아티팩트가 있는 경우 다음을 수행합니다.

   1. 구성 요소의 아티팩트를 AWS 계정의 S3 버킷에 게시합니다.
**작은 정보**  <a name="artifact-path-tip"></a>
S3 버킷의 아티팩트 경로에 구성 요소 이름과 버전을 포함하는 것이 좋습니다. 이 이름 지정 체계는 이전 버전의 구성 요소가 사용하는 아티팩트를 유지 관리하는 데 도움이 될 수 있으므로 이전 구성 요소 버전을 계속 지원할 수 있습니다.

      다음 명령을 실행하여 아티팩트 파일을 S3 버킷에 게시합니다. amzn-s3-demo-bucket을 버킷 이름으로 바꾸고 *artifacts/com.example.HelloWorld /1.0.0/artifact.py*를 아티팩트 파일의 경로로 바꿉니다.

      ```
      aws s3 cp artifacts/com.example.HelloWorld/1.0.0/artifact.py s3://amzn-s3-demo-bucket/artifacts/com.example.HelloWorld/1.0.0/artifact.py
      ```
**중요**  <a name="publish-component-s3-bucket-token-exchange-role-permissions"></a>
코어 디바이스 역할에서는 기본적으로 S3 버킷에 대한 액세스를 허용하지 않습니다. 이 S3 버킷을 처음 사용하는 경우 코어 디바이스가 이 S3 버킷에서 구성 요소 아티팩트를 검색하도록 허용하는 권한을 역할에 추가해야 합니다. 자세한 내용은 [구성 요소 아티팩트에 대한 S3 버킷 액세스 허용](device-service-role.md#device-service-role-access-s3-bucket) 섹션을 참조하세요.

   1. 없는 경우 `Artifacts`라는 목록을 구성 요소 레시피에 추가합니다. `Artifacts` 목록은 구성 요소가 지원하는 각 플랫폼에서 구성 요소의 요구 사항(또는 모든 플랫폼에 대한 구성 요소의 기본 요구 사항)을 정의하는 각 매니페스트에 표시됩니다.

   1. 아티팩트 목록에 각 아티팩트를 추가하거나 기존 아티팩트의 URI를 업데이트합니다. Amazon S3 URI는 버킷 이름과 버킷의 아티팩트 객체 경로로 구성되어 있습니다. 아티팩트의 Amazon S3 URI는 다음 예와 비슷해야 합니다.

      ```
      s3://amzn-s3-demo-bucket/artifacts/com.example.HelloWorld/1.0.0/artifact.py
      ```

   이 단계를 완료한 후 레시피에는 다음 `Artifacts` 목록이 있어야 합니다.

------
#### [ JSON ]

   ```
   {
     ...
     "Manifests": [
       {
         "Lifecycle": {
           ...
         },
         "Artifacts": [
           {
             "URI": "s3://amzn-s3-demo-bucket/artifacts/MyGreengrassComponent/1.0.0/artifact.py",
             "Unarchive": "NONE"
           }
         ]
       }
     ]
   }
   ```

**참고**  
ZIP 아티팩트에 대한 `"Unarchive": "ZIP"` 옵션을 추가하여 구성 요소가 배포될 때 아티팩트의 압축을 풀도록 AWS IoT Greengrass 코어 소프트웨어를 구성할 수 있습니다.

------
#### [ YAML ]

   ```
   ...
   Manifests:
     - Lifecycle:
         ...
       Artifacts:
         - URI: s3://amzn-s3-demo-bucket/artifacts/MyGreengrassComponent/1.0.0/artifact.py
           Unarchive: NONE
   ```

**참고**  
`Unarchive: ZIP` 옵션을 사용하여 구성 요소가 배포될 때 ZIP 아티팩트의 압축을 풀도록 AWS IoT Greengrass 코어 소프트웨어를 구성할 수 있습니다. 구성 요소에서 ZIP 아티팩트를 사용하는 방법에 대한 자세한 내용은 [artifacts:decompressedPath 레시피 변수](component-recipe-reference.md#component-recipe-artifacts-decompressed-path)를 참조하세요.

------

   레시피에 대한 자세한 내용은 [AWS IoT Greengrass 구성 요소 레시피 참조](component-recipe-reference.md) 단원을 참조하세요.

1. AWS IoT Greengrass 콘솔을 사용하여 레시피 파일에서 구성 요소를 생성합니다.

   다음 명령을 실행하여 레시피 파일에서 구성 요소를 생성합니다. 이 명령은 구성 요소를 생성하고 AWS 계정의 프라이빗 AWS IoT Greengrass 구성 요소로 게시합니다. *path/to/recipeFile*을 레시피 파일의 경로로 바꿉니다.

   ```
   aws greengrassv2 create-component-version --inline-recipe fileb://path/to/recipeFile
   ```

   응답에서 `arn`를 복사하여 다음 단계에서 구성 요소의 상태를 확인합니다.
**참고**  <a name="publish-component-s3-bucket-artifact-digest-warning"></a>
AWS IoT Greengrass는 구성 요소를 생성할 때 각 아티팩트의 다이제스트를 계산합니다. 따라서 구성 요소를 생성한 후에는 S3 버킷에서 아티팩트 파일을 수정할 수 없습니다. 수정하는 경우 파일 다이제스트가 일치하지 않게 되므로 이 구성 요소가 포함된 배포가 실패합니다. 아티팩트 파일을 수정하는 경우 구성 요소의 새 버전을 생성해야 합니다.

1. AWS IoT Greengrass 서비스의 각 구성 요소에는 상태가 있습니다. 다음 명령을 실행하여 이 절차에서 게시하는 구성 요소 버전의 상태를 확인합니다. *com.example.HelloWorld* 및 *1.0.0*을 쿼리할 구성 요소 버전으로 바꿉니다. `arn`을 이전 단계의 ARN으로 바꿉니다.

   ```
   aws greengrassv2 describe-component --arn "arn:aws:greengrass:region:account-id:components:com.example.HelloWorld:versions:1.0.0"
   ```

   이 작업은 구성 요소의 메타데이터가 포함된 응답을 반환합니다. 메타데이터에는 구성 요소 상태와 해당하는 경우 오류를 포함하는 `status` 객체가 포함되어 있습니다.

   구성 요소 상태가 `DEPLOYABLE`이면 구성 요소를 디바이스에 배포할 수 있습니다. 자세한 내용은 [디바이스에 AWS IoT Greengrass 구성 요소 배포](manage-deployments.md) 섹션을 참조하세요.

# AWS 서비스와 상호 작용
<a name="interact-with-aws-services"></a>

Greengrass 코어 디바이스는 X.509 인증서를 사용하여 TLS 상호 인증 프로토콜을 사용하는 AWS IoT Core에 연결합니다. 이러한 인증서를 사용하면 디바이스가 일반적으로 액세스 키 ID 및 비밀 액세스 키로 구성되는 AWS 자격 증명 없이 AWS IoT와 상호 작용할 수 있습니다. 다른 AWS 서비스는 서비스 엔드포인트에서 API 작업을 직접 호출하려면 X.509 인증서 대신 AWS 자격 증명이 필요합니다. AWS IoT Core에는 디바이스가 X.509 인증서를 사용하여 AWS 요청을 인증할 수 있도록 하는 자격 증명 공급자가 있습니다. AWS IoT 자격 증명 공급자는 X.509 인증서를 사용하여 디바이스를 인증하고 제한된 권한의 임시 보안 토큰 형태로 AWS 자격 증명을 발급합니다. 디바이스는 이 토큰을 사용하여 모든 AWS 요청을 서명하고 인증할 수 있습니다. 이렇게 하면 Greengrass 코어 디바이스에 AWS 자격 증명을 저장할 필요가 없습니다. 자세한 내용은 *AWS IoT Core 개발자 안내서*의 [AWS 서비스 직접 호출에 대한 권한 부여](https://docs.aws.amazon.com/iot/latest/developerguide/authorizing-direct-aws.html)를 참조하세요.

AWS IoT에서 자격 증명을 가져오려면 코어 디바이스는 IAM 역할을 가리키는 AWS IoT 역할 별칭을 사용합니다. 이 IAM 역할을 *토큰 교환 역할*이라고 합니다. AWS IoT Greengrass 코어 소프트웨어를 설치할 때 역할 별칭과 토큰 교환 역할을 생성합니다. 코어 디바이스가 사용하는 역할 별칭을 지정하려면 [Greengrass nucleus](greengrass-nucleus-component.md)의 `iotRoleAlias` 파라미터를 구성합니다.

AWS IoT 자격 증명 공급자는 사용자를 대신하여 토큰 교환 역할을 수임하여 코어 디바이스에 AWS 자격 증명을 제공합니다. 이 역할에 적절한 IAM 정책을 연결하여 코어 디바이스가 S3 버킷의 구성 요소 아티팩트와 같은 AWS 리소스에 액세스할 수 있습니다. 토큰 교환 역할을 구성하는 방법에 대한 자세한 내용은 [코어 디바이스가 AWS 서비스와 상호 작용할 수 있도록 권한 부여](device-service-role.md) 섹션을 참조하세요.

Greengrass 코어 디바이스는 AWS 자격 증명을 메모리에 저장하며 자격 증명은 기본적으로 1시간 후에 만료됩니다. AWS IoT Greengrass 코어 소프트웨어가 다시 시작되면 자격 증명을 다시 가져와야 합니다. [UpdateRoleAlias](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateRoleAlias.html) 작업을 사용하여 자격 증명이 유효한 기간을 구성할 수 있습니다.

AWS IoT Greengrass는 AWS 서비스와 상호 작용할 사용자 지정 구성 요소의 종속성으로 정의할 수 있는 토큰 교환 서비스 구성 요소인 퍼블릭 구성 요소를 제공합니다. 토큰 교환 서비스는 AWS 자격 증명을 제공하는 로컬 서버에 대한 URI를 정의하는 환경 변수인 `AWS_CONTAINER_CREDENTIALS_FULL_URI`를 구성 요소에 제공합니다. AWS SDK 클라이언트를 생성할 때 클라이언트는 이 환경 변수를 확인하고 로컬 서버에 연결하여 AWS 자격 증명을 검색하고 이를 사용하여 API 요청에 서명합니다. 이렇게 하면 AWS SDK 및 기타 도구를 사용하여 구성 요소의 AWS 서비스를 호출할 수 있습니다. 자세한 내용은 [토큰 교환 서비스](token-exchange-service-component.md) 섹션을 참조하세요.

**중요**  <a name="token-exchange-service-aws-sdk-requirement"></a>
이러한 방식으로 AWS 자격 증명을 획득하도록 하는 지원은 2016년 7월 13일에 AWS SDK에 추가되었습니다. 구성 요소는 이 날짜 이후에 생성된 AWS SDK 버전을 사용해야 합니다. 자세한 내용은 *Amazon Elastic Container Service 개발자 안내서*의 [지원되는 AWS SDK 사용](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html#task-iam-roles-minimum-sdk)을 참조하세요.

사용자 지정 구성 요소에서 AWS 자격 증명을 획득하려면 구성 요소 레시피에서 `aws.greengrass.TokenExchangeService`를 종속성으로 정의합니다. 다음 예제 레시피에서는 [boto3](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html)를 설치하고 토큰 교환 서비스의 AWS 자격 증명을 사용하여 Amazon S3 버킷을 나열하는 Python 스크립트를 실행하는 구성 요소를 정의합니다.

**참고**  
이 예제 구성 요소를 실행하려면 디바이스에 `s3:ListAllMyBuckets` 권한이 있어야 합니다. 자세한 내용은 [코어 디바이스가 AWS 서비스와 상호 작용할 수 있도록 권한 부여](device-service-role.md) 섹션을 참조하세요.

------
#### [ JSON ]

```
{
  "RecipeFormatVersion": "2020-01-25",
  "ComponentName": "com.example.ListS3Buckets",
  "ComponentVersion": "1.0.0",
  "ComponentDescription": "A component that uses the token exchange service to list S3 buckets.",
  "ComponentPublisher": "Amazon",
  "ComponentDependencies": {
    "aws.greengrass.TokenExchangeService": {
      "VersionRequirement": "^2.0.0",
      "DependencyType": "HARD"
    }
  },
  "Manifests": [
    {
      "Platform": {
        "os": "linux"
      },
      "Lifecycle": {
        "install": "pip3 install --user boto3",
        "Run": "python3 -u {artifacts:path}/list_s3_buckets.py"
      }
    },
    {
      "Platform": {
        "os": "windows"
      },
      "Lifecycle": {
        "install": "pip3 install --user boto3",
        "Run": "py -3 -u {artifacts:path}/list_s3_buckets.py"
      }
    }
  ]
}
```

------
#### [ YAML ]

```
---
RecipeFormatVersion: '2020-01-25'
ComponentName: com.example.ListS3Buckets
ComponentVersion: '1.0.0'
ComponentDescription: A component that uses the token exchange service to list S3 buckets.
ComponentPublisher: Amazon
ComponentDependencies:
  aws.greengrass.TokenExchangeService:
    VersionRequirement: '^2.0.0'
    DependencyType: HARD
Manifests:
  - Platform:
      os: linux
    Lifecycle:
      install:
        pip3 install --user boto3
      Run: |-
        python3 -u {artifacts:path}/list_s3_buckets.py
  - Platform:
      os: windows
    Lifecycle:
      install:
        pip3 install --user boto3
      Run: |-
        py -3 -u {artifacts:path}/list_s3_buckets.py
```

------

이 예제 구성 요소는 Amazon S3 버킷을 나열하는 다음 Python 스크립트 `list_s3_buckets.py`를 실행합니다.

```
import boto3
import os

try:
    print("Creating boto3 S3 client...")
    s3 = boto3.client('s3')
    print("Successfully created boto3 S3 client")
except Exception as e:
    print("Failed to create boto3 s3 client. Error: " + str(e))
    exit(1)

try:
    print("Listing S3 buckets...")
    response = s3.list_buckets()
    for bucket in response['Buckets']:
        print(f'\t{bucket["Name"]}')
    print("Successfully listed S3 buckets")
except Exception as e:
    print("Failed to list S3 buckets. Error: " + str(e))
    exit(1)
```

# Docker 컨테이너 실행
<a name="run-docker-container"></a>

다음 위치에 저장된 이미지에서 [Docker](https://www.docker.com/) 컨테이너를 실행하도록 AWS IoT Greengrass 구성 요소를 구성할 수 있습니다.
+ Amazon Elastic Container Registry(Amazon ECR)의 퍼블릭 및 프라이빗 이미지 리포지토리
+ 퍼블릭 Docker Hub 리포지토리
+ 퍼블릭 Docker 신뢰할 수 있는 레지스트리
+ S3 버킷

사용자 지정 컴포넌트에서 이미지를 검색하고 코어 디바이스에서 실행할 수 있도록 Docker 이미지 URI를 아티팩트로 포함하세요. Amazon ECR 및 Docker Hub 이미지의 경우 [Docker 애플리케이션 관리자](docker-application-manager-component.md) 구성 요소를 사용하여 이미지를 다운로드하고 프라이빗 Amazon ECR 리포지토리에 대한 자격 증명을 관리할 수 있습니다.

**Topics**
+ [요구 사항](#run-docker-container-requirements)
+ [Amazon ECR 또는 Docker Hub의 퍼블릭 이미지에서 Docker 컨테이너 실행](#run-docker-container-public-ecr-dockerhub)
+ [Amazon ECR의 프라이빗 이미지에서 Docker 컨테이너 실행](#run-docker-container-private-ecr)
+ [Amazon S3의 이미지에서 Docker 컨테이너 실행](#run-docker-container-s3)
+ [Docker 컨테이너 구성 요소에서 프로세스 간 통신 사용](#docker-container-ipc)
+ [Docker 컨테이너 구성 요소에서 AWS 자격 증명 사용(Linux)](#docker-container-token-exchange-service)
+ [Docker 컨테이너 구성 요소에서 스트림 관리자 사용(Linux)](#docker-container-stream-manager)

## 요구 사항
<a name="run-docker-container-requirements"></a>

구성 요소에서 Docker 컨테이너를 실행하려면 다음이 필요합니다.
+ Greengrass 코어 디바이스. 없으면 [자습서: AWS IoT Greengrass V2 시작하기](getting-started.md) 섹션을 참조하세요.
+ <a name="docker-engine-requirement"></a>Greengrass 코어 디바이스에 [Docker Engine](https://docs.docker.com/engine/) 1.9.1 이상이 설치되어 있어야 합니다. 버전 20.10은 AWS IoT Greengrass 코어 소프트웨어에서 작동하는 것으로 확인된 최신 버전입니다. Docker 컨테이너를 실행하는 구성 요소를 배포하기 전에 코어 디바이스에 직접 Docker를 설치해야 합니다.
**작은 정보**  
구성 요소가 설치될 때 코어 디바이스가 Docker Engine을 설치하도록 구성할 수도 있습니다. 예를 들어 다음 설치 스크립트는 Docker 이미지를 로드하기 전에 Docker Engine을 설치합니다. 이 설치 스크립트는 Ubuntu와 같은 Debian 기반 Linux 배포에서 작동합니다. 이 명령으로 Docker Engine을 설치하도록 구성하는 경우 설치 및 `docker` 명령을 실행하려면 수명 주기 스크립트에서 `RequiresPrivilege`를 `true`로 설정해야 할 수 있습니다. 자세한 내용은 [AWS IoT Greengrass 구성 요소 레시피 참조](component-recipe-reference.md) 단원을 참조하십시오.  

  ```
  apt-get install docker-ce docker-ce-cli containerd.io && docker load -i {artifacts:path}/hello-world.tar
  ```
+ <a name="docker-user-permissions-requirement"></a>Docker 컨테이너 구성 요소를 실행하는 시스템 사용자에게 루트 또는 관리자 권한이 있거나 루트 또는 관리자가 아닌 사용자로 실행하도록 Docker를 구성해야 합니다.
  + Linux 디바이스에서는 `docker` 그룹에 사용자를 추가하여 `sudo` 없이 `docker` 명령을 직접적으로 호출할 수 있습니다.
  + Windows 디바이스에서는 `docker-users` 그룹에 사용자를 추가하여 관리자 권한 없이 `docker` 명령을 직접적으로 호출할 수 있습니다.

------
#### [ Linux or Unix ]

  Docker 컨테이너 구성 요소를 실행하는 데 사용하는 `ggc_user` 또는 루트 사용자가 아닌 사용자를 `docker` 그룹에 추가하려면 다음 명령을 실행합니다.

  ```
  sudo usermod -aG docker ggc_user
  ```

  자세한 내용은 [루트 사용자가 아닌 사용자로 Docker 관리](https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user)를 참조하세요.

------
#### [ Windows Command Prompt (CMD) ]

  `ggc_user` 또는 Docker 컨테이너 구성 요소를 실행하는 데 사용하는 사용자를 `docker-users` 그룹에 추가하려면 관리자로 다음 명령을 실행합니다.

  ```
  net localgroup docker-users ggc_user /add
  ```

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

  `ggc_user` 또는 Docker 컨테이너 구성 요소를 실행하는 데 사용하는 사용자를 `docker-users` 그룹에 추가하려면 관리자로 다음 명령을 실행합니다.

  ```
  Add-LocalGroupMember -Group docker-users -Member ggc_user
  ```

------
+ Docker 컨테이너에 [볼륨으로 탑재](https://docs.docker.com/storage/volumes/)된 Docker 컨테이너 구성 요소에서 액세스하는 파일입니다.
+ <a name="docker-proxy-requirement"></a>[네트워크 프록시를 사용하도록 AWS IoT Greengrass 코어 소프트웨어를 구성하는](configure-greengrass-core-v2.md#configure-alpn-network-proxy) 경우 [동일한 프록시 서버를 사용하도록 Docker를 구성](https://docs.docker.com/network/proxy/)해야 합니다.

이러한 요구 사항 외에도 사용자 환경에 적용되는 경우 다음과 같은 요구 사항도 충족해야 합니다.
+ [Docker Compose](https://docs.docker.com/compose/)를 사용하여 Docker 컨테이너를 생성하고 시작하려면 Greengrass 코어 디바이스에 Docker Compose를 설치하고 Docker Compose 파일을 S3 버킷에 업로드하세요. Compose 파일은 구성 AWS 리전 요소와 동일한 AWS 계정 및의 S3 버킷에 저장해야 합니다. 사용자 지정 컴포넌트에서 `docker-compose up` 명령을 사용하는 예제는 [Amazon ECR 또는 Docker Hub의 퍼블릭 이미지에서 Docker 컨테이너 실행](#run-docker-container-public-ecr-dockerhub) 섹션을 참조하세요.
+ 네트워크 프록시 AWS IoT Greengrass 뒤에서를 실행하는 경우 [프록시 서버를](https://docs.docker.com/network/proxy/) 사용하도록 Docker 데몬을 구성합니다.
+ Docker 이미지가 Amazon ECR 또는 Docker Hub에 저장되어 있는 경우 Docker 컨테이너 구성 요소에 [Docker 구성 요소 관리자](docker-application-manager-component.md) 구성 요소를 종속성으로 포함합니다. 구성 요소를 배포하기 전에 코어 디바이스에서 Docker 대몬을 시작해야 합니다.

  또한 이미지 URI를 구성 요소 아티팩트로 포함하세요. 이미지 URI는 다음 예제와 같이 `docker:registry/image[:tag|@digest]` 형식이어야 합니다.<a name="docker-image-artifact-uri"></a>
  + 프라이빗 Amazon ECR 이미지: `docker:account-id.dkr.ecr.region.amazonaws.com/repository/image[:tag|@digest]`
  + 퍼블릭 Amazon ECR 이미지: `docker:public.ecr.aws/repository/image[:tag|@digest]`
  + 퍼블릭 Docker Hub 이미지: `docker:name[:tag|@digest]`

  퍼블릭 리포지토리에 저장된 이미지에서 Docker 컨테이너를 실행하는 방법에 대한 자세한 내용은 [Amazon ECR 또는 Docker Hub의 퍼블릭 이미지에서 Docker 컨테이너 실행](#run-docker-container-public-ecr-dockerhub) 섹션을 참조하세요.
+ Docker 이미지가 Amazon ECR 프라이빗 리포지토리에 저장되어 있는 경우 토큰 교환 서비스 구성 요소를 Docker 컨테이너 구성 요소에 종속성으로 포함해야 합니다. 또한 다음 예제 IAM 정책에 표시된 대로 [Greengrass 디바이스 역할](device-service-role.md)에서 `ecr:GetAuthorizationToken`, `ecr:BatchGetImage`, `ecr:GetDownloadUrlForLayer` 작업을 허용해야 합니다.

------
#### [ JSON ]

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Action": [
          "ecr:GetAuthorizationToken",
          "ecr:BatchGetImage",
          "ecr:GetDownloadUrlForLayer"
        ],
        "Resource": [
          "*"
        ],
        "Effect": "Allow"
      }
    ]
  }
  ```

------

  Amazon ECR 프라이빗 리포지토리에 저장된 이미지에서 Docker 컨테이너를 실행하는 방법에 대한 자세한 내용은 [Amazon ECR의 프라이빗 이미지에서 Docker 컨테이너 실행](#run-docker-container-private-ecr) 섹션을 참조하세요.
+ Amazon ECR 프라이빗 리포지토리에 저장된 Docker 이미지를 사용하려면 프라이빗 리포지토리가 코어 디바이스 AWS 리전 와 동일한에 있어야 합니다.
+ Docker 이미지 또는 Compose 파일이 S3 버킷에 저장되어 있는 경우 다음 예제 IAM 정책에 표시된 대로 [Greengrass 디바이스 역할](device-service-role.md)에서 코어 디바이스가 이미지를 구성 요소 아티팩트로 다운로드할 수 있도록 허용하는 `s3:GetObject` 권한을 허용해야 합니다.

------
#### [ JSON ]

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Action": [
          "s3:GetObject"
        ],
        "Resource": [
          "*"
        ],
        "Effect": "Allow"
      }
    ]
  }
  ```

------

  Amazon S3에 저장된 이미지에서 Docker 컨테이너를 실행하는 방법에 대한 자세한 내용은 [Amazon S3의 이미지에서 Docker 컨테이너 실행](#run-docker-container-s3) 섹션을 참조하세요.
+ <a name="docker-greengrass-features-requirements"></a>Docker 컨테이너 구성 요소에서 프로세스 간 통신(IPC), AWS 자격 증명 또는 스트림 관리자를 사용하려면 Docker 컨테이너를 실행할 때 추가 옵션을 지정해야 합니다. 자세한 내용은 다음을 참조하세요.<a name="docker-greengrass-features-requirements-links"></a>
  + [Docker 컨테이너 구성 요소에서 프로세스 간 통신 사용](#docker-container-ipc)
  + [Docker 컨테이너 구성 요소에서 AWS 자격 증명 사용(Linux)](#docker-container-token-exchange-service)
  + [Docker 컨테이너 구성 요소에서 스트림 관리자 사용(Linux)](#docker-container-stream-manager)

## Amazon ECR 또는 Docker Hub의 퍼블릭 이미지에서 Docker 컨테이너 실행
<a name="run-docker-container-public-ecr-dockerhub"></a>

이 섹션에서는 Docker Compose를 사용하여 Amazon ECR 및 Docker Hub에 저장된 Docker 이미지에서 Docker 컨테이너를 실행하는 사용자 지정 구성 요소를 생성하는 방법을 설명합니다.

**Docker Compose를 사용하여 Docker 컨테이너를 실행하려면**

1. Docker Compose 파일을 생성하고 Amazon S3 버킷에 업로드합니다. [Greengrass 디바이스 역할](device-service-role.md)이 디바이스에서 Compose 파일에 액세스할 수 있는 `s3:GetObject` 권한을 허용하는지 확인합니다. 다음 예제에 표시된 Compose 파일 예제에는 Amazon ECR의 Amazon CloudWatch 에이전트 이미지와 Docker Hub의 MySQL 이미지가 포함되어 있습니다.

   ```
   version: "3"
   services:
     cloudwatchagent:
       image: "public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest"
     mysql:
       image: "mysql:8.0"
   ```

1.  AWS IoT Greengrass 코어 디바이스에서 [사용자 지정 구성 요소를 생성합니다](create-components.md). 다음 예제에 표시된 예제 레시피에는 다음 속성이 있습니다.
   + 종속성으로서의 Docker 애플리케이션 관리자 구성 요소입니다. 이 구성 요소를 사용하면 AWS IoT Greengrass 가 퍼블릭 Amazon ECR 및 Docker Hub 리포지토리에서 이미지를 다운로드할 수 있습니다.
   + 퍼블릭 Amazon ECR 리포지토리에서 Docker 이미지를 지정하는 구성 요소 아티팩트입니다.
   + 퍼블릭 Docker Hub 리포지토리에서 Docker 이미지를 지정하는 구성 요소 아티팩트입니다.
   + 실행하려는 Docker 이미지의 컨테이너를 포함하는 Docker Compose 파일을 지정하는 구성 요소 아티팩트입니다.
   + 지정된 이미지에서 컨테이너를 생성하고 시작하기 위해 [docker-compose up](https://docs.docker.com/compose/reference/up/)을 사용하는 수명 주기 실행 스크립트입니다.

------
#### [ JSON ]

   ```
   {
     "RecipeFormatVersion": "2020-01-25",
     "ComponentName": "com.example.MyDockerComposeComponent",
     "ComponentVersion": "1.0.0",
     "ComponentDescription": "A component that uses Docker Compose to run images from public Amazon ECR and Docker Hub.",
     "ComponentPublisher": "Amazon",
     "ComponentDependencies": {
       "aws.greengrass.DockerApplicationManager": {
         "VersionRequirement": "~2.0.0"
       }
     },
     "Manifests": [
       {
         "Platform": {
           "os": "all"
         },
         "Lifecycle": {
           "Run": "docker-compose -f {artifacts:path}/docker-compose.yaml up"
         },
         "Artifacts": [
           {
             "URI": "docker:public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest"
           },
           {
             "URI": "docker:mysql:8.0"
           },
           {
             "URI": "s3://amzn-s3-demo-bucket/folder/docker-compose.yaml"
           }
         ]
       }
     ]
   }
   ```

------
#### [ YAML ]

   ```
   ---
   RecipeFormatVersion: '2020-01-25'
   ComponentName: com.example.MyDockerComposeComponent
   ComponentVersion: '1.0.0'
   ComponentDescription: 'A component that uses Docker Compose to run images from public Amazon ECR and Docker Hub.'
   ComponentPublisher: Amazon
   ComponentDependencies:
     aws.greengrass.DockerApplicationManager:
       VersionRequirement: ~2.0.0
   Manifests:
     - Platform:
         os: all
       Lifecycle:
           Run: docker-compose -f {artifacts:path}/docker-compose.yaml up
       Artifacts:
         - URI: "docker:public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest"
         - URI: "docker:mysql:8.0"
         - URI: "s3://amzn-s3-demo-bucket/folder/docker-compose.yaml"
   ```

------
**참고**  
<a name="docker-greengrass-features-requirements"></a>Docker 컨테이너 구성 요소에서 프로세스 간 통신(IPC), AWS 자격 증명 또는 스트림 관리자를 사용하려면 Docker 컨테이너를 실행할 때 추가 옵션을 지정해야 합니다. 자세한 내용은 다음을 참조하세요.  
[Docker 컨테이너 구성 요소에서 프로세스 간 통신 사용](#docker-container-ipc)
[Docker 컨테이너 구성 요소에서 AWS 자격 증명 사용(Linux)](#docker-container-token-exchange-service)
[Docker 컨테이너 구성 요소에서 스트림 관리자 사용(Linux)](#docker-container-stream-manager)

1. [구성 요소를 테스트](test-components.md)하여 예상대로 작동하는지 확인합니다.
**중요**  
구성 요소를 배포하기 전에 Docker 대몬을 설치하고 시작해야 합니다.

   구성 요소를 로컬에 배포한 후 [docker container ls](https://docs.docker.com/engine/reference/commandline/container_ls/) 명령을 실행하여 컨테이너가 실행되는지 확인할 수 있습니다.

   ```
   docker container ls
   ```

1. 구성 요소가 준비되면 구성 요소를에 업로드 AWS IoT Greengrass 하여 다른 코어 디바이스에 배포합니다. 자세한 내용은 [코어 디바이스에 배포할 구성 요소를 게시하세요.](publish-components.md) 단원을 참조하십시오.

## Amazon ECR의 프라이빗 이미지에서 Docker 컨테이너 실행
<a name="run-docker-container-private-ecr"></a>

이 섹션에서는 Amazon ECR의 프라이빗 리포지토리에 저장된 Docker 이미지에서 Docker 컨테이너를 실행하는 사용자 지정 구성 요소를 만드는 방법을 설명합니다.

**Docker 컨테이너를 실행하려면**

1.  AWS IoT Greengrass 코어 디바이스에서 [사용자 지정 구성 요소를 생성합니다](create-components.md). 다음 속성이 있는 다음 레시피 예제를 사용합니다.
   + 종속성으로서의 Docker 애플리케이션 관리자 구성 요소입니다. 이 구성 요소를 사용하면 AWS IoT Greengrass 가 프라이빗 리포지토리에서 이미지를 다운로드하기 위한 자격 증명을 관리할 수 있습니다.
   + 종속성으로서의 토큰 교환 서비스 구성 요소입니다. 이 구성 요소를 사용하면 AWS IoT Greengrass 가 Amazon ECR과 상호 작용할 자격 AWS 증명을 검색할 수 있습니다.
   + 프라이빗 Amazon ECR 리포지토리에서 Docker 이미지를 지정하는 구성 요소 아티팩트입니다.
   + 이미지에서 컨테이너를 생성하고 시작하기 위해 [docker run](https://docs.docker.com/engine/reference/commandline/run/)을 사용하는 수명 주기 실행 스크립트입니다.

------
#### [ JSON ]

   ```
   {
     "RecipeFormatVersion": "2020-01-25",
     "ComponentName": "com.example.MyPrivateDockerComponent",
     "ComponentVersion": "1.0.0",
     "ComponentDescription": "A component that runs a Docker container from a private Amazon ECR image.",
     "ComponentPublisher": "Amazon",
     "ComponentDependencies": {
       "aws.greengrass.DockerApplicationManager": {
         "VersionRequirement": "~2.0.0"
       },
       "aws.greengrass.TokenExchangeService": {
         "VersionRequirement": "~2.0.0"
       }
     },
     "Manifests": [
       {
         "Platform": {
           "os": "all"
         },
         "Lifecycle": {
           "Run": "docker run account-id.dkr.ecr.region.amazonaws.com/repository[:tag|@digest]"
         },
         "Artifacts": [
           {
             "URI": "docker:account-id.dkr.ecr.region.amazonaws.com/repository[:tag|@digest]"
           }
         ]
       }
     ]
   }
   ```

------
#### [ YAML ]

   ```
   ---
   RecipeFormatVersion: '2020-01-25'
   ComponentName: com.example.MyPrivateDockerComponent
   ComponentVersion: '1.0.0'
   ComponentDescription: 'A component that runs a Docker container from a private Amazon ECR image.'
   ComponentPublisher: Amazon
   ComponentDependencies:
     aws.greengrass.DockerApplicationManager:
       VersionRequirement: ~2.0.0
     aws.greengrass.TokenExchangeService:
       VersionRequirement: ~2.0.0
   Manifests:
     - Platform:
         os: all
       Lifecycle:
           Run: docker run account-id.dkr.ecr.region.amazonaws.com/repository[:tag|@digest]
       Artifacts:
         - URI: "docker:account-id.dkr.ecr.region.amazonaws.com/repository[:tag|@digest]"
   ```

------
**참고**  
<a name="docker-greengrass-features-requirements"></a>Docker 컨테이너 구성 요소에서 프로세스 간 통신(IPC), AWS 자격 증명 또는 스트림 관리자를 사용하려면 Docker 컨테이너를 실행할 때 추가 옵션을 지정해야 합니다. 자세한 내용은 다음을 참조하세요.  
[Docker 컨테이너 구성 요소에서 프로세스 간 통신 사용](#docker-container-ipc)
[Docker 컨테이너 구성 요소에서 AWS 자격 증명 사용(Linux)](#docker-container-token-exchange-service)
[Docker 컨테이너 구성 요소에서 스트림 관리자 사용(Linux)](#docker-container-stream-manager)

1. [구성 요소를 테스트](test-components.md)하여 예상대로 작동하는지 확인합니다.
**중요**  
구성 요소를 배포하기 전에 Docker 대몬을 설치하고 시작해야 합니다.

   구성 요소를 로컬에 배포한 후 [docker container ls](https://docs.docker.com/engine/reference/commandline/container_ls/) 명령을 실행하여 컨테이너가 실행되는지 확인할 수 있습니다.

   ```
   docker container ls
   ```

1. 구성 요소를에 업로드 AWS IoT Greengrass 하여 다른 코어 디바이스에 배포합니다. 자세한 내용은 [코어 디바이스에 배포할 구성 요소를 게시하세요.](publish-components.md) 단원을 참조하십시오.

## Amazon S3의 이미지에서 Docker 컨테이너 실행
<a name="run-docker-container-s3"></a>

이 섹션에서는 Amazon S3에 저장된 Docker 이미지의 구성 요소에서 Docker 컨테이너를 실행하는 방법을 설명합니다.

**Amazon S3의 이미지에서 구성 요소에서 Docker 컨테이너를 실행하려면**

1. [docker save](https://docs.docker.com/engine/reference/commandline/save/) 명령을 실행하여 Docker 컨테이너의 백업을 생성합니다. 이 백업을 구성 요소 아티팩트로 제공하여 AWS IoT Greengrass에서 컨테이너를 실행합니다. *hello-world*를 이미지 이름으로 바꾸고 *hello-world.tar*를 생성할 아카이브 파일 이름으로 바꿉니다.

   ```
   docker save hello-world > artifacts/com.example.MyDockerComponent/1.0.0/hello-world.tar
   ```

1.  AWS IoT Greengrass 코어 디바이스에서 [사용자 지정 구성 요소를 생성합니다](create-components.md). 다음 속성이 있는 다음 레시피 예제를 사용합니다.
   + 아카이브에서 Docker 이미지를 로드하기 위해 [docker load](https://docs.docker.com/engine/reference/commandline/load/)를 사용하는 수명 주기 설치 스크립트입니다.
   + 이미지에서 컨테이너를 생성하고 시작하기 위해 [docker run](https://docs.docker.com/engine/reference/commandline/run/)을 사용하는 수명 주기 실행 스크립트입니다. `--rm` 옵션은 컨테이너가 종료될 때 컨테이너를 정리합니다.

------
#### [ JSON ]

   ```
   {
     "RecipeFormatVersion": "2020-01-25",
     "ComponentName": "com.example.MyS3DockerComponent",
     "ComponentVersion": "1.0.0",
     "ComponentDescription": "A component that runs a Docker container from an image in an S3 bucket.",
     "ComponentPublisher": "Amazon",
     "Manifests": [
       {
         "Platform": {
           "os": "linux"
         },
         "Lifecycle": {
           "install": {
             "Script": "docker load -i {artifacts:path}/hello-world.tar"
           },
           "Run": {
             "Script": "docker run --rm hello-world"
           }
         }
       }
     ]
   }
   ```

------
#### [ YAML ]

   ```
   ---
   RecipeFormatVersion: '2020-01-25'
   ComponentName: com.example.MyS3DockerComponent
   ComponentVersion: '1.0.0'
   ComponentDescription: 'A component that runs a Docker container from an image in an S3 bucket.'
   ComponentPublisher: Amazon
   Manifests:
     - Platform:
         os: linux
       Lifecycle:
         install:
           Script: docker load -i {artifacts:path}/hello-world.tar
         Run:
           Script: docker run --rm hello-world
   ```

------
**참고**  
<a name="docker-greengrass-features-requirements"></a>Docker 컨테이너 구성 요소에서 프로세스 간 통신(IPC), AWS 자격 증명 또는 스트림 관리자를 사용하려면 Docker 컨테이너를 실행할 때 추가 옵션을 지정해야 합니다. 자세한 내용은 다음을 참조하세요.  
[Docker 컨테이너 구성 요소에서 프로세스 간 통신 사용](#docker-container-ipc)
[Docker 컨테이너 구성 요소에서 AWS 자격 증명 사용(Linux)](#docker-container-token-exchange-service)
[Docker 컨테이너 구성 요소에서 스트림 관리자 사용(Linux)](#docker-container-stream-manager)

1. [구성 요소를 테스트](test-components.md)하여 예상대로 작동하는지 확인합니다.

   구성 요소를 로컬에 배포한 후 [docker container ls](https://docs.docker.com/engine/reference/commandline/container_ls/) 명령을 실행하여 컨테이너가 실행되는지 확인할 수 있습니다.

   ```
   docker container ls
   ```

1. 구성 요소가 준비되면 Docker 이미지 아카이브를 S3 버킷에 업로드하고 해당 URI를 구성 요소 레시피에 추가합니다. 그런 다음 구성 요소를에 업로드 AWS IoT Greengrass 하여 다른 코어 디바이스에 배포할 수 있습니다. 자세한 내용은 [코어 디바이스에 배포할 구성 요소를 게시하세요.](publish-components.md) 단원을 참조하십시오.

   완료되면 구성 요소 레시피는 다음 예제와 유사하게 보일 것입니다.

------
#### [ JSON ]

   ```
   {
     "RecipeFormatVersion": "2020-01-25",
     "ComponentName": "com.example.MyS3DockerComponent",
     "ComponentVersion": "1.0.0",
     "ComponentDescription": "A component that runs a Docker container from an image in an S3 bucket.",
     "ComponentPublisher": "Amazon",
     "Manifests": [
       {
         "Platform": {
           "os": "linux"
         },
         "Lifecycle": {
           "install": {
             "Script": "docker load -i {artifacts:path}/hello-world.tar"
           },
           "Run": {
             "Script": "docker run --rm hello-world"
           }
         },
         "Artifacts": [
           {
             "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.MyDockerComponent/1.0.0/hello-world.tar"
           }
         ]
       }
     ]
   }
   ```

------
#### [ YAML ]

   ```
   ---
   RecipeFormatVersion: '2020-01-25'
   ComponentName: com.example.MyS3DockerComponent
   ComponentVersion: '1.0.0'
   ComponentDescription: 'A component that runs a Docker container from an image in an S3 bucket.'
   ComponentPublisher: Amazon
   Manifests:
     - Platform:
         os: linux
       Lifecycle:
         install:
           Script: docker load -i {artifacts:path}/hello-world.tar
         Run:
           Script: docker run --rm hello-world
       Artifacts:
         - URI: s3://amzn-s3-demo-bucket/artifacts/com.example.MyDockerComponent/1.0.0/hello-world.tar
   ```

------

## Docker 컨테이너 구성 요소에서 프로세스 간 통신 사용
<a name="docker-container-ipc"></a>

의 Greengrass 프로세스 간 통신(IPC) 라이브러리를 사용하여 Greengrass nucleus, 기타 Greengrass 구성 요소 및와 통신 AWS IoT Device SDK 할 수 있습니다 AWS IoT Core. 자세한 내용은 [AWS IoT Device SDK 를 사용하여 Greengrass nucleus, 기타 구성 요소 및 AWS IoT CoreGreengrass nucleus, 기타 구성 요소 및와 통신 AWS IoT Core](interprocess-communication.md) 단원을 참조하십시오.

Docker 컨테이너 구성 요소에서 IPC를 사용하려면 다음 파라미터를 사용하여 Docker 컨테이너를 실행해야 합니다.
+ 컨테이너에 IPC 소켓을 탑재합니다. Greengrass nucleus는 `AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT` 환경 변수의 IPC 소켓 파일 경로를 제공합니다.
+ `SVCUID` 및 `AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT` 환경 변수를 Greengrass nucleus가 구성 요소에 제공하는 값으로 설정합니다. 구성 요소는 이러한 환경 변수를 사용하여 Greengrass nucleus에 대한 연결을 인증합니다.

**Example 레시피 예제:에 MQTT 메시지 게시 AWS IoT Core (Python)**  
다음 레시피는 MQTT 메시지를 게시하는 예제 Docker 컨테이너 구성 요소를 정의합니다 AWS IoT Core. 이 레시피의 속성은 다음과 같습니다.  
+ 구성 요소가 모든 주제에 대해 MQTT 메시지를 AWS IoT Core 에 게시하도록 허용하는 권한 부여 정책(`accessControl`)입니다. 자세한 내용은 [구성 요소에 IPC 작업을 수행할 수 있는 권한 부여](interprocess-communication.md#ipc-authorization-policies) 및 [AWS IoT Core MQTT IPC 권한 부여](ipc-iot-core-mqtt.md#ipc-iot-core-mqtt-authorization)를 참조하세요.
+ Amazon S3에서 Docker 이미지를 TAR 아카이브로 지정하는 구성 요소 아티팩트입니다.
+ TAR 아카이브에서 Docker 이미지를 로드하는 수명 주기 설치 스크립트입니다.
+ 이미지에서 Docker 컨테이너를 실행하는 수명 주기 실행 스크립트입니다. [Docker 실행](https://docs.docker.com/engine/reference/run/) 명령에는 다음 인수가 있습니다.
  + `-v` 인수는 컨테이너에 Greengrass IPC 소켓을 탑재합니다.
  + 처음 두 `-e` 인수는 Docker 컨테이너에서 필요한 환경 변수를 설정합니다.
  + 추가 `-e` 인수는 이 예제에서 사용하는 환경 변수를 설정합니다.
  + `--rm` 인수는 컨테이너가 종료될 때 컨테이너를 정리합니다.

```
{
  "RecipeFormatVersion": "2020-01-25",
  "ComponentName": "com.example.python.docker.PublishToIoTCore",
  "ComponentVersion": "1.0.0",
  "ComponentDescription": "Uses interprocess communication to publish an MQTT message to IoT Core.",
  "ComponentPublisher": "Amazon",
  "ComponentConfiguration": {
    "DefaultConfiguration": {
      "topic": "test/topic/java",
      "message": "Hello, World!",
      "qos": "1",
      "accessControl": {
        "aws.greengrass.ipc.mqttproxy": {
          "com.example.python.docker.PublishToIoTCore:pubsub:1": {
            "policyDescription": "Allows access to publish to IoT Core on all topics.",
            "operations": [
              "aws.greengrass#PublishToIoTCore"
            ],
            "resources": [
              "*"
            ]
          }
        }
      }
    }
  },
  "Manifests": [
    {
      "Platform": {
        "os": "all"
      },
      "Lifecycle": {
        "install": "docker load -i {artifacts:path}/publish-to-iot-core.tar",
        "Run": "docker run -v $AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT:$AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT -e SVCUID -e AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT -e MQTT_TOPIC=\"{configuration:/topic}\" -e MQTT_MESSAGE=\"{configuration:/message}\" -e MQTT_QOS=\"{configuration:/qos}\" --rm publish-to-iot-core"
      },
      "Artifacts": [
        {
          "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.python.docker.PublishToIoTCore/1.0.0/publish-to-iot-core.tar"
        }
      ]
    }
  ]
}
```

```
RecipeFormatVersion: '2020-01-25'
ComponentName: com.example.python.docker.PublishToIoTCore
ComponentVersion: 1.0.0
ComponentDescription: Uses interprocess communication to publish an MQTT message to IoT Core.
ComponentPublisher: Amazon
ComponentConfiguration:
  DefaultConfiguration:
    topic: 'test/topic/java'
    message: 'Hello, World!'
    qos: '1'
    accessControl:
      aws.greengrass.ipc.mqttproxy:
        'com.example.python.docker.PublishToIoTCore:pubsub:1':
          policyDescription: Allows access to publish to IoT Core on all topics.
          operations:
            - 'aws.greengrass#PublishToIoTCore'
          resources:
            - '*'
Manifests:
  - Platform:
      os: all
    Lifecycle:
      install: 'docker load -i {artifacts:path}/publish-to-iot-core.tar'
      Run: |
        docker run \
          -v $AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT:$AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT \
          -e SVCUID \
          -e AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT \
          -e MQTT_TOPIC="{configuration:/topic}" \
          -e MQTT_MESSAGE="{configuration:/message}" \
          -e MQTT_QOS="{configuration:/qos}" \
          --rm publish-to-iot-core
    Artifacts:
      - URI: s3://amzn-s3-demo-bucket/artifacts/com.example.python.docker.PublishToIoTCore/1.0.0/publish-to-iot-core.tar
```

## Docker 컨테이너 구성 요소에서 AWS 자격 증명 사용(Linux)
<a name="docker-container-token-exchange-service"></a>

[토큰 교환 서비스 구성 요소를](token-exchange-service-component.md) 사용하여 Greengrass 구성 요소의 AWS 서비스와 상호 작용할 수 있습니다. 이 구성 요소는 로컬 컨테이너 서버를 사용하여 코어 디바이스의 [토큰 교환 역할](device-service-role.md)에서 AWS 자격 증명을 제공합니다. 자세한 내용은 [AWS 서비스와 상호 작용](interact-with-aws-services.md) 단원을 참조하십시오.

**참고**  
이 섹션의 예제는 Linux 코어 디바이스에서만 작동합니다.

Docker 컨테이너 구성 요소에서 토큰 교환 서비스의 AWS 자격 증명을 사용하려면 다음 파라미터와 함께 Docker 컨테이너를 실행해야 합니다.
+ `--network=host` 인수를 사용하여 호스트 네트워크에 대한 액세스를 제공합니다. 이 옵션을 사용하면 Docker 컨테이너가 로컬 토큰 교환 서비스에 연결하여 AWS 자격 증명을 검색할 수 있습니다. 이 인수는 Linux용 Docker에서만 작동합니다.
**주의**  <a name="docker-network-host-security-warning"></a>
이 옵션을 사용하면 컨테이너가 호스트의 모든 로컬 네트워크 인터페이스에 액세스할 수 있으므로 호스트 네트워크에 대한 액세스 권한 없이 Docker 컨테이너를 실행하는 경우보다 안전하지 않습니다. 이 옵션을 사용하는 Docker 컨테이너 구성 요소를 개발하고 실행할 때 이 점을 고려하세요. 자세한 내용은 *Docker 설명서*에서 [네트워크: 호스트](https://docs.docker.com/engine/reference/run/#network-host)를 참조하세요.
+ `AWS_CONTAINER_CREDENTIALS_FULL_URI` 및 `AWS_CONTAINER_AUTHORIZATION_TOKEN` 환경 변수를 Greengrass nucleus가 구성 요소에 제공하는 값으로 설정합니다. AWS SDKs 이러한 환경 변수를 사용하여 AWS 자격 증명을 검색합니다.

**Example 예제 레시피: Docker 컨테이너 구성 요소에 S3 버킷 나열(Python)**  
다음 레시피는 AWS 계정에 S3 버킷을 나열하는 예제 Docker 컨테이너 구성 요소를 정의합니다. 이 레시피의 속성은 다음과 같습니다.  
+ 종속성으로서의 토큰 교환 서비스 구성 요소입니다. 이 종속성을 사용하면 구성 요소가 자격 AWS 증명을 검색하여 다른 AWS 서비스와 상호 작용할 수 있습니다.
+ Amazon S3에서 Docker 이미지를 TAR 아카이브로 지정하는 구성 요소 아티팩트입니다.
+ TAR 아카이브에서 Docker 이미지를 로드하는 수명 주기 설치 스크립트입니다.
+ 이미지에서 Docker 컨테이너를 실행하는 수명 주기 실행 스크립트입니다. [Docker 실행](https://docs.docker.com/engine/reference/run/) 명령에는 다음 인수가 있습니다.
  + `--network=host` 인수는 컨테이너가 토큰 교환 서비스에 연결할 수 있도록 호스트 네트워크에 대한 컨테이너 액세스를 제공합니다.
  + `-e` 인수는 Docker 컨테이너에 필요한 환경 변수를 설정합니다.
  + `--rm` 인수는 컨테이너가 종료될 때 컨테이너를 정리합니다.

```
{
  "RecipeFormatVersion": "2020-01-25",
  "ComponentName": "com.example.python.docker.ListS3Buckets",
  "ComponentVersion": "1.0.0",
  "ComponentDescription": "Uses the token exchange service to lists your S3 buckets.",
  "ComponentPublisher": "Amazon",
  "ComponentDependencies": {
    "aws.greengrass.TokenExchangeService": {
      "VersionRequirement": "^2.0.0",
      "DependencyType": "HARD"
    }
  },
  "Manifests": [
    {
      "Platform": {
        "os": "linux"
      },
      "Lifecycle": {
        "install": "docker load -i {artifacts:path}/list-s3-buckets.tar",
        "Run": "docker run --network=host -e AWS_CONTAINER_AUTHORIZATION_TOKEN -e AWS_CONTAINER_CREDENTIALS_FULL_URI --rm list-s3-buckets"
      },
      "Artifacts": [
        {
          "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.python.docker.ListS3Buckets/1.0.0/list-s3-buckets.tar"
        }
      ]
    }
  ]
}
```

```
RecipeFormatVersion: '2020-01-25'
ComponentName: com.example.python.docker.ListS3Buckets
ComponentVersion: 1.0.0
ComponentDescription: Uses the token exchange service to lists your S3 buckets.
ComponentPublisher: Amazon
ComponentDependencies:
  aws.greengrass.TokenExchangeService:
    VersionRequirement: ^2.0.0
    DependencyType: HARD
Manifests:
  - Platform:
      os: linux
    Lifecycle:
      install: 'docker load -i {artifacts:path}/list-s3-buckets.tar'
      Run: |
        docker run \
          --network=host \
          -e AWS_CONTAINER_AUTHORIZATION_TOKEN \
          -e AWS_CONTAINER_CREDENTIALS_FULL_URI \
          --rm list-s3-buckets
    Artifacts:
      - URI: s3://amzn-s3-demo-bucket/artifacts/com.example.python.docker.ListS3Buckets/1.0.0/list-s3-buckets.tar
```

## Docker 컨테이너 구성 요소에서 스트림 관리자 사용(Linux)
<a name="docker-container-stream-manager"></a>

[스트림 관리자 구성 요소](stream-manager-component.md)를 사용하여 Greengrass 구성 요소의 데이터 스트림을 관리할 수 있습니다. 이 구성 요소를 사용하면 데이터 스트림을 처리하고 대용량 IoT 데이터를 로 전송할 수 있습니다 AWS 클라우드.는 스트림 관리자 구성 요소와 상호 작용하는 데 사용하는 스트림 관리자 SDK를 AWS IoT Greengrass 제공합니다. 자세한 내용은 [Greengrass 코어 디바이스에서 데이터 스트림 관리](manage-data-streams.md) 단원을 참조하십시오.

**참고**  
이 섹션의 예제는 Linux 코어 디바이스에서만 작동합니다.

Docker 컨테이너 구성 요소에서 스트림 관리자 SDK를 사용하려면 다음 파라미터를 사용하여 Docker 컨테이너를 실행해야 합니다.
+ `--network=host` 인수를 사용하여 호스트 네트워크에 대한 액세스를 제공합니다. 이 옵션을 사용하면 Docker 컨테이너가 로컬 TLS 연결을 통해 스트림 관리자 구성 요소와 상호 작용할 수 있습니다. 이 인수는 Linux용 Docker에서만 작동합니다.
**주의**  <a name="docker-network-host-security-warning"></a>
이 옵션을 사용하면 컨테이너가 호스트의 모든 로컬 네트워크 인터페이스에 액세스할 수 있으므로 호스트 네트워크에 대한 액세스 권한 없이 Docker 컨테이너를 실행하는 경우보다 안전하지 않습니다. 이 옵션을 사용하는 Docker 컨테이너 구성 요소를 개발하고 실행할 때 이 점을 고려하세요. 자세한 내용은 *Docker 설명서*에서 [네트워크: 호스트](https://docs.docker.com/engine/reference/run/#network-host)를 참조하세요.
+ 기본 동작인 인증을 요구하도록 스트림 관리자 구성 요소를 구성하는 경우에는 `AWS_CONTAINER_CREDENTIALS_FULL_URI` 환경 변수를 Greengrass nucleus가 구성 요소에 제공하는 값으로 설정합니다. 자세한 내용은 [스트림 관리자 구성](stream-manager-component.md#stream-manager-component-configuration)을 참조하세요.
+ 기본 포트가 아닌 포트를 사용하도록 스트림 관리자 구성 요소를 구성하는 경우 [프로세스 간 통신(IPC)](interprocess-communication.md)을 사용하여 스트림 관리자 구성 요소 구성에서 포트를 가져옵니다. IPC를 사용하려면 추가 옵션이 포함된 Docker 컨테이너를 실행해야 합니다. 자세한 내용은 다음을 참조하세요.
  + [애플리케이션 코드에서 스트림 관리자에 연결](use-stream-manager-in-custom-components.md#connect-to-stream-manager)
  + [Docker 컨테이너 구성 요소에서 프로세스 간 통신 사용](#docker-container-ipc)

**Example 예제 레시피: Docker 컨테이너 구성 요소의 S3 버킷으로 파일 스트리밍(Python)**  
다음 레시피는 파일을 생성하여 S3 버킷으로 스트리밍하는 예제 Docker 컨테이너 컴포넌트를 정의합니다. 이 레시피의 속성은 다음과 같습니다.  
+ 종속성으로서의 스트림 관리자 구성 요소. 이러한 종속성을 통해 구성 요소는 스트림 관리자 SDK를 사용하여 스트림 관리자 구성 요소와 상호 작용할 수 있습니다.
+ Amazon S3에서 Docker 이미지를 TAR 아카이브로 지정하는 구성 요소 아티팩트입니다.
+ TAR 아카이브에서 Docker 이미지를 로드하는 수명 주기 설치 스크립트입니다.
+ 이미지에서 Docker 컨테이너를 실행하는 수명 주기 실행 스크립트입니다. [Docker 실행](https://docs.docker.com/engine/reference/run/) 명령에는 다음 인수가 있습니다.
  + `--network=host` 인수는 컨테이너가 스트림 관리자 구성 요소에 연결할 수 있도록 호스트 네트워크에 대한 컨테이너 액세스를 제공합니다.
  + 첫 번째 `-e` 인수는 Docker 컨테이너에서 필요한 `AWS_CONTAINER_AUTHORIZATION_TOKEN` 환경 변수를 설정합니다.
  + 추가 `-e` 인수는 이 예제에서 사용하는 환경 변수를 설정합니다.
  + `-v` 인수는 컨테이너에 구성 요소의 [작업 폴더](component-recipe-reference.md#component-recipe-work-path)를 탑재합니다. 이 예제에서는 작업 폴더에 파일을 생성하고 스트림 관리자를 사용하여 해당 파일을 Amazon S3에 업로드합니다.
  + `--rm` 인수는 컨테이너가 종료될 때 컨테이너를 정리합니다.

```
{
  "RecipeFormatVersion": "2020-01-25",
  "ComponentName": "com.example.python.docker.StreamFileToS3",
  "ComponentVersion": "1.0.0",
  "ComponentDescription": "Creates a text file and uses stream manager to stream the file to S3.",
  "ComponentPublisher": "Amazon",
  "ComponentDependencies": {
    "aws.greengrass.StreamManager": {
      "VersionRequirement": "^2.0.0",
      "DependencyType": "HARD"
    }
  },
  "ComponentConfiguration": {
    "DefaultConfiguration": {
      "bucketName": ""
    }
  },
  "Manifests": [
    {
      "Platform": {
        "os": "linux"
      },
      "Lifecycle": {
        "install": "docker load -i {artifacts:path}/stream-file-to-s3.tar",
        "Run": "docker run --network=host -e AWS_CONTAINER_AUTHORIZATION_TOKEN -e BUCKET_NAME=\"{configuration:/bucketName}\" -e WORK_PATH=\"{work:path}\" -v {work:path}:{work:path} --rm stream-file-to-s3"
      },
      "Artifacts": [
        {
          "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.python.docker.StreamFileToS3/1.0.0/stream-file-to-s3.tar"
        }
      ]
    }
  ]
}
```

```
RecipeFormatVersion: '2020-01-25'
ComponentName: com.example.python.docker.StreamFileToS3
ComponentVersion: 1.0.0
ComponentDescription: Creates a text file and uses stream manager to stream the file to S3.
ComponentPublisher: Amazon
ComponentDependencies:
  aws.greengrass.StreamManager:
    VersionRequirement: ^2.0.0
    DependencyType: HARD
ComponentConfiguration:
  DefaultConfiguration:
    bucketName: ''
Manifests:
  - Platform:
      os: linux
    Lifecycle:
      install: 'docker load -i {artifacts:path}/stream-file-to-s3.tar'
      Run: |
        docker run \
          --network=host \
          -e AWS_CONTAINER_AUTHORIZATION_TOKEN \
          -e BUCKET_NAME="{configuration:/bucketName}" \
          -e WORK_PATH="{work:path}" \
          -v {work:path}:{work:path} \
          --rm stream-file-to-s3
    Artifacts:
      - URI: s3://amzn-s3-demo-bucket/artifacts/com.example.python.docker.StreamFileToS3/1.0.0/stream-file-to-s3.tar
```

# AWS IoT Greengrass 구성 요소 레시피 참조
<a name="component-recipe-reference"></a>

구성 요소 레시피는 구성 요소의 세부 정보, 종속성, 아티팩트 및 수명 주기가 정의되는 파일입니다. 예를 들어 구성 요소 *수명 주기*에서는 실행하여 구성 요소를 설치, 실행 및 종료하는 명령이 지정됩니다. AWS IoT Greengrass 코어는 레시피에서 정의한 수명 주기를 사용하여 구성 요소를 설치하고 실행합니다. 이 AWS IoT Greengrass 서비스는 구성 요소를 배포할 때 레시피를 사용하여 코어 디바이스에 배포할 종속성과 아티팩트를 식별합니다.

구성 요소에서 지원하는 각 플랫폼의 고유한 종속성과 수명 주기를 레시피에서 정의할 수 있습니다. 이 기능을 사용하여 요구 사항이 다른 여러 플랫폼이 있는 디바이스에 구성 요소를 배포할 수 있습니다. 이를 사용하여 AWS IoT Greengrass 가 이를 지원하지 않는 디바이스에 구성 요소를 설치하지 못하도록 할 수도 있습니다.

레시피마다 *매니페스트* 목록이 있습니다. 각 매니페스트에서는 플랫폼 요구 사항 세트와 플랫폼에서 해당 요구 사항을 충족하는 코어 디바이스에 사용할 수명 주기 및 아티팩트가 지정됩니다. 코어 디바이스에서는 디바이스에서 충족되는 플랫폼 요구 사항이 있는 첫 번째 매니페스트가 사용됩니다. 코어 디바이스와 일치하도록 플랫폼 요구 사항이 없는 매니페스트를 지정합니다.

매니페스트에 없는 글로벌 수명 주기를 지정할 수도 있습니다. 글로벌 수명 주기에서는 수명 주기의 하위 섹션을 식별하는 *선택 키*를 사용할 수 있습니다. 그런 다음에 매니페스트 내에서 이러한 선택 키를 지정하여 매니페스트의 수명 주기 외에 글로벌 수명 주기의 해당 섹션도 사용할 수 있습니다. 코어 디바이스에서는 매니페스트에서 수명 주기가 정의되지 않는 경우에만 매니페스트의 선택 키가 사용됩니다. 선택 키가 없는 글로벌 수명 주기의 섹션과 일치하도록 매니페스트의 `all` 선택을 사용할 수 있습니다.

 AWS IoT Greengrass 코어 소프트웨어가 코어 디바이스와 일치하는 매니페스트를 선택하면 다음을 수행하여 사용할 수명 주기 단계를 식별합니다.
+ 선택된 매니페스트에서 수명 주기가 정의되면 코어 디바이스에서는 해당 수명 주기가 사용됩니다.
+ 선택된 매니페스트에서 수명 주기가 정의되지 않으면 코어 디바이스에서는 글로벌 수명 주기가 사용됩니다. 코어 디바이스에서는 다음이 수행되어 글로벌 수명 주기 중 사용할 섹션이 식별됩니다.
  + 매니페스트에서 선택 키가 정의되면 코어 디바이스에서는 매니페스트의 선택 키가 있는 글로벌 수명 주기의 섹션이 사용됩니다.
  + 매니페스트에서 선택 키가 정의되지 않으면 코어 디바이스에서는 선택 키가 없는 글로벌 수명 주기의 섹션이 사용됩니다. 이 동작은 `all` 선택이 정의되는 매니페스트와 동일합니다.

**중요**  <a name="recipe-core-device-manifest-requirement"></a>
구성 요소를 설치하려면 코어 디바이스가 매니페스트의 플랫폼 요구 사항 하나 이상과 일치해야 합니다. 코어 디바이스와 일치하는 매니페스트가 없으면 AWS IoT Greengrass 코어 소프트웨어가 구성 요소를 설치하지 않고 배포가 실패합니다.

레시피를 [JSON](https://en.wikipedia.org/wiki/JSON) 또는 [YAML](https://en.wikipedia.org/wiki/YAML) 형식으로 정의할 수 있습니다. 레시피 예제 섹션에는 각 형식의 레시피가 포함되어 있습니다.

**Topics**
+ [레시피 검증](#recipe-validation)
+ [레시피 형식](#recipe-format)
+ [레시피 변수](#recipe-variables)
+ [레시피 예제](#recipe-examples)

## 레시피 검증
<a name="recipe-validation"></a>

Greengrass에서는 구성 요소 버전 생성 시 JSON 또는 YAML 구성 요소 레시피가 검증됩니다. 이 레시피 검증에서는 잠재적인 배포 문제가 방지되도록 JSON 또는 YAML 구성 요소 레시피의 일반적인 오류가 확인됩니다. 검증에서는 레시피의 일반적인 오류(예: 쉼표, 중괄호 및 필드 누락)가 확인되고, 레시피가 제대로 구성되었는지 확인됩니다.

레시피 검증 오류 메시지가 표시되면 레시피에 누락된 쉼표, 중괄호 또는 필드가 있는지 확인합니다. [레시피 형식](#recipe-format)을 조사하여 누락된 필드가 없는지 확인합니다.

## 레시피 형식
<a name="recipe-format"></a>

구성 요소에 대한 레시피를 정의할 때 레시피 문서에서 다음 정보를 지정합니다. 동일한 구조가 YAML 및 JSON 형식의 레시피에 적용됩니다.

`RecipeFormatVersion`  
레시피의 템플릿 버전입니다. 다음 옵션을 선택합니다.  
+ `2020-01-25`

`ComponentName`  
이 레시피에서 정의되는 구성 요소의 이름입니다. 구성 요소 이름은 각 리전의 AWS 계정 에서 고유해야 합니다.  
**팁**  
+ 회사 내에서 이름 충돌을 방지하려면 역 도메인 이름 형식을 사용합니다. 예를 들어 회사에서 `example.com`을 소유하고 태양 에너지 프로젝트를 수행하는 경우 Hello World 구성 요소의 이름을 `com.example.solar.HelloWorld`로 지정할 수 있습니다. 그러면 회사 내 구성 요소 이름 충돌을 방지하는 데 도움이 됩니다.
+ 구성 요소 이름에서 `aws.greengrass` 접두사는 피합니다. AWS IoT Greengrass 에서 제공되는 [퍼블릭 구성 요소에](public-components.md) 이 접두사가 사용됩니다. 퍼블릭 구성 요소와 동일한 이름을 선택하면 사용자가 선택한 구성 요소로 해당 구성 요소가 바뀝니다. 그런 다음는 해당 퍼블릭 구성 요소에 종속된 구성 요소를 배포할 때 퍼블릭 구성 요소 대신 구성 요소를 AWS IoT Greengrass 제공합니다. 이 기능을 사용하면 퍼블릭 구성 요소의 동작을 재정의할 수 있지만, 퍼블릭 구성 요소를 재정의하지 않으려는 경우 다른 구성 요소가 중단될 수도 있습니다.

`ComponentVersion`  
구성 요소의 버전입니다. 메이저, 마이너 및 패치 값의 최대값은 999,999입니다.  
<a name="semver-para"></a>AWS IoT Greengrass 는 구성 요소에 의미 체계 버전을 사용합니다. *시맨틱 버전은 메이저*.*마이너*.*패치* 번호 시스템을 따릅니다. 예를 들어 `1.0.0` 버전은 구성 요소의 첫 번째 주요 릴리스를 나타냅니다. 자세한 내용은 [의미 체계 버전 사양](https://semver.org/)을 참조하세요.

`ComponentDescription`  
(선택 사항) 구성 요소의 설명입니다.

`ComponentPublisher`  
구성 요소의 게시자 또는 작성자입니다.

`ComponentConfiguration`  
(선택 사항) 구성 요소의 구성 또는 파라미터가 정의되는 객체입니다. 기본 구성을 정의한 다음에 구성 요소를 배포할 때 구성 요소에 제공할 구성 객체를 지정할 수 있습니다. 구성 요소 구성에서는 중첩된 파라미터와 구조가 지원됩니다. 이 객체에는 다음 정보가 포함되어 있어야 합니다.    
`DefaultConfiguration`  
구성 요소의 기본 구성이 정의되는 객체입니다. 이 객체의 구조를 정의합니다.  
<a name="configuration-value-type-note"></a>AWS IoT Greengrass 는 구성 값에 JSON을 사용합니다. JSON에서는 숫자 유형이 지정되지만, 정수와 부동 소수점은 구분되지 않습니다. 따라서 구성 값은 AWS IoT Greengrass에서 부동 소수점으로 변환될 수 있습니다. 구성 요소에서 올바른 데이터 유형이 사용되도록 하려면 숫자 구성 값을 문자열로 정의하는 것이 좋습니다. 그런 다음에 구성 요소에서 이를 정수 또는 부동 소수점으로 구문 분석하도록 합니다. 이렇게 하면 구성 값이 구성과 코어 디바이스에서 동일한 유형이 됩니다.

`ComponentDependencies`  <a name="recipe-reference-component-dependencies"></a>
(선택 사항) 구성 요소에 대한 구성 요소 종속성이 각각 정의되는 객체의 사전입니다. 각 객체의 키는 구성 요소 종속성의 이름을 식별합니다. AWS IoT Greengrass 는 구성 요소가 구성 요소를 시작하기 전에 종속성이 시작되도록 installs. AWS IoT Greengrass waits할 때 구성 요소 종속성을 설치합니다. 각 객체에는 다음 정보가 포함되어 있습니다.    
`VersionRequirement`  
이 종속성에 대해 호환되는 구성 요소 버전이 정의되는 npm-style 스타일 의미 체계 버전 제약 조건입니다. 버전 또는 버전 범위를 지정할 수 있습니다. 자세한 내용은 [npm 의미 체계 버전 계산기](https://semver.npmjs.com/)를 참조하세요.  
`DependencyType`  
(선택 사항) 이 종속성의 유형입니다. 다음 옵션 중 하나를 선택합니다.  
+ `SOFT` – 종속성 상태가 변경되면 구성 요소가 다시 시작되지 않습니다.
+ `HARD` – 종속성 상태가 변경되면 구성 요소가 다시 시작됩니다.
기본값은 `HARD`입니다.

`ComponentType`  
(선택 사항) 구성 요소의 유형입니다.  
구성 요소를 생성할 때 recipe. AWS IoT Greengrass sets에서 구성 요소 유형을 지정하지 않는 것이 좋습니다.
유형은 다음 중 하나일 수 있습니다.  
+ `aws.greengrass.generic` - 구성 요소에서 명령을 실행되거나 아티팩트가 제공됩니다.
+ `aws.greengrass.lambda` – 구성 요소에서 [Lambda 런처 구성 요소](lambda-launcher-component.md)를 통해 Lambda 함수가 실행됩니다. `ComponentSource` 파라미터에서는 이 구성 요소에서 실행되는 Lambda 함수의 ARN이 지정됩니다.

  이 옵션은 Lambda 함수에서 구성 요소를 생성할 AWS IoT Greengrass 때에서 설정하므로 사용하지 않는 것이 좋습니다. 자세한 내용은 [AWS Lambda 함수 실행](run-lambda-functions.md) 단원을 참조하십시오.
+ `aws.greengrass.plugin` – Greengrass nucleus와 동일한 Java 가상 머신(JVM)에서 이 구성 요소가 실행됩니다. 플러그인 구성 요소를 배포하거나 다시 시작하면 Greengrass nucleus가 다시 시작됩니다.

  플러그인 구성 요소에서는 Greengrass nucleus와 동일한 로그 파일이 사용됩니다. 자세한 내용은 [AWS IoT Greengrass 로그 모니터링](monitor-logs.md) 단원을 참조하십시오.

  구성 요소 레시피에는이 옵션을 사용하지 않는 것이 좋습니다. Greengrass nucleus와 직접 인터페이스하는 Java로 작성된 AWS제공 구성 요소를 위한 것이기 때문입니다. 플러그인인 구성 요소에 대한 자세한 내용은 [AWS 제공 구성 요소](public-components.md) 섹션을 참조하세요.
+ `aws.greengrass.nucleus` - nucleus 구성 요소입니다. 자세한 내용은 [Greengrass nucleus](greengrass-nucleus-component.md) 단원을 참조하십시오.

  구성 요소 레시피에서는 이 옵션을 사용하지 않는 것이 좋습니다. 이는 AWS IoT Greengrass 코어 소프트웨어의 최소 기능이 제공되는 Greengrass nucleus 구성 요소용 옵션입니다.
기본값은 레시피에서 구성 요소를 생성할 때는 `aws.greengrass.generic`이고, Lambda 함수에서 구성 요소를 생성할 때는 `aws.greengrass.lambda`입니다.  
자세한 내용은 [구성 요소 유형](develop-greengrass-components.md#component-types) 단원을 참조하십시오.

`ComponentSource`  
(선택 사항) 구성 요소에서 실행되는 Lambda 함수의 ARN입니다.  
Lambda 함수에서 구성 요소를 생성할 때 recipe. AWS IoT Greengrass sets에서 구성 요소 소스를 지정하지 않는 것이 좋습니다. 자세한 내용은 [AWS Lambda 함수 실행](run-lambda-functions.md) 단원을 참조하십시오.

  `Manifests`   
각각 구성 요소의 수명 주기, 파라미터 및 플랫폼 요구 사항이 정의되는 객체 목록입니다. 코어 디바이스가 여러 매니페스트의 플랫폼 요구 사항과 일치하는 경우는 코어 디바이스가 일치하는 첫 번째 매니페스트를 AWS IoT Greengrass 사용합니다. 코어 디바이스가 올바른 매니페스트를 사용하도록 하려면 더 엄격한 먼저 플랫폼 요구 사항으로 매니페스트를 정의합니다. 모든 플랫폼에 적용되는 매니페스트는 목록의 마지막 매니페스트여야 합니다.  
구성 요소를 설치하려면 코어 디바이스가 매니페스트의 플랫폼 요구 사항 하나 이상과 일치해야 합니다. 코어 디바이스와 일치하는 매니페스트가 없으면 AWS IoT Greengrass 코어 소프트웨어가 구성 요소를 설치하지 않고 배포가 실패합니다.
각 객체에는 다음 정보가 포함되어 있습니다.    
`Name`  
(선택 사항) 이 매니페스트에서 정의되는 플랫폼의 친숙한 이름입니다.  
이 파라미터를 생략하면가 플랫폼 `os` 및에서 이름을 AWS IoT Greengrass 생성합니다`architecture`.  
  `Platform`   
(선택 사항) 이 매니페스트가 적용되는 플랫폼이 정의되는 객체입니다. 모든 플랫폼에 적용되는 매니페스트를 정의하려면 이 파라미터를 생략합니다.  
이 객체에서는 코어 디바이스가 실행되는 플랫폼에 대한 키-값 페어가 지정됩니다. 이 구성 요소를 배포하면 AWS IoT Greengrass 코어 소프트웨어는 이러한 키-값 페어를 코어 디바이스의 플랫폼 속성과 비교합니다. AWS IoT Greengrass 코어 소프트웨어는 항상 `os` 및를 정의`architecture`하며 추가 속성을 정의할 수 있습니다. Greengrass nucleus 구성요소를 배포할 때 코어 디바이스에 대한 사용자 지정 플랫폼 속성을 지정할 수 있습니다. 자세한 내용은 [Greengrass nucleus 구성 요소](greengrass-nucleus-component.md)의 [플랫폼 재정의 파라미터](greengrass-nucleus-component.md#greengrass-nucleus-component-configuration-platform-overrides)를 참조하세요.  
키-값 페어마다 다음 값 중 하나를 지정할 수 있습니다.  
+ 정확한 값(`linux` 또는 `windows`). 각 값은 글자 또는 숫자로 시작해야 합니다.
+ 모든 값과 일치하는 `*`. 값이 없는 경우에도 일치합니다.
+ Java 스타일 정규식(예: `/windows|linux/`). 정규식은 슬래시 문자(`/`)로 시작하고 끝나야 합니다. 예를 들어 `/.+/` 정규식은 비어 있지 않은 값과 일치합니다.
이 객체에는 다음 정보가 포함되어 있어야 합니다.    
`runtime`  
이 매니페스트가 지원하는 플랫폼용 [Greengrass nucleus 런타임](https://docs.aws.amazon.com/greengrass/v2/developerguide/how-it-works.html#concept-overview)입니다. 플랫폼 `runtime`을 이용해 여러 매니페스트를 정의할 때 레시피에서 지원되는 런타임 값은 `aws_nucleus_lite` 및 `*`뿐입니다. 클래식 디바이스를 대상으로 할 경우, 레시피에서 런타임 필드를 지정해서는 안 됩니다. 지원되는 Greengrass Nucleus 런타임에는 다음 값이 포함됩니다.  
+ `*`
+ `aws_nucleus_lite`  
`os`  
(선택 사항) 이 매니페스트에서 지원되는 플랫폼의 운영 체제 이름입니다. 공통 플랫폼에는 다음 값이 포함되어 있습니다.  
+ `linux`
+ `windows`
+ `darwin`(macOS)  
`architecture`  
(선택 사항) 이 매니페스트에서 지원되는 플랫폼의 프로세서 아키텍처입니다. 공통 아키텍처에는 다음 값이 포함되어 있습니다.  
+ `amd64`
+ `arm`
+ `aarch64`
+ `x86`  
`architecture.detail`  
(선택 사항) 이 매니페스트에서 지원되는 플랫폼의 프로세서 아키텍처 세부 정보입니다. 공통 아키텍처 세부 정보에는 다음 값이 포함되어 있습니다.  
+ `arm61`
+ `arm71`
+ `arm81`  
`key`  
(선택 사항) 이 매니페스트에 대해 정의하는 플랫폼 속성입니다. 플랫폼 속성의 이름으로 *키*를 바꿉니다. AWS IoT Greengrass 코어 소프트웨어는이 플랫폼 속성을 Greengrass nucleus 구성 요소 구성에서 지정한 키-값 페어와 일치시킵니다. 자세한 내용은 [Greengrass nucleus 구성 요소](greengrass-nucleus-component.md)의 [플랫폼 재정의 파라미터](greengrass-nucleus-component.md#greengrass-nucleus-component-configuration-platform-overrides)를 참조하세요.  
회사 내에서 이름 충돌을 방지하려면 역 도메인 이름 형식을 사용합니다. 예를 들어 회사에서 `example.com`을 소유하고 라디오 프로젝트에 착수한다면 사용자 지정 플랫폼 속성 `com.example.radio.RadioModule`의 이름을 지정할 수 있습니다. 그러면 회사 내 플랫폼 속성 이름 충돌을 방지하는 데 도움이 됩니다.
예를 들어 플랫폼 속성(`com.example.radio.RadioModule`)을 정의하여 코어 디바이스에서 사용할 수 있는 라디오 모듈에 따라 상이한 매니페스트를 지정할 수 있습니다. 각 매니페스트에는 상이한 하드웨어 구성에 적용되는 상이한 아티팩트가 포함될 수 있으므로 최소 소프트웨어 세트를 코어 디바이스에 배포할 수 있습니다.  
  `Lifecycle`   
이 매니페스트에서 정의되는 플랫폼에서 구성 요소가 설치되고 실행되는 방법이 정의되는 객체 또는 문자열입니다. 모든 플랫폼에 적용되는 [글로벌 수명 주기](#global-lifecycle-definition)를 정의할 수도 있습니다. 코어 디바이스에서는 사용되는 매니페스트에서 수명 주기가 지정되지 않는 경우에만 글로벌 수명 주기가 사용됩니다.  
매니페스트 내에 이 수명 주기를 정의합니다. 여기에서 지정하는 수명 주기 단계는 매니페스트에서 정의되는 플랫폼에만 적용됩니다. 모든 플랫폼에 적용되는 [글로벌 수명 주기](#global-lifecycle-definition)를 정의할 수도 있습니다.
다음 정보가 이 객체 또는 문자열에 있습니다.    
  `Setenv`   
(선택 사항) 모든 수명 주기 스크립트에 제공되는 환경 변수의 사전입니다. 각 수명 주기 스크립트에서 `Setenv`로 이러한 환경 변수를 재정의할 수 있습니다.  
  `install`   
(선택 사항) 구성 요소가 설치될 때 실행되는 스크립트가 정의되는 객체 또는 문자열입니다. AWS IoT Greengrass 코어 소프트웨어는 소프트웨어가 시작될 때마다이 수명 주기 단계도 실행합니다.  
`install` 스크립트가 성공 코드로 종료되면 구성 요소가 `INSTALLED` 상태로 전환됩니다.  
다음 정보가 이 객체 또는 문자열에 있습니다.    
`Script`  <a name="recipe-lifecycle-script"></a>
실행할 스크립트입니다.  
`RequiresPrivilege`  <a name="recipe-lifecycle-requiresprivilege"></a>
(선택 사항) 루트 권한으로 스크립트를 실행할 수 있습니다. 이 옵션을 로 설정하면 `true` AWS IoT Greengrass 코어 소프트웨어가이 구성 요소를 실행하도록 구성한 시스템 사용자 대신이 수명 주기 스크립트를 루트로 실행합니다. 기본값은 `false`입니다.  
`Skipif`  <a name="recipe-lifecycle-skipif"></a>
(선택 사항) 스크립트 실행 여부가 결정되는 확인입니다. 실행 파일이 경로에 있는지 또는 파일이 있는지 확인되도록 정의할 수 있습니다. 출력이 true인 경우 AWS IoT Greengrass 코어 소프트웨어는 단계를 건너뜁니다. 다음 확인 사항 중 하나를 선택합니다.  
+ `onpath runnable` - 시스템 경로에 실행 가능이 있는지 확인합니다. 예를 들어, Python 3를 사용할 수 있으면 **onpath python3**를 사용하여 이 수명 주기 단계를 건너뜁니다.
+ `exists file` – 파일이 있는지 확인합니다. 예를 들어, `/tmp/my-configuration.db`가 있으면 **exists /tmp/my-configuration.db**를 사용하여 이 수명 주기 단계를 건너뜁니다.  
`Timeout`  <a name="recipe-lifecycle-timeout"></a>
(선택 사항) AWS IoT Greengrass 코어 소프트웨어에서 프로세스가 종료되기 전에 스크립트가 실행될 수 있는 최대 시간(초)입니다.  
기본값: 120초  
`Setenv`  <a name="recipe-lifecycle-environment"></a>
(선택 사항) 스크립트에 제공되는 환경 변수의 사전입니다. `Lifecycle.Setenv`에서 제공하는 변수가 이러한 환경 변수를 통해 재정의됩니다.  
  `run`   
(선택 사항) 구성 요소가 시작될 때 실행되는 스크립트가 정의되는 객체 또는 문자열입니다.  
이 수명 주기 단계가 실행되면 구성 요소가 `RUNNING` 상태로 전환됩니다. `run` 스크립트가 성공 코드로 종료되면 구성 요소가 `STOPPING` 상태로 전환됩니다. `shutdown` 스크립트가 지정되면 실행됩니다. 그렇지 않으면 구성 요소가 `FINISHED` 상태로 전환됩니다.  
이 구성 요소에 종속되는 구성 요소는 이 수명 주기 단계가 실행될 때 시작됩니다. 종속된 구성 요소에서 사용되는 서비스와 같은 백그라운드 프로세스를 실행하려면 그 대신에 `startup` 수명 주기 단계를 사용합니다.  
수명 주기가 `run`인 구성 요소를 배포하면 이 수명 주기 스크립트가 실행되는 즉시 코어 디바이스에서 배포가 완료로 보고될 수 있습니다. 따라서 `run` 수명 주기 스크립트가 실행 직후 실패하더라도 배포를 완료되고 성공할 수 있습니다. 구성 요소의 시작 스크립트 결과에 배포 상태를 종속시키려면 그 대신에 `startup` 수명 주기 단계를 사용합니다.  
하나의 `startup` 또는 `run` 수명 주기만 정의할 수 있습니다.
다음 정보가 이 객체 또는 문자열에 있습니다.    
`Script`  <a name="recipe-lifecycle-script"></a>
실행할 스크립트입니다.  
`RequiresPrivilege`  <a name="recipe-lifecycle-requiresprivilege"></a>
(선택 사항) 루트 권한으로 스크립트를 실행할 수 있습니다. 이 옵션을 로 설정하면 `true` AWS IoT Greengrass 코어 소프트웨어가이 구성 요소를 실행하도록 구성한 시스템 사용자 대신이 수명 주기 스크립트를 루트로 실행합니다. 기본값은 `false`입니다.  
`Skipif`  <a name="recipe-lifecycle-skipif"></a>
(선택 사항) 스크립트 실행 여부가 결정되는 확인입니다. 실행 파일이 경로에 있는지 또는 파일이 있는지 확인되도록 정의할 수 있습니다. 출력이 true라면 AWS IoT Greengrass 코어 소프트웨어에서는 단계를 건너뜁니다. 다음 확인 사항 중 하나를 선택합니다.  
+ `onpath runnable` - 시스템 경로에 실행 가능이 있는지 확인합니다. 예를 들어, Python 3를 사용할 수 있으면 **onpath python3**를 사용하여 이 수명 주기 단계를 건너뜁니다.
+ `exists file` – 파일이 있는지 확인합니다. 예를 들어, `/tmp/my-configuration.db`가 있으면 **exists /tmp/my-configuration.db**를 사용하여 이 수명 주기 단계를 건너뜁니다.  
`Timeout`  <a name="recipe-lifecycle-timeout"></a>
(선택 사항) AWS IoT Greengrass 코어 소프트웨어가 프로세스를 종료하기 전에 스크립트가 실행할 수 있는 초 단위의 최대 시간입니다.  
이 수명 주기 단계에는 기본적으로 제한 시간이 없습니다. 이 제한 시간을 생략하면 종료될 때까지 `run` 스크립트가 실행됩니다.  
`Setenv`  <a name="recipe-lifecycle-environment"></a>
(선택 사항) 스크립트에 제공되는 환경 변수의 사전입니다. `Lifecycle.Setenv`에서 제공하는 변수가 이러한 환경 변수를 통해 재정의됩니다.  
  `startup`   
(선택 사항) 구성 요소가 시작될 때 실행되는 백그라운드 프로세스가 정의되는 객체 또는 문자열입니다.  
종속된 구성 요소가 시작될 수 있으려면 성공적으로 종료되거나 구성 요소의 상태가 `RUNNING`으로 업데이트되어야 하는 명령을 실행하려면 `startup`을 사용합니다. 종료되지 않는 스크립트가 구성 요소에서 시작될 때 구성 요소의 상태를 `RUNNING` 또는 `ERRORED`로 설정하려면 [UpdateState](ipc-component-lifecycle.md#ipc-operation-updatestate) IPC 작업을 사용합니다. 예를 들어 `/etc/init.d/mysqld start`로 MySQL 프로세스를 시작하는 `startup` 단계를 정의할 수 있습니다.  
이 수명 주기 단계가 실행되면 구성 요소가 `STARTING` 상태로 전환됩니다. `startup` 스크립트가 성공 코드로 종료되면 구성 요소가 `RUNNING` 상태로 전환됩니다. 그러면 종속된 구성 요소가 시작될 수 있습니다.  
수명 주기가 `startup`인 구성 요소를 배포하면 이 수명 주기 스크립트가 종료되거나 상태가 보고된 후 코어 디바이스에서 배포가 완료로 보고될 수 있습니다. 즉, 배포의 상태는 모든 구성 요소의 시작 스크립트가 종료되거나 상태가 보고될 때까지 `IN_PROGRESS`입니다.  
하나의 `startup` 또는 `run` 수명 주기만 정의할 수 있습니다.
다음 정보가 이 객체 또는 문자열에 있습니다.    
`Script`  <a name="recipe-lifecycle-script"></a>
실행할 스크립트입니다.  
`RequiresPrivilege`  <a name="recipe-lifecycle-requiresprivilege"></a>
(선택 사항) 루트 권한으로 스크립트를 실행할 수 있습니다. 이 옵션을 로 설정하면 `true` AWS IoT Greengrass 코어 소프트웨어가이 구성 요소를 실행하도록 구성한 시스템 사용자 대신이 수명 주기 스크립트를 루트로 실행합니다. 기본값은 `false`입니다.  
`Skipif`  <a name="recipe-lifecycle-skipif"></a>
(선택 사항) 스크립트 실행 여부가 결정되는 확인입니다. 실행 파일이 경로에 있는지 또는 파일이 있는지 확인되도록 정의할 수 있습니다. 출력이 true라면 AWS IoT Greengrass 코어 소프트웨어에서는 단계를 건너뜁니다. 다음 확인 사항 중 하나를 선택합니다.  
+ `onpath runnable` - 시스템 경로에 실행 가능이 있는지 확인합니다. 예를 들어, Python 3를 사용할 수 있으면 **onpath python3**를 사용하여 이 수명 주기 단계를 건너뜁니다.
+ `exists file` – 파일이 있는지 확인합니다. 예를 들어, `/tmp/my-configuration.db`가 있으면 **exists /tmp/my-configuration.db**를 사용하여 이 수명 주기 단계를 건너뜁니다.  
`Timeout`  <a name="recipe-lifecycle-timeout"></a>
(선택 사항) AWS IoT Greengrass 코어 소프트웨어에서 프로세스가 종료되기 전에 스크립트가 실행될 수 있는 최대 시간(초)입니다.  
기본값: 120초  
`Setenv`  <a name="recipe-lifecycle-environment"></a>
(선택 사항) 스크립트에 제공되는 환경 변수의 사전입니다. `Lifecycle.Setenv`에서 제공하는 변수가 이러한 환경 변수를 통해 재정의됩니다.  
  `shutdown`   
(선택 사항) 구성 요소가 종료될 때 실행되는 스크립트가 정의되는 객체 또는 문자열입니다. 종료 수명 주기를 사용하여 구성 요소가 `STOPPING` 상태에 있을 때 실행하려는 코드를 실행합니다. 종료 수명 주기는 `startup` 또는 `run` 스크립트에서 시작된 프로세스를 중지하는 데 사용할 수 있습니다.  
`startup`에서 백그라운드 프로세스를 시작하는 경우 구성 요소가 종료될 때 `shutdown` 단계를 사용하여 해당 프로세스를 중지합니다. 예를 들어 `/etc/init.d/mysqld stop`로 MySQL 프로세스를 중지하는 `shutdown` 단계를 정의할 수 있습니다.  
`shutdown` 스크립트는 구성 요소가 `STOPPING` 상태로 전환된 된 후 실행됩니다. 스크립트가 완료되면 구성 요소가 `FINISHED` 상태로 전환됩니다.  
다음 정보가 이 객체 또는 문자열에 있습니다.    
`Script`  <a name="recipe-lifecycle-script"></a>
실행할 스크립트입니다.  
`RequiresPrivilege`  <a name="recipe-lifecycle-requiresprivilege"></a>
(선택 사항) 루트 권한으로 스크립트를 실행할 수 있습니다. 이 옵션을 로 설정하면 `true` AWS IoT Greengrass 코어 소프트웨어가이 구성 요소를 실행하도록 구성한 시스템 사용자 대신이 수명 주기 스크립트를 루트로 실행합니다. 기본값은 `false`입니다.  
`Skipif`  <a name="recipe-lifecycle-skipif"></a>
(선택 사항) 스크립트 실행 여부가 결정되는 확인입니다. 실행 파일이 경로에 있는지 또는 파일이 있는지 확인되도록 정의할 수 있습니다. 출력이 true라면 AWS IoT Greengrass 코어 소프트웨어에서는 단계를 건너뜁니다. 다음 확인 사항 중 하나를 선택합니다.  
+ `onpath runnable` - 시스템 경로에 실행 가능이 있는지 확인합니다. 예를 들어, Python 3를 사용할 수 있으면 **onpath python3**를 사용하여 이 수명 주기 단계를 건너뜁니다.
+ `exists file` – 파일이 있는지 확인합니다. 예를 들어, `/tmp/my-configuration.db`가 있으면 **exists /tmp/my-configuration.db**를 사용하여 이 수명 주기 단계를 건너뜁니다.  
`Timeout`  
(선택 사항) AWS IoT Greengrass 코어 소프트웨어가 프로세스를 종료하기 전에 스크립트가 실행할 수 있는 초 단위의 최대 시간입니다.  
기본값: 15초  
`Setenv`  <a name="recipe-lifecycle-environment"></a>
(선택 사항) 스크립트에 제공되는 환경 변수의 사전입니다. `Lifecycle.Setenv`에서 제공하는 변수가 이러한 환경 변수를 통해 재정의됩니다.  
  `recover`   
(선택 사항) 구성 요소에서 오류가 발생할 때 실행되는 스크립트가 정의되는 객체 또는 문자열입니다.  
이 단계는 구성 요소가 `ERRORED` 상태로 전환되면 실행됩니다. 구성 요소가 복구되지 않고 세 번 `ERRORED`로 전환되면 구성 요소가 `BROKEN` 상태로 변경됩니다. `BROKEN` 구성 요소를 해결하려면 다시 구성 요소를 배포해야 합니다.  
다음 정보가 이 객체 또는 문자열에 있습니다.    
`Script`  <a name="recipe-lifecycle-script"></a>
실행할 스크립트입니다.  
`RequiresPrivilege`  <a name="recipe-lifecycle-requiresprivilege"></a>
(선택 사항) 루트 권한으로 스크립트를 실행할 수 있습니다. 이 옵션을 로 설정하면 `true` AWS IoT Greengrass 코어 소프트웨어가이 구성 요소를 실행하도록 구성한 시스템 사용자 대신이 수명 주기 스크립트를 루트로 실행합니다. 기본값은 `false`입니다.  
`Skipif`  <a name="recipe-lifecycle-skipif"></a>
(선택 사항) 스크립트 실행 여부가 결정되는 확인입니다. 실행 파일이 경로에 있는지 또는 파일이 있는지 확인되도록 정의할 수 있습니다. 출력이 true라면 AWS IoT Greengrass 코어 소프트웨어에서는 단계를 건너뜁니다. 다음 확인 사항 중 하나를 선택합니다.  
+ `onpath runnable` - 시스템 경로에 실행 가능이 있는지 확인합니다. 예를 들어, Python 3를 사용할 수 있으면 **onpath python3**를 사용하여 이 수명 주기 단계를 건너뜁니다.
+ `exists file` – 파일이 있는지 확인합니다. 예를 들어, `/tmp/my-configuration.db`가 있으면 **exists /tmp/my-configuration.db**를 사용하여 이 수명 주기 단계를 건너뜁니다.  
`Timeout`  
(선택 사항) AWS IoT Greengrass 코어 소프트웨어가 프로세스를 종료하기 전에 스크립트가 실행할 수 있는 초 단위의 최대 시간입니다.  
기본값: 60초  
`Setenv`  <a name="recipe-lifecycle-environment"></a>
(선택 사항) 스크립트에 제공되는 환경 변수의 사전입니다. `Lifecycle.Setenv`에서 제공하는 변수가 이러한 환경 변수를 통해 재정의됩니다.  
  `bootstrap`   
(선택 사항) AWS IoT Greengrass 코어 소프트웨어 또는 코어 디바이스가 다시 시작되어야 하는 스크립트가 재정의되는 객체 또는 문자열입니다. 그러면 예컨대 운영 체제 업데이트 또는 런타임 업데이트 설치 후 다시 시작이 수행되는 구성 요소를 개발할 수 있습니다.  
 AWS IoT Greengrass 코어 소프트웨어 또는 디바이스를 다시 시작할 필요가 없는 업데이트 또는 종속성을 설치하려면 [설치 수명 주기를](#install-lifecycle-definition) 사용합니다.
이 수명 주기 단계는 AWS IoT Greengrass 코어 소프트웨어가 구성 요소를 배포하는 다음 경우 설치 수명 주기 단계 전에 실행됩니다.  
+ 처음으로 구성 요소가 코어 디바이스에 배포됩니다.
+ 구성 요소 변경 사항입니다.
+ 구성 요소 구성 업데이트의 결과로 부트스트랩 스크립트가 변경됩니다.
 AWS IoT Greengrass 코어 소프트웨어가 배포에 부트스트랩 단계가 있는 모든 구성 요소에 대해 부트스트랩 단계를 완료하면 소프트웨어가 다시 시작됩니다.  
 AWS IoT Greengrass 코어 소프트웨어 또는 코어 디바이스를 다시 시작하려면 AWS IoT Greengrass 코어 소프트웨어를 시스템 서비스로 구성해야 합니다. AWS IoT Greengrass 코어 소프트웨어를 시스템 서비스로 구성하지 않으면 소프트웨어가 다시 시작되지 않습니다. 자세한 내용은 [Greengrass nucleus를 시스템 서비스로 구성](configure-greengrass-core-v2.md#configure-system-service) 단원을 참조하십시오.
다음 정보가 이 객체 또는 문자열에 있습니다.    
`BootstrapOnRollback`  
이 기능이 활성화되면 `BootstrapOnRollback`은 실패한 대상 배포의 일부로 부트스트랩 수명 주기 단계가 완료되었거나 실행이 시도되었던 구성 요소에 대해서만 실행됩니다. 이 기능은 Greengrass nucleus 버전 2.12.0 이상에 사용할 수 있습니다.
(선택 사항) 롤백 배포의 일부로 부트스트랩 수명 주기 단계를 실행할 수 있습니다. 이 옵션을 `true`로 설정하면 롤백 배포 내에 정의된 부트스트랩 수명 주기 단계가 실행됩니다. 배포에 실패하면 롤백 배포 동안 구성 요소 부트스트랩 수명 주기의 이전 버전이 다시 실행됩니다.  
기본값은 `false`입니다.  
`Script`  
실행할 스크립트입니다. 이 스크립트의 종료 코드를 통해 재시작 지침이 정의됩니다. 다음 종료 코드를 사용합니다.  
+ `0` - AWS IoT Greengrass 코어 소프트웨어 또는 코어 디바이스를 다시 시작하지 마십시오. AWS IoT Greengrass 코어 소프트웨어는 모든 구성 요소가 부트스트랩된 후에도 계속 다시 시작됩니다.
+ `100` - AWS IoT Greengrass 코어 소프트웨어를 다시 시작하도록 요청합니다.
+ `101` – 코어 디바이스 재시작을 요청합니다.
종료 코드 100\$1199는 특수 동작용으로 예비되어 있습니다. 기타 종료 코드는 스크립트 오류를 나타냅니다.  
`RequiresPrivilege`  <a name="recipe-lifecycle-requiresprivilege"></a>
(선택 사항) 루트 권한으로 스크립트를 실행할 수 있습니다. 이 옵션을 로 설정하면 `true` AWS IoT Greengrass 코어 소프트웨어가이 구성 요소를 실행하도록 구성한 시스템 사용자 대신이 수명 주기 스크립트를 루트로 실행합니다. 기본값은 `false`입니다.  
`Timeout`  <a name="recipe-lifecycle-timeout"></a>
(선택 사항) AWS IoT Greengrass 코어 소프트웨어에서 프로세스가 종료되기 전에 스크립트가 실행될 수 있는 최대 시간(초)입니다.  
기본값: 120초  
`Setenv`  <a name="recipe-lifecycle-environment"></a>
(선택 사항) 스크립트에 제공되는 환경 변수의 사전입니다. `Lifecycle.Setenv`에서 제공하는 변수가 이러한 환경 변수를 통해 재정의됩니다.  
  `Selections`   
(선택 사항) 이 매니페스트에 대해 실행할 [글로벌 수명 주기](#global-lifecycle-definition)의 섹션이 지정되는 선택 키 목록입니다. 글로벌 수명 주기에서는 수준과 관계없이 선택 키로 수명 주기 단계를 정의하여 수명 주기의 하위 섹션을 선택할 수 있습니다. 그러면 코어 디바이스에서는 이 매니페스트의 선택 키와 일치하는 섹션이 사용됩니다. 자세한 내용은 [글로벌 수명 주기 예제](#global-lifecycle-definition)를 참조하세요.  
코어 디바이스에서는 이 매니페스트에서 수명 주기가 지정되지 않는 경우에만 글로벌 수명 주기의 선택 사항이 사용됩니다.
`all` 선택 키를 지정하여 선택 키가 없는 글로벌 수명 주기의 섹션을 실행할 수 있습니다.  
  `Artifacts`   
(선택 사항) 이 매니페스트에서 정의되는 플랫폼의 구성 요소에 대한 바이너리 아티팩트가 각각 정의되는 객체 목록입니다. 예를 들어 코드 또는 이미지를 아티팩트로 정의할 수 있습니다.  
구성 요소가 배포되면 AWS IoT Greengrass 코어 소프트웨어는 코어 디바이스의 폴더에 아티팩트를 다운로드합니다. 다운로드 후 소프트웨어에서 추출되는 아카이브 파일로 아티팩트를 정의할 수도 있습니다.  
[레시피 변수](#recipe-variables)를 사용하여 아티팩트가 코어 디바이스에 설치되는 폴더의 경로를 가져올 수 있습니다.  
+ 일반 파일 - [레시피 변수 artifacts:path](#component-recipe-artifacts-path)를 사용하여 아티팩트가 있는 폴더의 경로를 가져옵니다. 예를 들어 레시피에 `{artifacts:path}/my_script.py`를 지정하여 URI `s3://amzn-s3-demo-bucket/path/to/my_script.py`가 있는 아티팩트의 경로를 가져옵니다.
+ 추출된 아카이브 - [레시피 변수 artifacts:decompressedPath](#component-recipe-artifacts-decompressed-path)를 사용하여, 추출된 아카이브 아티팩트가 있는 폴더의 경로를 가져옵니다. AWS IoT Greengrass 코어 소프트웨어는 각 아카이브를 아카이브와 동일한 이름의 폴더로 추출합니다. 예를 들어 레시피에 `{artifacts:decompressedPath}/my_archive/my_script.py`를 지정하여 URI `s3://amzn-s3-demo-bucket/path/to/my_archive.zip`가 있는 아카이브 아티팩트에서 `my_script.py`의 경로를 가져옵니다.
로컬 코어 디바이스의 아카이브 아티팩트로 구성 요소를 개발하면 해당 아티팩트에 대한 URI가 없을 수 있습니다. 아티팩트를 추출하는 `Unarchive` 옵션으로 구성 요소를 테스트하려면 파일 이름이 아카이브 아티팩트 파일의 이름과 일치하는 URI를 지정합니다. 아카이브 아티팩트를 업로드하려는 URI를 지정하거나 새 자리 표시자 URI를 지정할 수 있습니다. 예를 들어, 로컬 배포 동안 `my_archive.zip` 아티팩트를 추출하려면 `s3://amzn-s3-demo-bucket/my_archive.zip`을 지정할 수 있습니다.
각 객체에는 다음 정보가 포함되어 있습니다.    
`Uri`  
S3 버킷에 있는 아티팩트의 URI입니다. AWS IoT Greengrass 코어 소프트웨어는 아티팩트가 디바이스에 이미 존재하지 않는 한 구성 요소가 설치될 때이 URI에서 아티팩트를 가져옵니다. 각 아티팩트에는 각 매니페스트 내에 고유한 파일 이름이 있어야 합니다.  
`Unarchive`  
(선택 사항) 압축을 풀 아카이브의 유형입니다. 다음 옵션 중 하나를 선택합니다.  
+ `NONE` - 파일은 압축을 풀 아카이브가 아닙니다. AWS IoT Greengrass 코어 소프트웨어에서는 코어 디바이스의 폴더에 아티팩트가 설치됩니다. [artifacts:path 레시피 변수](#component-recipe-artifacts-path)를 사용하여 이 폴더의 경로를 가져올 수 있습니다.
+ `ZIP` – 파일은 ZIP 아카이브입니다. AWS IoT Greengrass 코어 소프트웨어는 아카이브와 동일한 이름의 폴더로 아카이브를 추출합니다. [artifacts:decompressedPath 레시피 변수](#component-recipe-artifacts-decompressed-path)를 사용하여 이 폴더가 있는 폴더의 경로를 가져올 수 있습니다.
기본값은 `NONE`입니다.  
  `Permission`   
(선택 사항) 이 아티팩트 파일에 대해 설정할 액세스 권한이 정의되는 객체입니다. 읽기 권한과 실행 권한을 설정할 수 있습니다.  
 AWS IoT Greengrass 코어 소프트웨어는 구성 요소가 아티팩트 폴더의 아티팩트 파일을 편집하도록 허용하지 않으므로 쓰기 권한을 설정할 수 없습니다. 구성 요소에서 아티팩트 파일을 편집하려면 다른 위치에 복사하거나 새 아티팩트 파일을 게시하고 배포합니다.
아티팩트를 압축을 풀 아카이브로 정의하면 AWS IoT Greengrass 코어 소프트웨어는 아카이브에서 압축을 푼 파일에 대해 이러한 액세스 권한을 설정합니다. AWS IoT Greengrass 코어 소프트웨어는 폴더의 액세스 권한을 `Read` 및에 `ALL` 대해 로 설정합니다`Execute`. 그러면 구성 요소를 통해 폴더에서 압축 해제된 파일을 볼 수 있습니다. 아카이브의 개별 파일에 대한 권한을 설정하려면 [설치 수명 주기 스크립트](#install-lifecycle-definition) 에서 권한을 설정할 수 있습니다.  
이 객체에는 다음 정보가 포함되어 있어야 합니다.    
`Read`  
(선택 사항) 이 아티팩트 파일에 대해 설정할 읽기 권한입니다. 이 구성 요소에 종속되는 구성 요소와 같이 기타 구성 요소에 이 아티팩트 액세스를 허용하려면 `ALL`을 지정합니다. 다음 옵션 중 하나를 선택합니다.  
+ `NONE` – 파일을 읽을 수 없습니다.
+ `OWNER` - 이 구성 요소를 실행하도록 구성하는 시스템 사용자가 파일을 읽을 수 있습니다.
+ `ALL` – 모든 사용자가 파일을 읽을 수 있습니다.
기본값은 `OWNER`입니다.  
`Execute`  
(선택 사항) 이 아티팩트 파일에 대해 설정할 실행 권한입니다. `Execute` 권한에는 `Read` 권한이 수반됩니다. 예를 들어, `ALL`에 대해 `Execute`을 지정하면 모든 사용자가 이 아티팩트 파일을 읽고 실행할 수 있습니다.  
다음 옵션 중 하나를 선택합니다.  
+ `NONE` - 파일을 실행할 수 없습니다.
+ `OWNER` - 구성 요소를 실행하도록 구성하는 시스템 사용자가 파일을 실행할 수 있습니다.
+ `ALL` - 모든 사용자가 파일을 실행할 수 있습니다.
기본값은 `NONE`입니다.  
`Digest`  
(읽기 전용) 아티팩트의 암호화 다이제스트 해시입니다. 구성 요소를 생성할 때는 해시 알고리즘을 AWS IoT Greengrass 사용하여 아티팩트 파일의 해시를 계산합니다. 그런 다음에 구성 요소를 배포할 때 Greengrass nucleus에서는 다운로드된 아티팩트의 해시가 계산되고 해시가 이 다이제스트와 비교되어 설치 전에 아티팩트가 확인됩니다. 해시가 다이제스트와 일치하지 않으면 배포에 실패합니다.  
이 파라미터를 설정하면 구성 요소를 생성할 때 설정한 값이 AWS IoT Greengrass 로 바뀝니다.  
`Algorithm`  
(읽기 전용)가 아티팩트의 다이제스트 해시를 계산하는 데 AWS IoT Greengrass 사용하는 해시 알고리즘입니다.  
이 파라미터를 설정하면 구성 요소를 생성할 때 설정한 값이 AWS IoT Greengrass 로 바뀝니다.

  `Lifecycle`   
구성 요소를 설치하고 실행하는 방법이 정의되는 객체입니다. 코어 디바이스에서는 사용되는 [매니페스트](#manifest-definition)에서 수명 주기가 지정되지 않는 경우에만 글로벌 수명 주기가 사용됩니다.  
매니페스트 외부에 이 수명 주기를 정의합니다. 매니페스트와 일치하는 플랫폼에 적용되는 [매니페스트 수명 주기](#manifest-lifecycle-definition)도 정의할 수 있습니다.
글로벌 수명 주기에서 각 매니페스트에서 지정하는 특정 [선택 키](#manifest-selections-definition)에 대해 실행되는 수명 주기를 지정할 수 있습니다. 선택 키는 각 매니페스트에 대해 실행할 글로벌 수명 주기의 섹션이 식별되는 문자열입니다.  
`all` 선택 키는 선택 키가 없는 섹션에 대한 기본값입니다. 즉, 선택 키가 없는 글로벌 수명 주기의 섹션이 실행되도록 매니페스트의 `all` 선택 키를 지정할 수 있습니다. 글로벌 수명 주기에서는 `all` 선택 키를 지정할 필요가 없습니다.  
매니페스트에서 수명 주기 또는 선택 키가 정의되지 않으면 코어 디바이스에서는 기본적으로 `all` 선택이 사용됩니다. 즉, 이 경우에는 선택 키가 사용되지 않는 글로벌 수명 주기의 섹션이 코어 디바이스에서 사용됩니다.  
이 객체에는 [매니페스트 수명 주기](#manifest-lifecycle-definition)와 동일한 정보가 있지만, 수준과 관계없이 선택 키를 지정하여 수명 주기의 하위 섹션을 선택할 수 있습니다.  
선택 키와 수명 주기 키가 충돌하지 않도록 각 선택 키에 소문자만 사용하는 것이 좋습니다. 수명 주기 키는 대문자로 시작합니다.

**Example 최상위 선택 키가 있는 글로벌 수명 주기 예제**  

```
Lifecycle:
  key1:
    install:
      SkipIf: either onpath executable or exists file
      Script: command1
  key2:
    install:
      Script: command2
  all:
    install:
      Script: command3
```

**Example 최하위 선택 키가 있는 글로벌 수명 주기 예제**  

```
Lifecycle:
  install:
    Script:
      key1: command1
      key2: command2
      all: command3
```

**Example 여러 수준의 선택 키가 있는 글로벌 수명 주기 예제**  

```
Lifecycle:
  key1:
    install:
      SkipIf: either onpath executable or exists file
      Script: command1
  key2:
    install:
      Script: command2
  all:
    install:
      Script:
        key3: command3
        key4: command4
        all: command5
```

## 레시피 변수
<a name="recipe-variables"></a>

레시피 변수에서는 레시피에서 사용할 현재 구성 요소 및 nucleus의 정보가 노출됩니다. 예를 들어 레시피 변수를 사용하여 수명 주기 스크립트에서 실행하는 애플리케이션에 구성 요소 구성 파라미터를 전달할 수 있습니다.

구성 요소 레시피의 다음 섹션에서 레시피 변수를 사용할 수 있습니다.
+ 수명 주기 정의입니다.
+ [Greengrass nucleus](greengrass-nucleus-component.md) v2.6.0 이상을 사용하고 [interpolateComponentConfiguration](greengrass-nucleus-component.md#greengrass-nucleus-component-configuration-interpolate-component-configuration) 구성 옵션을 `true`로 설정하는 경우의 구성 요소 구성 정의입니다. [구성 요소 구성 업데이트 배포](update-component-configurations.md#merge-configuration-update-recipe-variables) 시 레시피 변수를 사용할 수도 있습니다.

레시피 변수에는`{recipe_variable}` 구문이 사용됩니다. 중괄호는 레시피 변수를 나타냅니다.

AWS IoT Greengrass 는 다음 레시피 변수를 지원합니다.

`component_dependency_name:configuration:json_pointer`  
이 레시피에서 정의되는 구성 요소 또는 이 구성 요소가 종속되는 구성 요소에 대한 구성 파라미터의 값입니다.  
이 변수를 사용하여 구성 요소 수명 주기에서 실행하는 스크립트에 파라미터를 제공할 수 있습니다.  
AWS IoT Greengrass 는 구성 요소 수명 주기 정의에서만이 레시피 변수를 지원합니다.
이 레시피 변수에는 다음 입력이 있습니다.  
+ <a name="recipe-variable-component-dependency-name"></a>`component_dependency_name` – (선택 사항) 쿼리할 구성 요소 종속성의 이름입니다. 이 레시피에서 정의되는 구성 요소를 쿼리하려면 이 세그먼트를 생략합니다. 직접 종속성만 지정할 수 있습니다.
+ `json_pointer` – 평가할 구성 값에 대한 JSON 포인터입니다. JSON 포인터는 슬래시(`/`)로 시작합니다. 중첩된 구성 요소 구성에서 값을 식별하려면 슬래시(`/`)를 사용하여 구성의 각 수준에 대한 키를 구분합니다. 숫자를 키로 사용하여 목록에서 인덱스를 지정할 수 있습니다. 자세한 내용은 [JSON 포인터 사양](https://tools.ietf.org/html/rfc6901)을 참조하세요.

  AWS IoT Greengrass 코어는 YAML 형식의 레시피에 JSON 포인터를 사용합니다.
JSON 포인터에서는 다음 노드 유형이 참조될 수 있습니다.  
+ value node. AWS IoT Greengrass Core는 레시피 변수를 값의 문자열 표현으로 대체합니다. Null 값은 문자열인 `null`로 변환됩니다.
+ object node. AWS IoT Greengrass Core는 레시피 변수를 해당 객체의 직렬화된 JSON 문자열 표현으로 바꿉니다.
+ No node. AWS IoT Greengrass Core는 레시피 변수를 대체하지 않습니다.
예를 들어 `{configuration:/Message}` 레시피 변수에서는 구성 요소 구성에 있는 `Message` 키 값이 검색됩니다. `{com.example.MyComponentDependency:configuration:/server/port}` 레시피 변수에서는 구성 요소 종속성의 `server` 구성 객체`port`에 있는 값이 검색됩니다.

  `component_dependency_name:artifacts:path`   
이 레시피에서 정의되는 구성 요소 또는 이 구성 요소가 종속되는 구성 요소에 대한 아티팩트의 루트 경로입니다.  
구성 요소가 설치되면는이 변수가 노출하는 폴더에 구성 요소의 아티팩트를 AWS IoT Greengrass 복사합니다. 예를 들어 이 변수를 사용하여 구성 요소 수명 주기에서 실행할 스크립트의 위치를 식별할 수 있습니다.  
<a name="recipe-variable-artifact-folder-permissions"></a>이 경로의 폴더는 읽기 전용입니다. 아티팩트 파일을 수정하려면 파일을 현재 작업 디렉터리(`$PWD` 또는 `.`)와 같은 다른 위치에 복사합니다. 그런 다음에 거기에서 파일을 수정합니다.  
<a name="recipe-variable-component-dependency-artifact-file-permissions"></a>구성 요소 종속성에서 아티팩트를 읽거나 실행하려면 해당 아티팩트 `Read` 또는 `Execute` 권한이 `ALL`로 되어야 합니다. 자세한 내용은 구성 요소 레시피에서 정의하는 [아티팩트 권한](#component-artifact-permission)을 참조하세요.  
이 레시피 변수에는 다음 입력이 있습니다.  
+ <a name="recipe-variable-component-dependency-name"></a>`component_dependency_name` – (선택 사항) 쿼리할 구성 요소 종속성의 이름입니다. 이 레시피에서 정의되는 구성 요소를 쿼리하려면 이 세그먼트를 생략합니다. 직접 종속성만 지정할 수 있습니다.

  `component_dependency_name:artifacts:decompressedPath`   
이 레시피에서 정의되는 구성 요소 또는 이 구성 요소가 종속되는 구성 요소에 대한 압축 해제된 아카이브 아티팩트의 루트 경로입니다.  
구성 요소가 설치되면는이 변수가 노출하는 폴더에 구성 요소의 아카이브 아티팩트를 압축 AWS IoT Greengrass 해제합니다. 예를 들어 이 변수를 사용하여 구성 요소 수명 주기에서 실행할 스크립트의 위치를 식별할 수 있습니다.  
각 아티팩트는 압축명을 제외한 아티팩트와 이름이 동일한 폴더인 압축 해제된 경로 내의 폴더에 압축이 풀립니다. 예를 들어 `models.zip`이라는 ZIP 아티팩트는 `{artifacts:decompressedPath}/models` 폴더에 압축이 풀립니다.  
<a name="recipe-variable-artifact-folder-permissions"></a>이 경로의 폴더는 읽기 전용입니다. 아티팩트 파일을 수정하려면 파일을 현재 작업 디렉터리(`$PWD` 또는 `.`)와 같은 다른 위치에 복사합니다. 그런 다음에 거기에서 파일을 수정합니다.  
<a name="recipe-variable-component-dependency-artifact-file-permissions"></a>구성 요소 종속성에서 아티팩트를 읽거나 실행하려면 해당 아티팩트 `Read` 또는 `Execute` 권한이 `ALL`로 되어야 합니다. 자세한 내용은 구성 요소 레시피에서 정의하는 [아티팩트 권한](#component-artifact-permission)을 참조하세요.  
이 레시피 변수에는 다음 입력이 있습니다.  
+ <a name="recipe-variable-component-dependency-name"></a>`component_dependency_name` – (선택 사항) 쿼리할 구성 요소 종속성의 이름입니다. 이 레시피에서 정의되는 구성 요소를 쿼리하려면 이 세그먼트를 생략합니다. 직접 종속성만 지정할 수 있습니다.

  `component_dependency_name:work:path`   
이 기능은 [Greengrass nucleus 구성 요소](greengrass-nucleus-component.md)의 v2.0.4 이상에서 사용할 수 있습니다.  
이 레시피에서 정의되는 구성 요소 또는 이 구성 요소가 종속되는 구성 요소에 대한 작업 경로입니다. 이 레시피 변수의 값은 구성 요소의 컨텍스트에서 실행될 때 `$PWD` 환경 변수의 출력 및 [pwd](https://en.wikipedia.org/wiki/Pwd) 명령과 동일합니다.  
이 레시피 변수를 사용하여 구성 요소와 종속성 사이에 파일을 공유할 수 있습니다.  
이 경로의 폴더는 이 레시피에서 정의되는 구성 요소 및 동일한 사용자 및 그룹으로 실행되는 다른 구성 요소에서 읽을 수 있고 쓸 수 있습니다.  
이 레시피 변수에는 다음 입력이 있습니다.  
+ <a name="recipe-variable-component-dependency-name"></a>`component_dependency_name` – (선택 사항) 쿼리할 구성 요소 종속성의 이름입니다. 이 레시피에서 정의되는 구성 요소를 쿼리하려면 이 세그먼트를 생략합니다. 직접 종속성만 지정할 수 있습니다.

`kernel:rootPath`  
 AWS IoT Greengrass 코어 루트 경로입니다.

`iot:thingName`  
이 기능은 [Greengrass nucleus 구성 요소](greengrass-nucleus-component.md)의 v2.3.0 이상에서 사용할 수 있습니다.  
코어 디바이스 사물의 이름입니다 AWS IoT .

## 레시피 예제
<a name="recipe-examples"></a>

다음 레시피 예제를 참조하면 구성 요소에 대한 레시피를 생성하는 데 도움이 될 수 있습니다.

AWS IoT Greengrass 는 Greengrass 소프트웨어 카탈로그라는 Greengrass 구성 요소의 인덱스를 큐레이션합니다. 이 카탈로그에서는 Greengrass 커뮤니티에서 개발하는 Greengrass 구성 요소가 추적됩니다. 이 카탈로그에서 구성 요소를 다운로드, 수정 및 배포하여 Greengrass 애플리케이션을 생성할 수 있습니다. 자세한 내용은 [커뮤니티 구성 요소](greengrass-software-catalog.md) 단원을 참조하십시오.

**Topics**
+ [Hello World 구성 요소 레시피](#recipe-example-hello-world)
+ [Python 런타임 구성 요소 예제](#recipe-example-python-runtime)
+ [여러 가지 필드가 지정되는 구성 요소 레시피](#recipe-example-all-fields)

### Hello World 구성 요소 레시피
<a name="recipe-example-hello-world"></a>

다음 레시피에서는 Python 스크립트가 실행되는 Hello World 구성 요소가 설명됩니다. 이 구성 요소에서는 모든 플랫폼이 지원되고 Python 스크립트에 대한 인수로 AWS IoT Greengrass 에서 전달되는 `Message` 파라미터가 수락됩니다. 이는 [시작하기 자습서](getting-started.md)의 Hello World 구성 요소에 대한 레시피입니다.

------
#### [ JSON ]

```
{
  "RecipeFormatVersion": "2020-01-25",
  "ComponentName": "com.example.HelloWorld",
  "ComponentVersion": "1.0.0",
  "ComponentDescription": "My first AWS IoT Greengrass component.",
  "ComponentPublisher": "Amazon",
  "ComponentConfiguration": {
    "DefaultConfiguration": {
      "Message": "world"
    }
  },
  "Manifests": [
    {
      "Platform": {
        "os": "linux"
      },
      "Lifecycle": {
        "run": "python3 -u {artifacts:path}/hello_world.py {configuration:/Message}"
      }
    },
    {
      "Platform": {
        "os": "windows"
      },
      "Lifecycle": {
        "run": "py -3 -u {artifacts:path}/hello_world.py {configuration:/Message}"
      }
    }
  ]
}
```

------
#### [ YAML ]

```
---
RecipeFormatVersion: '2020-01-25'
ComponentName: com.example.HelloWorld
ComponentVersion: '1.0.0'
ComponentDescription: My first AWS IoT Greengrass component.
ComponentPublisher: Amazon
ComponentConfiguration:
  DefaultConfiguration:
    Message: world
Manifests:
  - Platform:
      os: linux
    Lifecycle:
      run: |
        python3 -u {artifacts:path}/hello_world.py "{configuration:/Message}"
  - Platform:
      os: windows
    Lifecycle:
      run: |
        py -3 -u {artifacts:path}/hello_world.py "{configuration:/Message}"
```

------

### Python 런타임 구성 요소 예제
<a name="recipe-example-python-runtime"></a>

다음 레시피에서는 Python이 설치되는 구성 요소가 설명됩니다. 이 구성 요소에서는 64비트 Linux 디바이스가 지원됩니다.

------
#### [ JSON ]

```
{
  "RecipeFormatVersion": "2020-01-25",
  "ComponentName": "com.example.PythonRuntime",
  "ComponentDescription": "Installs Python 3.7",
  "ComponentPublisher": "Amazon",
  "ComponentVersion": "3.7.0",
  "Manifests": [
    {
      "Platform": {
        "os": "linux",
        "architecture": "amd64"
      },
      "Lifecycle": {
        "install": "apt-get update\napt-get install python3.7"
      }
    }
  ]
}
```

------
#### [ YAML ]

```
---
RecipeFormatVersion: '2020-01-25'
ComponentName: com.example.PythonRuntime
ComponentDescription: Installs Python 3.7
ComponentPublisher: Amazon
ComponentVersion: '3.7.0'
Manifests:
  - Platform:
      os: linux
      architecture: amd64
    Lifecycle:
      install: |
        apt-get update
        apt-get install python3.7
```

------

### 여러 가지 필드가 지정되는 구성 요소 레시피
<a name="recipe-example-all-fields"></a>

다음 구성 요소 레시피에서는 여러 가지 레시피 필드가 사용됩니다.

------
#### [ JSON ]

```
{
  "RecipeFormatVersion": "2020-01-25",
  "ComponentName": "com.example.FooService",
  "ComponentDescription": "Complete recipe for AWS IoT Greengrass components",
  "ComponentPublisher": "Amazon",
  "ComponentVersion": "1.0.0",
  "ComponentConfiguration": {
    "DefaultConfiguration": {
      "TestParam": "TestValue"
    }
  },
  "ComponentDependencies": {
    "BarService": {
      "VersionRequirement": "^1.1.0",
      "DependencyType": "SOFT"
    },
    "BazService": {
      "VersionRequirement": "^2.0.0"
    }
  },
  "Manifests": [
    {
      "Platform": {
        "os": "linux",
        "architecture": "amd64"
      },
      "Lifecycle": {
        "install": {
          "Skipif": "onpath git",
          "Script": "sudo apt-get install git"
        },
        "Setenv": {
          "environment_variable1": "variable_value1",
          "environment_variable2": "variable_value2"
        }
      },
      "Artifacts": [
        {
          "Uri": "s3://amzn-s3-demo-bucket/hello_world.zip",
          "Unarchive": "ZIP"
        },
        {
          "Uri": "s3://amzn-s3-demo-bucket/hello_world_linux.py"
        }
      ]
    },
    {
      "Lifecycle": {
        "install": {
          "Skipif": "onpath git",
          "Script": "sudo apt-get install git",
          "RequiresPrivilege": "true"
        }
      },
      "Artifacts": [
        {
          "Uri": "s3://amzn-s3-demo-bucket/hello_world.py"
        }
      ]
    }
  ]
}
```

------
#### [ YAML ]

```
---
RecipeFormatVersion: '2020-01-25'
ComponentName: com.example.FooService
ComponentDescription: Complete recipe for AWS IoT Greengrass components
ComponentPublisher: Amazon
ComponentVersion: 1.0.0
ComponentConfiguration:
  DefaultConfiguration:
    TestParam: TestValue
ComponentDependencies:
  BarService:
    VersionRequirement: ^1.1.0
    DependencyType: SOFT
  BazService:
    VersionRequirement: ^2.0.0
Manifests:
  - Platform:
      os: linux
      architecture: amd64
    Lifecycle:
      install:
        SkipIf: onpath git
        Script: sudo apt-get install git
      SetEnv:
        environment_variable1: variable_value1
        environment_variable2: variable_value2
    Artifacts:
      - Uri: 's3://amzn-s3-demo-bucket/hello_world.zip'
        Unarchive: ZIP
      - Uri: 's3://amzn-s3-demo-bucket/hello_world_linux.py'
  - Lifecycle:
      install:
        SkipIf: onpath git
        Script: sudo apt-get install git
        RequiresPrivilege: 'true'
    Artifacts:
      - Uri: 's3://amzn-s3-demo-bucket/hello_world.py'
```

------

# 구성 요소 환경 변수 참조
<a name="component-environment-variables"></a>

 AWS IoT Greengrass 코어 소프트웨어는 구성 요소에 대한 수명 주기 스크립트를 실행할 때 환경 변수를 설정합니다. 구성 요소에서 이러한 환경 변수를 가져와 사물 이름 AWS 리전및 Greengrass nucleus 버전을 가져올 수 있습니다. 소프트웨어에서는 [프로세스 간 통신 SDK](interprocess-communication.md)를 사용하고 [AWS 서비스와 상호 작용](interact-with-aws-services.md)하려면 구성 요소에 필요한 환경 변수가 설정됩니다.

구성 요소의 수명 주기 스크립트에 대한 사용자 지정 환경 변수를 설정할 수도 있습니다. 자세한 내용은 [Setenv](component-recipe-reference.md#lifecycle-setenv-definition)를 참조하세요.

 AWS IoT Greengrass 코어 소프트웨어는 다음과 같은 환경 변수를 설정합니다.

`AWS_IOT_THING_NAME`  
이 Greengrass 코어 디바이스를 나타내는 AWS IoT 사물의 이름입니다.

`AWS_REGION`  
이 Greengrass 코어 디바이스가 작동하는 AWS 리전 입니다.  
 AWS SDKs 사용하여 사용할 기본 리전을 식별합니다. 이 변수는 `AWS_DEFAULT_REGION`과 동일합니다.

`AWS_DEFAULT_REGION`  
이 Greengrass 코어 디바이스가 작동하는 AWS 리전 입니다.  
는이 환경 변수를 AWS CLI 사용하여 사용할 기본 리전을 식별합니다. 이 변수는 `AWS_REGION`과 동일합니다.

`GGC_VERSION`  
이 Greengrass 코어 디바이스에서 실행되는 [Greengrass nucleus 구성 요소](greengrass-nucleus-component.md)의 버전입니다.

`GG_ROOT_CA_PATH`  
이 기능은 [Greengrass nucleus 구성 요소](greengrass-nucleus-component.md) v2.5.5 이상에 사용할 수 있습니다.  
Greengrass nucleus에서 사용되는 루트 인증 기관(CA) 인증서의 경로입니다.

`AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT`  
구성 요소가 AWS IoT Greengrass 코어 소프트웨어와 통신하는 데 사용하는 IPC 소켓의 경로입니다. 자세한 내용은 [AWS IoT Device SDK 를 사용하여 Greengrass nucleus, 기타 구성 요소 및 AWS IoT CoreGreengrass nucleus, 기타 구성 요소 및와 통신 AWS IoT Core](interprocess-communication.md) 단원을 참조하십시오.

`SVCUID`  
구성 요소가 IPC 소켓에 연결하고 AWS IoT Greengrass 코어 소프트웨어와 통신하는 데 사용하는 보안 암호 토큰입니다. 자세한 내용은 [AWS IoT Device SDK 를 사용하여 Greengrass nucleus, 기타 구성 요소 및 AWS IoT CoreGreengrass nucleus, 기타 구성 요소 및와 통신 AWS IoT Core](interprocess-communication.md) 단원을 참조하십시오.

`AWS_CONTAINER_AUTHORIZATION_TOKEN`  
구성 요소에서 [토큰 교환 서비스 구성 요소](token-exchange-service-component.md)의 자격 증명을 검색하는 데 사용되는 비밀 토큰입니다.

`AWS_CONTAINER_CREDENTIALS_FULL_URI`  
구성 요소에서 [토큰 교환 서비스 구성 요소](token-exchange-service-component.md)의 자격 증명을 검색하려고 요청하는 URI입니다.