

지원 종료 공지: 2026년 10월 7일에는에 대한 지원을 중단할 AWS 예정입니다 AWS IoT Greengrass Version 1. 2026년 10월 7일 이후에는 더 이상 AWS IoT Greengrass V1 리소스에 액세스할 수 없습니다. 자세한 내용은 [에서 마이그레이션 AWS IoT Greengrass Version 1](https://docs.aws.amazon.com/greengrass/v2/developerguide/migrate-from-v1.html)을 참조하세요.

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

# AWS IoT Greengrass 코어에서 Lambda 함수 실행
<a name="lambda-functions"></a>

AWS IoT Greengrass 는 사용자가 작성한 사용자 정의 코드를 위한 컨테이너화된 Lambda 런타임 환경을 제공합니다 AWS Lambda. AWS IoT Greengrass 코어의 로컬 Lambda 런타임에서 코어 실행에 배포되는 Lambda 함수입니다. 로컬 Lambda 함수는 로컬 이벤트, 클라우드의 메시지 및 기타 소스에 의해 트리거가 가능하기 때문에 로컬 컴퓨팅 기능을 연결된 장치에 제공할 수 있습니다. 예를 들어 클라우드로 데이터를 전송하기 앞서 Lambda 함수를 사용해 장치 데이터를 필터링할 수 있습니다.

코어에 Lambda 함수를 배포하려면 Greengrass 그룹에 해당 함수를 추가하고(기존 Lambda 함수를 참조하여) 해당 함수에 대해 그룹별 설정을 구성한 다음, 그룹을 배포합니다. 함수가 AWS 서비스에 액세스하는 경우 [Greengrass 그룹 역할에](group-role.md) 필요한 권한도 추가해야 합니다.

권한, 격리, 메모리 제한 등을 비롯해 Lambda 함수 실행 방법을 결정하는 파라미터를 구성할 수 있습니다. 자세한 내용은 [그룹별 구성을 사용한 Lambda 함수 실행 제어](lambda-group-config.md) 단원을 참조하십시오.

**참고**  
또한 이러한 설정을 사용하면 Docker 컨테이너 AWS IoT Greengrass 에서를 실행할 수 있습니다. 자세한 내용은 [Docker 컨테이너 AWS IoT Greengrass 에서 실행](run-gg-in-docker-container.md) 단원을 참조하십시오.

다음 표에는 지원되는 [AWS Lambda 런타임](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html)과 해당 런타임이 실행할 수 있는 AWS IoT Greengrass 코어 소프트웨어 버전이 나열되어 있습니다.


****  

| 언어 또는 플랫폼 | GGC 버전 | 
| --- | --- | 
| Python 3.8 | 1.11 | 
|  Python 3.7 | 1.9 이상 | 
| Python 2.7 \$1 | 1.0 이상 | 
| Java 8 | 1.1 이상 | 
| Node.js 12.x \$1 | 1.10 이상 | 
| Node.js 8.10 \$1 | 12.7 이상 | 
| Node.js 6.10 \$1 | 12.7 이상 | 
| C, C\$1\$1 | 1.6 이상 | 

\$1 지원되는 버전에서 이러한 런타임을 사용하는 Lambda 함수를 실행할 수 있지만 AWS IoT Greengrass에서 생성할 수는 없습니다 AWS Lambda. 장치의 런타임이 해당 함수에 지정된 AWS Lambda 런타임과 다른 경우 `FunctionDefintionVersion`의 `FunctionRuntimeOverride`을(를) 사용하여 자체 런타임을 선택할 수 있습니다. 자세한 내용은 [CreateFunctionDefinition](https://docs.aws.amazon.com/greengrass/v1/apireference/createfunctiondefinition-post.html)을 참조하십시오. 지원되는 런타임에 대한 자세한 내용은 *AWS Lambda 개발자 안내서*의 [런타임 지원 정책](https://docs.aws.amazon.com/lambda/latest/dg/runtime-support-policy.html)을 참조하십시오.

## Greengrass Lambda 함수용 SDK
<a name="lambda-sdks"></a>

AWS 는 AWS IoT Greengrass 코어에서 실행되는 Greengrass Lambda 함수에서 사용할 수 있는 세 가지 SDKs를 제공합니다. 이 SDK는 서로 다른 패키지에 포함되어 있기 때문에 두 패키지를 동시에 사용할 수 있습니다. Lambda 함수에서 SDK를 사용하려면 에 업로드하는 Lambda 함수 배포 패키지 AWS Lambda에 SDK를 포함시킵니다.

**AWS IoT Greengrass 코어 SDK**  <a name="lambda-sdks-core"></a>
다음 사항을 위해 로컬 Lambda 함수를 활성화해 코어와 상호 작용합니다.  <a name="gg-core-sdk-functionality"></a>
+ MQTT 메시지를와 교환합니다 AWS IoT Core.
+ MQTT 메시지를 Greengrass 그룹의 커넥터, 장치, 기타 Lambda 함수와 교환합니다.
+ 로컬 섀도우 서비스와 상호 작용합니다.
+ 다른 로컬 Lambda 함수를 간접적으로 호출합니다.
+ [암호 리소스](secrets.md)에 액세스합니다.
+ [스트림 관리자](stream-manager.md)와 상호 작용합니다.
AWS IoT Greengrass 는 GitHub에서 다음 언어 및 플랫폼으로 AWS IoT Greengrass 코어 SDK를 제공합니다.  <a name="gg-core-sdk-download-list"></a>
+ [AWS IoT Greengrass Java용 코어 SDK](https://github.com/aws/aws-greengrass-core-sdk-java/)
+ [AWS IoT Greengrass Node.js용 코어 SDK](https://github.com/aws/aws-greengrass-core-sdk-js/)
+ [AWS IoT Greengrass Python용 코어 SDK](https://github.com/aws/aws-greengrass-core-sdk-python/)
+ [AWS IoT Greengrass C용 코어 SDK](https://github.com/aws/aws-greengrass-core-sdk-c/)
Lambda 함수 배포 패키지에 AWS IoT Greengrass 코어 SDK 종속성을 포함하려면:  

1. Lambda 함수의 런타임과 일치하는 AWS IoT Greengrass 코어 SDK 패키지의 언어 또는 플랫폼을 다운로드합니다.

1. 다운로드한 패키지의 압축을 풀어 SDK를 가져옵니다. SDK는 `greengrasssdk` 폴더입니다.

1. 함수 코드가 포함된 Lambda 함수 배포 패키지에 `greengrasssdk`을 포함시킵니다. Lambda 함수를 생성할 AWS Lambda 때에 업로드하는 패키지입니다.
   
 **StreamManagerClient**  
[스트림 관리자](stream-manager.md) 작업에는 다음 AWS IoT Greengrass 코어 SDKs만 사용할 수 있습니다.  <a name="streammanagerclient-sdk-versions"></a>
+ Java SDK (v1.4.0 이상)
+ Python SDK(v1.5.0 이상)
+ Node.js SDK (v1.6.0 이상)
Python용 AWS IoT Greengrass 코어 SDK를 사용하여 스트림 관리자와 상호 작용하려면 Python 3.7 이상을 설치해야 합니다. 또한 Python Lambda 함수 배포 패키지에 포함시킬 종속성을 설치해야 합니다.  <a name="python-sdk-dependencies-stream-manager"></a>

1. `requirements.txt` 파일이 포함된 SDK 디렉터리로 이동합니다. 이 파일은 종속성을 나열합니다.

1. SDK 종속성을 설치합니다. 예를 들어 다음 `pip` 명령을 실행하여 현재 디렉터리에 설치합니다.

   ```
   pip install --target . -r requirements.txt
   ```
   
 ** AWS IoT Greengrass 코어 디바이스에 Python용 코어 SDK 설치**  
Python Lambda 함수를 실행하는 경우 [https://pypi.org/project/pip/](https://pypi.org/project/pip/)를 사용하여 AWS IoT Greengrass 코어 디바이스에 Python용 코어 SDK를 설치할 수도 있습니다. 그런 다음 Lambda 함수 배포 패키지에 SDK을 포함시키지 않고 함수를 배포할 수 있습니다. 자세한 내용은 [greengrasssdk](https://pypi.org/project/greengrasssdk/)를 참조하십시오.  
이 지원은 크기 제약이 있는 코어를 위한 것입니다. 가능하면 Lambda 함수 배포 패키지에 SDK를 포함시키는 것이 좋습니다.  
 

**AWS IoT Greengrass Machine Learning SDK**  <a name="lambda-sdks-ml"></a>
Lambda 함수가 Greengrass 코어에 기계 학습 리소스로서 배포된 기계 학습 모델을 이용할 수 있도록 지원합니다. Lambda 함수는 SDK를 사용하여 코어에 커넥터로 배포된 로컬 추론 서비스를 간접적으로 호출하고 상호 작용할 수 있습니다. Lambda 함수 및 ML 커넥터는 SDK를 사용하여 업로드 및 게시를 위해 ML 피드백 커넥터로 데이터를 전송할 수도 있습니다. SDK를 사용하는 코드 예제를 포함하여 자세한 내용은 [ML 이미지 분류 커넥터](image-classification-connector.md), [ML 객체 감지 커넥터](obj-detection-connector.md) 및 [ML 피드백 커넥터](ml-feedback-connector.md) 단원을 참조하십시오.  
다음 표에는 SDK 버전 및 해당 버전에서 실행할 수 있는 AWS IoT Greengrass 코어 소프트웨어 버전에 대해 지원되는 언어 또는 플랫폼이 나열되어 있습니다.    
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/greengrass/v1/developerguide/lambda-functions.html)
다운로드 정보는 [AWS IoT Greengrass ML SDK 소프트웨어](what-is-gg.md#gg-ml-sdk-download) 섹션을 참조하세요.

**AWS SDK**  <a name="lambda-sdks-aws"></a>
로컬 Lambda 함수가 Amazon S3, DynamoDB AWS IoT, 등의 AWS 서비스를 직접 호출할 수 있도록 합니다 AWS IoT Greengrass. Lambda 함수에서 AWS SDK를 사용하려면 배포 패키지에 이를 포함시켜야 합니다. AWS IoT Greengrass 코어 AWS SDK와 동일한 패키지에서 SDK를 사용하는 경우 Lambda 함수가 올바른 네임스페이스를 사용해야 합니다. Lambda 함수는 코어가 오프라인 상태일 때 AWS 또는 기타 클라우드 서비스와 통신을 할 수 없습니다.  
[ 시작하기 리소스 센터에서](https://aws.amazon.com/getting-started/tools-sdks/) AWS SDKs.

배포 패키지를 만드는 방법에 대한 자세한 내용은 시작하기 튜토리얼의 [Lambda 함수 생성 및 패키징](create-lambda.md) 또는 *AWS Lambda 개발자 안내서*의 [배포 패키지 생성](https://docs.aws.amazon.com/lambda/latest/dg/deployment-package-v2.html)을 참조하십시오.

### 클라우드 기반 Lambda 함수 마이그레이션
<a name="lambda-migrate-sdks"></a>

 AWS IoT Greengrass 코어 SDK는 AWS SDK 프로그래밍 모델을 따르므로 클라우드용으로 개발된 Lambda 함수를 AWS IoT Greengrass 코어에서 실행되는 Lambda 함수로 쉽게 이식할 수 있습니다.

예를 들어 다음 Python Lambda 함수는 AWS SDK for Python (Boto3) 를 사용하여 클라우드의 주제에 메시지를 게시`some/topic`합니다.

```
import boto3

iot_client = boto3.client("iot-data")
response = iot_client.publish(
    topic="some/topic", qos=0, payload="Some payload".encode()
)
```

 AWS IoT Greengrass 코어의 함수를 이식하려면 다음 예제와 같이 `import` 문 및 `client` 초기화에서 `boto3` 모듈 이름을 `greengrasssdk`로 변경합니다.

```
import greengrasssdk

iot_client = greengrasssdk.client("iot-data")
iot_client.publish(topic="some/topic", qos=0, payload="Some payload".encode())
```

**참고**  
 AWS IoT Greengrass 코어 SDK는 QoS = 0인 MQTT 메시지 전송만 지원합니다. 자세한 내용은 [서비스 품질 메시지](gg-core.md#message-quality-of-service) 단원을 참조하십시오.

프로그래밍 모델 간의 유사성을 통해 클라우드에서 Lambda 함수를 개발한 다음 최소한의 노력 AWS IoT Greengrass 으로 로 마이그레이션할 수도 있습니다. [Lambda 실행 파일은](#lambda-executables) 클라우드에서 실행되지 않으므로 배포 전에 AWS SDK를 사용하여 클라우드에서 개발할 수 없습니다.

## 별칭 또는 버전을 기준으로 Lambda 함수 참조
<a name="lambda-versions-aliases"></a>

Greengrass 그룹은 별칭(권장) 또는 버전을 기준으로 Lambda 함수를 참조할 수 있습니다. 별칭을 사용하면 함수 코드를 업데이트할 때 구독 테이블이나 그룹 정의를 변경할 필요가 없으므로 코드 업데이트를 더 쉽게 관리할 수 있습니다. 그 대신 새 함수 버전에 대한 별칭을 가리킵니다. 별칭은 그룹 배포 동안 버전 번호로 확인됩니다. 별칭을 사용하면 확인된 버전이 배포 당시 별칭이 가리키고 있는 버전으로 업데이트됩니다.

AWS IoT Greengrass 는 **\$1LATEST** 버전에 대해 Lambda 별칭을 지원하지 않습니다. **\$1LATEST** 버전은 변경 불가능한 게시 함수 버전으로 제한되지 않고 언제라도 변경이 가능한데, 이는 버전 불변성이라는 AWS IoT Greengrass 원칙과 상반됩니다.

코드 변경에 따라 Lambda 함수를 계속 업데이트하기 위한 일반적인 방법은 Greengrass 그룹 및 구독에서 **PRODUCTION**(이)라는 별칭을 사용하는 것입니다. 새로운 버전의 Lambda 함수를 프로덕션 환경으로 승격함에 따라 별칭이 안정적인 최신 버전을 가리키도록 하고 그룹을 재배포합니다. 또한 이전 버전으로 롤백하기 위해 이 방법을 사용할 수도 있습니다.

# 그룹별 구성을 사용한 Lambda 함수 실행 제어
<a name="lambda-group-config"></a>

AWS IoT Greengrass 는 Greengrass Lambda 함수의 클라우드 기반 관리를 제공합니다. Lambda 함수의 코드 및 종속성은를 사용하여 관리되지만 Greengrass 그룹에서 실행될 때 Lambda 함수가 작동하는 방식을 구성할 AWS Lambda수 있습니다.

## 그룹별 구성 설정
<a name="lambda-group-config-properties"></a>

AWS IoT Greengrass 는 Greengrass Lambda 함수에 대해 다음과 같은 그룹별 구성 설정을 제공합니다.

**시스템 사용자 및 그룹**  <a name="lambda-access-identity"></a>
Lambda 함수 실행에 사용되는 액세스 ID입니다. 기본적으로 Lambda 함수는 그룹의 [기본 액세스 확인](#lambda-access-identity-groupsettings)으로 실행됩니다. 일반적으로 이 항목은 표준 AWS IoT Greengrass 시스템 계정(ggc\$1user and ggc\$1group)입니다. 설정을 변경할 수 있으며, Lambda 함수 실행에 필요한 권한을 가진 사용자 ID 및 그룹 ID를 선택할 수 있습니다. UID와 GID를 둘 다 재정의하거나 한 필드를 비워둘 경우 다른 하나만 재정의할 수도 있습니다. 이러한 설정으로 장치 리소스 액세스를 한층 세부적으로 제어할 수 있습니다. Lambda 함수 실행에 권한이 사용되는 사용자와 그룹에 대해 적절한 리소스 제한, 파일 권한, 디스크 할당량으로 Greengrass 하드웨어를 구성하는 것이 좋습니다.  
이 기능은 AWS IoT Greengrass 코어 v1.7 이상에서 사용할 수 있습니다.  
반드시 필요한 경우 외에는 Lambda 함수를 루트로 실행하는 것은 피하는 것이 좋습니다. 루트로 실행하면 다음과 같은 위험이 증가합니다.  
+ Lambda 함수를 루트로 실행하면 중요한 파일을 실수로 삭제하는 등 의도치 않은 변경이 발생할 리스크가 증가합니다.
+ 악의적인 개인으로 인한 데이터 및 장치 위험.
+ Docker 컨테이너가 `--net=host` 및 `UID=EUID=0`와(과) 함께 실행될 경우 컨테이너 이스케이프 위험이 커집니다.
루트로 실행해야 하는 경우 AWS IoT Greengrass 구성을 업데이트하여 활성화해야 합니다. 자세한 내용은 [루트로서의 Lambda 함수 실행](#lambda-running-as-root) 단원을 참조하십시오.  
**시스템 사용자 ID(번호)**  
Lambda 함수 실행에 필요한 권한을 가진 사용자의 사용자 ID입니다. 이 설정은 **다른 사용자 ID/그룹 ID로 실행하기**를 선택할 경우에만 사용 가능합니다. AWS IoT Greengrass 코어 디바이스에서 **getent passwd** 명령을 사용하여 Lambda 함수를 실행하는 데 사용할 사용자 ID를 조회할 수 있습니다.  
Greengrass 코어 장치에서 동일한 UID를 사용하여 프로세스와 Lambda 함수를 실행하는 경우, Greengrass 그룹 역할은 프로세스에 임시 보안 인증을 부여할 수 있습니다. 프로세스는 Greengrass 코어 배포에 임시 보안 인증을 사용할 수 있습니다.  
**시스템 그룹 ID(번호)**  
Lambda 함수 실행에 필요한 권한을 가진 그룹의 그룹 ID입니다. 이 설정은 **다른 사용자 ID/그룹 ID로 실행하기**를 선택할 경우에만 사용 가능합니다. AWS IoT Greengrass 코어 디바이스에서 **getent group** 명령을 사용하여 Lambda 함수를 실행하는 데 사용할 그룹 ID를 조회할 수 있습니다.

**Lambda 함수 컨테이너화**  <a name="lambda-function-containerization"></a>
그룹의 기본 컨테이너화로 Lambda 함수를 실행할지 선택하거나 이 Lambda 함수에 항상 사용할 컨테이너화를 지정합니다.  
Lambda 함수의 컨테이너화 모드는 격리 수준을 결정합니다.  
+ 컨테이너화된 Lambda 함수는 **Greengrass 컨테이너** 모드에서 실행됩니다. Lambda 함수는 AWS IoT Greengrass 컨테이너 내의 격리된 런타임 환경(또는 네임스페이스)에서 실행됩니다.
+ 컨테이너화되지 않은 Lambda 함수는 **컨테이너 없음** 모드에서 실행됩니다. Lambda 함수는 격리 없이 일반 Linux 프로세스로 실행됩니다.
이 기능은 AWS IoT Greengrass 코어 v1.7 이상에서 사용할 수 있습니다.  
컨테이너화 없이 실행할 것이 요구되는 사용 사례가 아니라면 Lambda 함수를 Greengrass 컨테이너에서 실행하는 것이 좋습니다. Lambda 함수가 Greengrass 컨테이너에서 실행되면 연결된 로컬 장치 리소스를 사용하고 격리와 보안 강화에 따른 이점을 누릴 수 있습니다. 컨테이너화 변경 전에 [Lambda 함수 컨테이너화 선택 시 고려 사항](#lambda-containerization-considerations)를 참조하십시오.  
장치 커널 네임스페이스와 cgroup의 활성화 없이 실행하려면 모든 Lambda 함수가 컨테이너화 없이 실행되어야 합니다. 이는 그룹의 기본 컨테이너화를 설정해 간편히 달성할 수 있습니다. 자세한 내용은 [그룹 내 Lambda 함수의 기본 컨테이너화 설정](#lambda-containerization-groupsettings) 단원을 참조하세요.

**메모리 제한**  
함수에 할당된 메모리입니다. 기본값은 16MB입니다.  
Lambda 함수를 컨테이너화 없이 실행하기로 변경하면 메모리 제한 설정이 삭제됩니다. 컨테이너화 없이 실행되는 Lambda 함수에는 메모리 제한이 없습니다. 컨테이너화 없이 실행되도록 Lambda 함수 또는 그룹 기본 컨테이너화 설정을 변경하면 메모리 제한 설정이 무시됩니다.

**제한 시간**  
함수 또는 요청이 종료되기 전까지의 시간입니다. 기본값은 3초입니다.

**고정**  
Lambda 함수는 *온디맨드* 또는 *긴 수명 주기*를 가질 수 있습니다. 기본값은 온디맨드입니다.  
온디맨드 Lambda 함수는 호출 시 새 컨테이너나 재사용된 컨테이너에서 시작됩니다. 함수에 대한 요청은 사용 가능한 어떤 컨테이너에서든 처리가 가능합니다. 수명이 길거나 *고정된* Lambda 함수는 AWS IoT Greengrass 가 시작된 후 자동으로 시작되며 자체 컨테이너(또는 샌드박스)에서 계속 실행됩니다. 함수에 대한 모든 요청은 동일한 컨테이너에 의해 처리됩니다. 자세한 내용은 [Greengrass Lambda 함수의 라이프사이클 구성](lambda-functions.md#lambda-lifecycle) 단원을 참조하십시오.

**/sys 디렉터리에 대한 읽기 액세스 권한**  
함수가 호스트의 /sys 폴더에 액세스할 수 있는지 여부입니다. 함수가 /sys에서 장치 정보를 읽어야 할 때 이 권한을 사용하십시오. 기본값은 false입니다.  
이 설정은 Lambda 함수를 컨테이너화 없이 실행할 경우 사용할 수 없습니다. Lambda 함수를 컨테이너화 없이 실행하기로 변경하면 이 설정 값이 삭제됩니다.

**인코딩 유형**  
함수에 대한 입력 페이로드의 예상 인코딩 유형(JSON 또는 이진)입니다. 기본값은 JSON입니다.  
이진 인코딩 유형에 대한 지원은 AWS IoT Greengrass 코어 소프트웨어 v1.5.0 및 AWS IoT Greengrass 코어 SDK v1.1.0부터 사용할 수 있습니다. 장치 데이터와 상호 작용하는 함수에서는 이진 입력 데이터를 수락하는 것이 유용할 수 있습니다. 왜냐하면 장치의 하드웨어 기능이 제한되어 있기 때문에 JSON 데이터 유형을 생성하는 것이 종종 어렵거나 불가능하기 때문입니다.  
[Lambda 실행 파일](lambda-functions.md#lambda-executables)은 이진 인코딩 유형만 지원하며, JSON은 지원하지 않습니다.

**프로세스 인수**  
Lambda 함수가 실행될 때 전달할 명령줄 인수입니다.

**환경 변수**  
함수 코드 및 라이브러리에 역동적으로 설정값을 전달할 수 있는 키-값 쌍입니다. 로컬 환경 변수는 [AWS Lambda 함수 환경 변수](https://docs.aws.amazon.com/lambda/latest/dg/env_variables.html)와 동일한 방식으로 작동하지만, 코어 환경에서도 사용할 수 있습니다.

**Resource access policies(리소스 액세스 정책)**  
Lambda 함수가 액세스할 수 있는 최대 10개의 [로컬 리소스](access-local-resources.md), [비밀 리소스](secrets.md), [기계 학습 리소스](ml-inference.md) 및 해당 `read-only` 또는 `read-write` 권한의 목록입니다. 콘솔에서 이러한 *제휴* 리소스는 **리소스** 탭의 그룹 구성 페이지에 나열됩니다.  
[컨테이너화 모드](#lambda-function-containerization)는 Lambda 함수가 로컬 장치와 볼륨 리소스 및 기계 학습 리소스에 액세스하는 방법에 영향을 줍니다.  
+ 컨테이너화되지 않은 Lambda 함수는 코어 장치의 파일 시스템을 통해 직접 로컬 장치 및 볼륨 리소스에 액세스해야 합니다.
+ 컨테이너화되지 않은 Lambda 함수가 Greengrass 그룹의 기계 학습 리소스에 액세스하도록 허용하려면 기계 학습 리소스에 대한 리소스 소유자 및 액세스 권한 속성을 설정해야 합니다. 자세한 내용은 [Lambda 함수에서 기계 학습 리소스에 액세스](access-ml-resources.md) 단원을 참조하십시오.

 AWS IoT Greengrass API를 사용하여 사용자 정의 Lambda 함수에 대한 그룹별 구성 설정을 설정하는 방법에 대한 자세한 내용은 API 참조의 [CreateFunctionDefinition](https://docs.aws.amazon.com/greengrass/v1/apireference/createfunctiondefinition-post.html) *AWS IoT Greengrass Version 1 또는 명령 참조*의 [create-function-definition](https://docs.aws.amazon.com/cli/latest/reference/greengrass/create-function-definition.html)을 참조하세요. *AWS CLI * Greengrass 코어에 Lambda 함수를 배포하려면 함수가 포함된 함수 정의 버전을 생성하고, 함수 정의 버전 및 기타 그룹 구성 요소를 참조하는 그룹 버전을 생성한 다음 [그룹을 배포](deployments.md)합니다.

## 루트로서의 Lambda 함수 실행
<a name="lambda-running-as-root"></a>

이 기능은 AWS IoT Greengrass 코어 v1.7 이상에서 사용할 수 있습니다.

하나 이상의 Lambda 함수를 루트로 실행하려면 먼저 AWS IoT Greengrass 구성을 업데이트하여 지원을 활성화해야 합니다. 루트로서의 Lambda 함수 실행 지원은 기본적으로 꺼져 있습니다. Lambda 함수를 배포하고 루트(UID 및 GID 0)로 실행하려고 하는데 AWS IoT Greengrass 구성을 업데이트하지 않은 경우 배포가 실패합니다. 다음과 같은 오류 메시지가 런타임 로그(*greengrass\$1root*/ggc/var/log/system/runtime.log)에 표시됩니다.

```
lambda(s)
[list of function arns] are configured to run as root while Greengrass is not configured to run lambdas with root permissions
```

**중요**  
반드시 필요한 경우 외에는 Lambda 함수를 루트로 실행하는 것은 피하는 것이 좋습니다. 루트로 실행하면 다음과 같은 위험이 증가합니다.  
Lambda 함수를 루트로 실행하면 중요한 파일을 실수로 삭제하는 등 의도치 않은 변경이 발생할 리스크가 증가합니다.
악의적인 개인으로 인한 데이터 및 장치 위험.
Docker 컨테이너가 `--net=host` 및 `UID=EUID=0`와(과) 함께 실행될 경우 컨테이너 이스케이프 위험이 커집니다.

**Lambda 함수를 루트로 실행하도록 허용하려면**

1.  AWS IoT Greengrass 디바이스에서 *greengrass-root*/config 폴더로 이동합니다.
**참고**  
기본적으로 *greengrass-root*는 /greengrass 디렉터리입니다.

1. config.json 파일을 편집하여 `"allowFunctionsToRunAsRoot" : "yes"`를 `runtime` 필드에 추가합니다. 예제:

   ```
   {
     "coreThing" : {
       ...
     },
     "runtime" : {
       ...
       "allowFunctionsToRunAsRoot" : "yes"
     },
     ...
   }
   ```

1. 다음 명령을 사용하여 다시 시작합니다 AWS IoT Greengrass.

   ```
   cd /greengrass/ggc/core
   sudo ./greengrassd restart
   ```

   이제 Lambda 함수의 사용자 ID와 그룹 ID(UID/GID)를 0으로 설정해 Lambda 함수를 루트로 실행할 수 있습니다.

Lambda 함수가 루트로 실행되지 않도록 AWS IoT Greengrass 하려면의 값을 `"allowFunctionsToRunAsRoot"` 로 변경`"no"`하고 다시 시작할 수 있습니다.

## Lambda 함수 컨테이너화 선택 시 고려 사항
<a name="lambda-containerization-considerations"></a>

이 기능은 AWS IoT Greengrass 코어 v1.7 이상에서 사용할 수 있습니다.

기본적으로 Lambda 함수는 AWS IoT Greengrass 컨테이너 내에서 실행됩니다. 컨테이너를 통해 함수와 호스트를 서로 격리해, 컨테이너 내 호스트와 함수 모두의 보안을 강화할 수 있습니다.

컨테이너화 없이 실행할 것이 요구되는 사용 사례가 아니라면 Lambda 함수를 Greengrass 컨테이너에서 실행하는 것이 좋습니다. Greengrass 컨테이너에서 Lambda 함수를 실행하면 리소스 액세스 제한을 보다 세부적으로 제어할 수 있습니다.

다음은 컨테이너화 없이 실행할 경우에 대한 몇 가지 예제 사용 사례입니다.
+ 컨테이너 모드를 지원하지 않는 디바이스 AWS IoT Greengrass 에서를 실행하려고 합니다(예: 특수 Linux 배포를 사용 중이거나 커널 버전이 너무 오래된 경우).
+ 자체 OverlayFS를 사용하는 다른 컨테이너 환경에서 Lambda 함수를 실행하려 하지만 Greengrass 컨테이너에서 실행 시 OverlayFS 충돌이 발생하는 경우.
+ 배포 시 결정할 수 없거나 플러그 가능 장치처럼 배포 후 변경될 수 있는 경로로 로컬 리소스에 액세스할 수 있어야 합니다.
+ 프로세스로서 쓰여진 레거시 애플리케이션을 컨테이너화된 Lambda 함수로 실행할 때 문제가 발생한 경우.


**컨테이너화의 차이점**  

| 컨테이너화 | 참고 | 
| --- | --- | 
| Greengrass 컨테이너 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/greengrass/v1/developerguide/lambda-group-config.html) | 
| 컨테이너 없음 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/greengrass/v1/developerguide/lambda-group-config.html) | 

**참고**  
Greengrass 그룹의 기본 컨테이너화 설정은 [커넥터](connectors.md)에는 적용되지 않습니다.

Lambda 함수의 컨테이너화를 변경하면 배포 시 문제가 발생할 수 있습니다. 더 이상 새 컨테이너화 설정으로 사용할 수 없는 Lambda 함수에 로컬 리소스를 할당했다면 배포에 실패합니다.
+ Lambda 함수를 Greengrass 컨테이너에서 실행하는 방식에서 컨테이너화 없이 실행하는 방식으로 변경하면 해당 함수에 대해 설정된 메모리 제한이 삭제됩니다. 연결된 로컬 리소스를 사용하기보다 파일 시스템에 직접 액세스해야 합니다. 배포하기 전에 연결된 모든 리소스를 제거해야 합니다.
+ Lambda 함수를 컨테이너화 없이 실행하는 방식에서 컨테이너에서 실행하는 방식으로 변경하면 Lambda 함수는 파일 시스템에 대한 직접 액세스 권한을 상실합니다. 각 함수에 대한 메모리 제한을 정의하거나 16MB 기본값을 수락해야 합니다. 배포하기 전에 각 Lambda 함수에 대해 이러한 설정을 구성할 수 있습니다.<a name="change-containerization-lambda"></a>

**Lambda 함수의 컨테이너화 설정을 변경하려면**

1. <a name="console-gg-groups"></a> AWS IoT 콘솔 탐색 창의 **관리**에서 **Greengrass 디바이스**를 확장한 다음 **그룹(V1)을** 선택합니다.

1. <a name="lambda-choose-group"></a>설정을 변경하려는 Lambda 함수가 포함된 그룹을 선택합니다.

1. <a name="lambda-choose-lambdas"></a>**Lambda 함수**탭을 선택합니다.

1. <a name="lambda-edit-lambda"></a>변경하려는 Lambda 함수에서 줄임표(**…**)를 선택한 다음 **구성 편집**을 선택합니다.

1. 컨테이너화 설정을 변경합니다. Lambda 함수가 Greengras 컨테이너에서 실행되도록 구성할 경우, **메모리 제한**과 **/sys 디렉터리에 대한 읽기 액세스**. 권한 또한 설정해야 합니다.

1. <a name="lambda-save-changes"></a>**저장**을 선택한 다음 **확인**을 선택하여 Lambda 함수에 변경 내용을 저장합니다.

변경 사항은 그룹이 배포될 때 적용됩니다.

*AWS IoT Greengrass API 참조*에서 [CreateFunctionDefinition](https://docs.aws.amazon.com/greengrass/v1/apireference/createfunctiondefinition-post.html), [CreateFunctionDefinitionVersion](https://docs.aws.amazon.com/greengrass/v1/apireference/createfunctiondefinitionversion-post.html)을 사용할 수도 있습니다. 컨테이너화 설정을 변경할 경우, 다른 파라미터 또한 업데이트해야 합니다. 예를 들어 Lambda 함수를 Greengrass 컨테이너에서 실행하는 방식에서 컨테이너화 없이 실행하는 방식으로 변경한다면 `MemorySize` 파라미터를 지워야 합니다.

### Greengrass 장치로 지원되는 격리 모드 결정
<a name="dependency-checker-tests-isolation"></a>

 AWS IoT Greengrass 종속성 검사기를 사용하여 Greengrass 디바이스에서 지원되는 격리 모드(Greengrass 컨테이너/컨테이너 없음)를 확인할 수 있습니다.

**AWS IoT Greengrass 종속성 검사기를 실행하려면**

1. [GitHub 리포지토리](https://github.com/aws-samples/aws-greengrass-samples)에서 AWS IoT Greengrass 종속성 검사기를 다운로드하고 실행합니다.

   ```
   wget https://github.com/aws-samples/aws-greengrass-samples/raw/master/greengrass-dependency-checker-GGCv1.11.x.zip
   unzip greengrass-dependency-checker-GGCv1.11.x.zip
   cd greengrass-dependency-checker-GGCv1.11.x
   sudo modprobe configs
   sudo ./check_ggc_dependencies | more
   ```

1. `more`가 나타나면 Spacebar 키를 눌러 다른 텍스트 페이지를 표시합니다.

**modprobe** 명령에 대한 자세한 내용을 보려면 터미널에서 **man modprobe**를 실행합니다.

## 그룹에 있는 Lambda 함수의 기본 액세스 자격 증명 설정
<a name="lambda-access-identity-groupsettings"></a>

이 기능은 AWS IoT Greengrass 코어 v1.8 이상에서 사용할 수 있습니다.

장치 리소스에 대한 액세스를 자세히 제어하기 위해, 그룹에서 Lambda 함수를 실행하는 데 사용되는 기본 액세스 자격 증명을 구성할 수 있습니다. 이 설정은 Lambda 함수가 코어 장치에서 실행될 때 함수에 제공된 기본 권한을 결정합니다. 그룹에 있는 개별 함수의 설정을 재정의하려면 함수의 **Run as(실행 방식)** 속성을 사용할 수 있습니다. 자세한 내용은 [실행 방식](#lambda-access-identity)을 참조하십시오.

이 그룹 수준 설정은 기본 AWS IoT Greengrass 코어 소프트웨어를 실행하는 데에도 사용됩니다. 이 설정은 메시지 라우팅, 로컬 섀도우 동기화, 자동 IP 주소 감지 등의 작업을 관리하는 시스템 Lambda 함수로 이루어집니다.

기본 액세스 자격 증명은 표준 AWS IoT Greengrass 시스템 계정(ggc\$1user 및 ggc\$1group)으로 실행하거나 다른 사용자 또는 그룹의 권한을 사용하도록 구성할 수 있습니다. 사용자 정의 또는 시스템 Lambda 함수 실행에 권한이 사용되는 사용자와 그룹에 대해 적절한 리소스 제한, 파일 권한, 디스크 할당량으로 Greengrass 하드웨어를 구성하는 것이 좋습니다.

**AWS IoT Greengrass 그룹의 기본 액세스 ID를 수정하려면**

1. <a name="console-gg-groups"></a> AWS IoT 콘솔 탐색 창의 **관리**에서 **Greengrass 디바이스**를 확장한 다음 **그룹(V1)을** 선택합니다.

1. <a name="group-choose-group"></a>설정을 변경하려는 그룹을 선택합니다.

1. **Lambda 함수** 탭을 선택하고 **기본 Lambda 함수 런타임 환경** 섹션에서 **편집**을 선택합니다.

1. **기본 Lambda 함수 런타임 환경 편집** 페이지의 **기본 시스템 사용자 및 그룹**에서 **다른 사용자 ID/그룹 ID**를 선택합니다.

   이 옵션을 선택하면 **시스템 사용자 ID (숫자)** 및 **시스템 그룹 ID (숫자)** 필드가 표시됩니다.

1. 사용자 ID, 그룹 ID 또는 둘 다 입력합니다. 필드를 비워 두면 해당 Greengrass 시스템 계정(ggc\$1user 또는 ggc\$1group)이 사용됩니다.
   + **시스템 사용자 ID(번호)**에 그룹에서 Lambda 함수를 실행하는 데 기본적으로 사용하려는 권한을 가진 사용자의 사용자 ID를 입력합니다. **getent passwd** 명령을 AWS IoT Greengrass 장치에 사용하여 사용자 ID를 조회할 수 있습니다.
   + **시스템 그룹 ID(번호)**에 그룹에서 Lambda 함수를 실행하는 데 기본적으로 사용하려는 권한을 가진 그룹의 그룹 ID를 입력합니다. **getent group** 명령을 AWS IoT Greengrass 장치에 사용하여 그룹 ID를 조회할 수 있습니다.
**중요**  
루트 사용자로 실행하면 데이터 및 장치의 위험이 커집니다. 비즈니스 사례에 필요하지 않으면 루트(UID/GID=0)로 실행하지 마십시오. 자세한 내용은 [루트로서의 Lambda 함수 실행](#lambda-running-as-root) 단원을 참조하십시오.

변경 사항은 그룹이 배포될 때 적용됩니다.

## 그룹 내 Lambda 함수의 기본 컨테이너화 설정
<a name="lambda-containerization-groupsettings"></a>

이 기능은 AWS IoT Greengrass 코어 v1.7 이상에서 사용할 수 있습니다.

Greengrass 그룹의 컨테이너화 설정은 그룹의 Lambda 함수에 대한 기본 컨테이너화를 결정합니다.
+ **Greengrass 컨테이너** 모드에서 Lambda 함수는 기본적으로 AWS IoT Greengrass 컨테이너 내부의 격리된 런타임 환경에서 실행됩니다.
+ **컨테이너 없음** 모드에서 Lambda 함수는 기본적으로 일반 Linux 프로세스로 실행됩니다.

그룹 설정을 수정해 그룹 내 Lambda 함수의 기본 컨테이너화를 지정할 수 있습니다. Lambda 함수를 그룹 기본값과 다른 컨테이너화로 실행하도록 하려면 그룹 내 하나 이상의 함수에 대해 이 설정을 재정의할 수 있습니다. 컨테이너화 설정 변경 전에 [Lambda 함수 컨테이너화 선택 시 고려 사항](#lambda-containerization-considerations)를 참조하십시오.

**중요**  
그룹의 기본 컨테이너화를 변경하려고 하지만 서로 다른 컨테이너화를 사용하는 함수가 하나 이상인 경우, 그룹 설정 변경 전에 Lambda 함수 설정을 변경합니다. 그룹 컨테이너화 설정을 먼저 변경할 경우, **메모리 제한**과 **/sys 디렉터리에 대한 읽기 액세스 권한** 설정의 값이 삭제됩니다.

**AWS IoT Greengrass 그룹의 컨테이너화 설정을 수정하려면**

1. <a name="console-gg-groups"></a> AWS IoT 콘솔 탐색 창의 **관리**에서 **Greengrass 디바이스**를 확장한 다음 **그룹(V1)을** 선택합니다.

1. <a name="group-choose-group"></a>설정을 변경하려는 그룹을 선택합니다.

1. **Lambda 함수**탭을 선택합니다.

1. **기본 Lambda 함수 런타임 환경**에서 **편집**을 선택합니다.

1. **기본 Lambda 함수 런타임 환경 편집** 페이지의 **기본 Lambda 함수 컨테이너화**에서 컨테이너화 설정을 변경합니다.

1. **저장**을 선택합니다.

변경 사항은 그룹이 배포될 때 적용됩니다.

## Greengrass Lambda 함수를 위한 통신 흐름
<a name="lambda-communication"></a>

Greengrass Lambda 함수는 AWS IoT Greengrass 그룹의 다른 멤버, 로컬 서비스 및 클라우드 서비스( AWS 서비스 포함)와 통신하는 여러 가지 방법을 지원합니다.

### MQTT 메시지를 사용한 통신
<a name="lambda-messages"></a>

Lambda 함수는 구독에 의해 제어되는 게시-구독 패턴을 사용하여 MQTT 메시지를 전송하고 수신할 수 있습니다.

이러한 통신 흐름을 통해 Lambda 함수는 메시지를 다음 엔터티와 교환할 수 있습니다.
+ 그룹 내 클라이언트 장치.
+ 그룹 내의 커넥터.
+ 그룹의 기타 Lambda 함수입니다.
+ AWS IoT.
+ 로컬 장치 섀도우 서비스.

구독은 메시지 소스와 메시지 대상, 소스에서 대상까지의 메시지 라우팅에 사용된 주제(제목)를 정의합니다. Lambda 함수에 게시되는 메시지는 함수의 등록 핸들러에 전달됩니다. 구독은 보안 강화 및 예측 가능한 상호 작용을 지원합니다. 자세한 내용은 [MQTT 메시징 워크플우로의 관리형 구독](gg-sec.md#gg-msg-workflow) 단원을 참조하십시오.

**참고**  
코어가 오프라인 상태일 때 Lambda 함수는 장치, 커넥터, 기타 함수 및 로컬 섀도우와 메시지를 교환할 수 있지만, AWS IoT 에 대한 메시지는 대기됩니다. 자세한 내용은 [클라우드 대상을 위한 MQTT 메시지 대기열](gg-core.md#mqtt-message-queue) 단원을 참조하십시오.

### 기타 통신 흐름
<a name="lambda-other-communication"></a>
+ Lambda 함수는 로컬 장치 및 볼륨 리소스와 코어 장치의 기계 학습 모델과 상호 작용하기 위해 플랫폼 고유의 운영 체제 인터페이스를 사용합니다. 예를 들어 Python 함수에서 [os](https://docs.python.org/2/library/os.html) 모듈의 `open` 메서드를 사용할 수 있습니다. 함수가 리소스에 액세스하도록 허용하려면 함수가 해당 리소스와 *연계*되고 `read-only` 또는 `read-write` 권한을 부여 받아야 합니다. AWS IoT Greengrass 코어 버전 가용성을 포함한 자세한 내용은 [Lambda 함수와 커넥터를 사용하여 로컬 리소스에 액세스](access-local-resources.md) 및 섹션을 참조하세요[Lambda 함수 코드에서 기계 학습 리소스에 액세스](access-ml-resources.md#access-resource-function-code).
**참고**  
컨테이너화 없이 Lambda 함수를 실행하면 연결된 로컬 장치 및 볼륨 리소스를 사용할 수 없으며 해당 리소스에 직접 액세스해야 합니다.
+ Lambda 함수는 AWS IoT Greengrass 코어 SDK의 `Lambda` 클라이언트를 사용하여 Greengrass 그룹의 다른 Lambda 함수를 호출할 수 있습니다.
+ Lambda 함수는 AWS SDK를 사용하여 AWS 서비스와 통신할 수 있습니다. 자세한 내용은 [AWS SDK](#aws-sdk)를 참조하세요.
+ Lambda 함수는 타사 인터페이스를 사용하여 클라우드 기반 Lambda 함수처럼 외부 클라우드 서비스와 통신할 수 있습니다.

**참고**  
코어가 오프라인 상태일 때는 Greengrass Lambda 함수가 AWS 또는 다른 클라우드 서비스와 통신할 수 없습니다.

## 입력 MQTT 주제(또는 제목) 검색
<a name="lambda-get-mqtt-topic"></a>

AWS IoT Greengrass 는 구독을 사용하여 그룹의 클라이언트 디바이스, Lambda 함수 및 커넥터와 AWS IoT 또는 로컬 섀도우 서비스와의 MQTT 메시지 교환을 제어합니다. 구독은 메시지 원본, 메시지 대상 및 메시지 라우팅에 사용되는 MQTT 주제를 정의합니다. 대상이 Lambda 함수이면 소스가 메시지를 게시할 때 함수 핸들러가 호출됩니다. 자세한 내용은 [MQTT 메시지를 사용한 통신](#lambda-messages) 단원을 참조하십시오.

다음 예에서는 Lambda 함수가 핸들러에 전달되는 `context`에서 입력 항목을 가져올 수 있는 방법을 보여 줍니다. 컨텍스트 계층 구조(`context.client_context.custom['subject']`)에서 `subject` 키에 액세스하여 이 작업을 수행합니다. 또한 예제에서는 입력 JSON 메시지를 구문 분석한 후 구문 분석된 주제와 메시지를 게시합니다.

**참고**  
 AWS IoT Greengrass API에서 [구독](https://docs.aws.amazon.com/greengrass/v1/apireference/definitions-subscription.html)의 주제는 `subject` 속성으로 표시됩니다.

```
import greengrasssdk
import logging

client = greengrasssdk.client('iot-data')

OUTPUT_TOPIC = 'test/topic_results'

def get_input_topic(context):
    try:
        topic = context.client_context.custom['subject']
    except Exception as e:
        logging.error('Topic could not be parsed. ' + repr(e))
    return topic
    
def get_input_message(event):
    try:
        message = event['test-key']
    except Exception as e:
        logging.error('Message could not be parsed. ' + repr(e))
    return message

def function_handler(event, context):
    try:
        input_topic = get_input_topic(context)
        input_message = get_input_message(event)
        response = 'Invoked on topic "%s" with message "%s"' % (input_topic, input_message)
        logging.info(response)
    except Exception as e:
        logging.error(e)

    client.publish(topic=OUTPUT_TOPIC, payload=response)

    return
```

함수를 테스트하려면 기본 구성 설정을 사용하여 그룹에 함수를 추가하십시오. 그리고 나서 다음 구독을 추가하고 그룹을 배포합니다. 지침은 [모듈 3(1부):의 Lambda 함수 AWS IoT Greengrass](module3-I.md) 섹션을 참조하세요.


****  

| 소스 | 대상 | 주제 필터 | 
| --- | --- | --- | 
| IoT Cloud | 이 함수 | test/input\$1message | 
| 이 함수 | IoT Cloud | test/topic\$1results | 

배포가 완료되면 함수를 호출합니다.

1.  AWS IoT 콘솔에서 **MQTT 테스트 클라이언트** 페이지를 엽니다.

1. **주제 구독** 탭을 선택하여 `test/topic_results` 주제를 구독하십시오.

1. **주제에 게시** 탭을 선택하여 `test/input_message` 주제에 메시지를 게시하십시오. 이 예제에서는 `test-key` 속성을 JSON 메시지에 포함해야 합니다.

   ```
   {
     "test-key": "Some string value"
   }
   ```

   성공하면 함수가 입력 주제에 메시지 문자열을 `test/topic_results` 주제에 게시합니다.

## Greengrass Lambda 함수의 라이프사이클 구성
<a name="lambda-lifecycle"></a>

Lambda 함수 수명 주기에 따라 함수가 시작되는 시점과 컨테이너를 생성 및 사용하는 방법이 결정됩니다. 또한 수명 주기는 함수 핸들러 외부에 있는 변수 및 사전 처리 로직이 보관되는 방법을 결정합니다.

AWS IoT Greengrass 는 온디맨드(기본값) 또는 수명이 긴 수명 주기를 지원합니다.
+ **온디맨드** 함수는 호출될 때 시작되고 실행할 작업이 남아 있지 않을 때 종료됩니다. 기존 컨테이너를 재사용할 수 있는 경우가 아닌 한, 함수를 호출하면 호출을 처리하기 위해 별도의 컨테이너(또는 샌드박스)가 생성됩니다. 함수에 전송되는 데이터는 어떤 컨테이너에 의해서든 가져올 수 있습니다.

  온디맨드 함수에 대한 다중 호출은 병렬로 실행될 수 있습니다.

  함수 핸들러 외부에서 정의된 변수 및 사전 처리 로직은 새 컨테이너 생성 시 보관되지 않습니다.
+ **수명이 긴**(또는 *고정된*) 함수는 AWS IoT Greengrass 코어가 시작되어 단일 컨테이너에서 실행될 때 자동으로 시작됩니다. 함수에 전송되는 모든 데이터는 동일한 컨테이너가 가져옵니다.

  이전 호출이 실행될 때까지 다중 호출은 대기 상태가 됩니다.

  함수 핸들러 외부에서 정의된 변수 또는 사전 처리 로직은 핸들러를 호출할 때마다 보관됩니다.

  수명이 긴 Lambda 함수는 초기 입력 없이 작업을 시작해야 할 때 유용합니다. 예를 들어 수명이 긴 함수는 함수가 장치 데이터 수신을 시작할 때 준비가 되도록 ML 모델을 로드해서 처리를 시작할 수 있습니다.
**참고**  
수명이 긴 함수는 핸들러 호출과 관련해 제한 시간이 있다는 점에 유의하십시오. 무한정 실행되는 코드를 실행하고 싶은 경우에는 핸들러 외부에서 이를 시작해야 합니다. 핸들러 외부에 함수의 초기화 완료를 방해하는 차단 코드가 없는지 확인하십시오.  
 코어가 중지되지 않으면(예: 그룹 배포 또는 장치 재부팅 도중) 이 함수가 실행됩니다. 또는 함수가 오류 상태(핸들러 시간 초과, 확인되지 않은 예외 또는 메모리 제한을 초과하는 경우 등)가 됩니다.

컨테이너 재사용에 대한 자세한 내용은 AWS 컴퓨팅 블로그의 [에서 컨테이너 재사용 이해를 AWS Lambda](https://aws.amazon.com/blogs/compute/container-reuse-in-lambda/) 참조하세요.

## Lambda 실행 파일
<a name="lambda-executables"></a>

이 기능은 AWS IoT Greengrass 코어 v1.6 이상에서 사용할 수 있습니다.

Lambda 실행 파일은(는) 코어 환경에서 이진 코드를 실행하는 데 사용할 수 있는Greengrass Lambda 함수의 유형입니다. 이를 통해 장치별 기능을 기본적으로 실행할 수 있으며 컴파일된 코드의 공간이 더 작아지는 이점을 누릴 수 있습니다. Lambda 실행 파일은 이벤트에 의해 간접적으로 호출되고, 다른 함수를 간접적으로 호출하고, 로컬 리소스에 액세스할 수 있습니다.

Lambda 실행 파일은 이진 인코딩 유형만 지원하지만(JSON는 지원하지 않음), 그렇지 않고 다른 Lambda 함수처럼 Greengrass 그룹에서 이들을 관리하고 배포할 수 있습니다. 그러나 을(를) 생성하는 프로세스는 Python, Java 및 Node.js Lambda 함수를 생성하는 프로세스와는 다릅니다.
+  AWS Lambda 콘솔을 사용하여 Lambda 실행 파일을 생성(또는 관리)할 수 없습니다. AWS Lambda API를 사용해야만 Lambda 실행 파일을 생성할 수 있습니다.
+ 함수 코드를 [AWS IoT Greengrass C용 코어 SDK](https://github.com/aws/aws-greengrass-core-sdk-c) AWS Lambda 가 포함된 컴파일된 실행 파일로에 업로드합니다.
+ 함수 핸들러로 실행 파일 이름을 지정합니다.

Lambda 실행 파일은 함수 코드에 특정한 호출 및 프로그래밍 패턴을 구현해야 합니다. 예를 들어 `main` 메서드는 다음과 같이 해야 합니다.
+ `gg_global_init`를 직접 호출하여 Greengrass 내부 전역 변수를 초기화합니다. 스레드를 생성하기 전에 그리고 다른 AWS IoT Greengrass Core SDK 함수를 호출하기 전에이 함수를 호출해야 합니다.
+ `gg_runtime_start`을 직접 호출하여 Greengrass Lambda 런타임에 함수 핸들러를 등록합니다. 초기화 중에 이 함수를 호출해야 합니다. 이 함수를 호출하면 현재 스레드가 실행 시간에 사용됩니다. 선택 사항인 `GG_RT_OPT_ASYNC` 파라미터는 이 함수에게 차단하는 대신, 실행 시간을 위한 새 스레드를 생성하라고 지시합니다. 이 함수는 `SIGTERM` 핸들러를 사용합니다.

다음 스니펫은 GitHub의 [simple\$1handler.c](https://github.com/aws/aws-greengrass-core-sdk-c/blob/master/aws-greengrass-core-sdk-c-example/simple_handler.c) 코드 예제에 있는 `main` 메서드입니다.

```
int main() {
    gg_error err = GGE_SUCCESS;

    err = gg_global_init(0);
    if(err) {
        gg_log(GG_LOG_ERROR, "gg_global_init failed %d", err);
        goto cleanup;
    }

    gg_runtime_start(handler, 0);

cleanup:
    return -1;
}
```

요건, 제약 조건 및 기타 구현 세부 정보에 대한 자세한 내용은 [AWS IoT Greengrass C용 코어 SDK](https://github.com/aws/aws-greengrass-core-sdk-c)을 참조하십시오.

### Lambda 실행 파일 생성
<a name="create-lambda-executable"></a>

SDK와 함께 코드를 컴파일한 후 AWS Lambda API를 사용하여 Lambda 함수를 생성하고 컴파일된 실행 파일을 업로드합니다.

**참고**  
C89와 호환 가능한 컴파일러로 함수를 컴파일해야 합니다.

다음 예제에서는 [create-function](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-function.html) CLI 명령을 사용하여 Lambda 실행 파일을 생성합니다. 이 명령은 다음을 지정합니다.
+ 핸들러를 위한 실행 파일의 이름. 컴파일된 실행 파일의 정확한 이름이어야 합니다.
+ 컴파일된 실행 파일이 포함된 `.zip` 파일에 대한 경로.
+ 실행 시간을 위한 `arn:aws:greengrass:::runtime/function/executable`. 모든 Lambda 실행 파일의 런타임입니다.

**참고**  
`role`의 경우에는 모든 Lambda 실행 파일의 ARN을 지정할 수 있습니다. AWS IoT Greengrass 는 이 역할을 사용하지 않지만, 함수를 생성하려면 이 파라미터가 필요합니다. Lambda 실행 파일에 대한 자세한 내용은 *AWS Lambda 개발자 가이드*의 [AWS Lambda Lambda 실행 파일](https://docs.aws.amazon.com/lambda/latest/dg/intro-permission-model.html)을 참조하세요.

```
aws lambda create-function \
--region aws-region \
--function-name function-name \
--handler executable-name \
--role role-arn \
--zip-file fileb://file-name.zip \
--runtime arn:aws:greengrass:::runtime/function/executable
```

그런 다음 AWS Lambda API를 사용하여 버전을 게시하고 별칭을 생성합니다.
+ 함수 버전을 게시하려면 [게시-버전](https://docs.aws.amazon.com/cli/latest/reference/lambda/publish-version.html)을 사용하십시오.

  ```
  aws lambda publish-version \
  --function-name function-name \
  --region aws-region
  ```
+ 방금 게시한 버전을 가리키는 별칭을 생성하려면 [생성-별칭](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-alias.html)을 사용하십시오. Greengrass 그룹에 추가할 때는 별칭을 기준으로 Lambda 함수를 참조하는 것이 좋습니다.

  ```
  aws lambda create-alias \
  --function-name function-name \
  --name alias-name \
  --function-version version-number \
  --region aws-region
  ```

**참고**  
 AWS Lambda 콘솔에는 Lambda 실행 파일이 표시되지 않습니다. 함수 코드를 업데이트하려면 AWS Lambda API를 사용해야 합니다.

그리고 Greengrass 그룹에 Lambda 실행 파일을 추가하고 그룹별 설정에서 이진 입력 데이터를 수용하도록 이를 구성한 다음, 그룹을 배포합니다. AWS IoT Greengrass 콘솔에서 또는 AWS IoT Greengrass API를 사용하여이 작업을 수행할 수 있습니다.

# Docker 컨테이너 AWS IoT Greengrass 에서 실행
<a name="run-gg-in-docker-container"></a>

AWS IoT Greengrass 는 [Docker](https://www.docker.com/) 컨테이너에서 실행되도록 구성할 수 있습니다.

 AWS IoT Greengrass 코어 소프트웨어 및 종속성이 설치된 [ Amazon CloudFront를 통해](what-is-gg.md#gg-docker-download) Dockerfile을 다운로드할 수 있습니다. 다른 플랫폼 아키텍처에서 실행되도록 Docker 이미지를 수정하거나 Docker 이미지의 크기를 줄이려면 Docker 패키지 다운로드에 있는 `README` 파일을 참조하십시오.

실험을 시작하는 데 도움이 되도록는 AWS IoT Greengrass 코어 소프트웨어 및 종속성이 설치된 사전 빌드된 Docker 이미지 AWS IoT Greengrass AWS 도 제공합니다. [Docker Hub](https://hub.docker.com/r/amazon/aws-iot-greengrass) 또는 [Amazon Elastic Container Registry](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html)(Amazon ECR)에서 이미지를 다운로드할 수 있습니다. 이러한 미리 빌드된 이미지는 Amazon Linux 2(x86\$164) 및 Alpine Linux(x86\$164, Armv7l 또는 AArch64) 기본 이미지를 사용합니다.

**중요**  
<a name="docker-images-end-of-maintenance"></a>2022년 6월 30일에 Amazon Elastic Container Registry(Amazon ECR) 및 Docker Hub에 게시된 AWS IoT Greengrass 코어 소프트웨어 v1.x Docker 이미지에 대한 유지 관리를 AWS IoT Greengrass 종료했습니다. 유지 관리 종료 후 1년이 되는 2023년 6월 30일까지 Amazon ECR 및 Docker Hub에서 이 Docker 이미지를 계속 다운로드할 수 있습니다. 그러나 AWS IoT Greengrass 코어 소프트웨어 v1.x Docker 이미지는 2022년 6월 30일에 유지 관리가 종료된 후 더 이상 보안 패치 또는 버그 수정을 받지 않습니다. 이러한 Docker 이미지에 의존하는 프로덕션 워크로드를 실행하는 경우에서 AWS IoT Greengrass 제공하는 Dockerfiles를 사용하여 자체 Docker 이미지를 빌드하는 것이 좋습니다. 자세한 내용은 [AWS IoT Greengrass Docker 소프트웨어](what-is-gg.md#gg-docker-download) 단원을 참조하십시오.

이 주제에서는 Amazon ECR에서 AWS IoT Greengrass Docker 이미지를 다운로드하고 Windows, macOS 또는 Linux(x86\$164) 플랫폼에서 실행하는 방법을 설명합니다. 이 주제에는 다음 단계가 포함되어 있습니다.

1. [Amazon ECR에서 AWS IoT Greengrass 컨테이너 이미지 가져오기](#docker-pull-image)

1. [Greengrass 그룹 및 코어 생성 및 구성](#docker-config-gg)

1. [ AWS IoT Greengrass 로컬에서 실행](#docker-run-gg)

1. [그룹에 대한 "컨테이너 없음" 컨테이너화 구성](#docker-no-container)

1. [Docker 컨테이너너에 Lambda 함수 배포](#docker-add-lambdas)

1. [(선택 사항) Docker 컨테이너에서 Greengrass와 상호 작용하는 장치 배포](#docker-add-devices)

Docker 컨테이너 AWS IoT Greengrass 에서를 실행할 때는 다음 기능이 지원되지 않습니다.<a name="docker-image-unsupported-features"></a>
+ [Greengrass 컨테이너](connectors.md) 모드에서 실행되는 **커넥터** Docker 컨테이너에서 커넥터를 실행하려면 커넥터가 **컨테이너 없음** 모드로 실행되어야 합니다. **컨테이너 없음** 모드를 지원하는 커넥터를 찾으려면 [AWS에서 제공한 Greengrass 커넥터](connectors-list.md) 단원을 참조하십시오. 이러한 커넥터 중 일부에는 **컨테이너 없음**으로 설정해야 하는 격리 모드 파라미터가 있습니다.
+ [로컬 장치 및 볼륨 리소스](access-local-resources.md). Docker 컨테이너에서 실행되는 사용자 정의 Lambda 함수는 코어의 장치 및 볼륨에 직접 액세스해야 합니다.

Greengrass 그룹의 Lambda 런타임 환경이 Docker [컨테이너에서 실행하는 데 필요한 컨테이너 없음](lambda-group-config.md#no-container-mode)으로 설정된 경우 이러한 기능은 지원되지 않습니다. AWS IoT Greengrass 

## 사전 조건
<a name="docker-image-prerequisites"></a>

이 자습서를 시작하기 전에 다음 작업을 수행해야 합니다.<a name="docker-image-prereq-list"></a>
+ 선택한 AWS Command Line Interface (AWS CLI) 버전에 따라 호스트 컴퓨터에 다음 소프트웨어 및 버전을 설치해야 합니다.

------
#### [ AWS CLI version 2 ]
  + [Docker](https://docs.docker.com/install/), 버전 18.09 이상. 이전 버전도 작동할 수 있지만 18.09 이상을 사용하는 것이 좋습니다.
  + AWS CLI 버전 2.0.0 이상.
    +  AWS CLI 버전 2를 설치하려면 [AWS CLI 버전 2 설치를 참조하세요](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html).
    + 를 구성하려면 구성을 AWS CLI참조하세요. [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html) 
**참고**  
Windows 컴퓨터에서 이후 AWS CLI 버전 2로 업그레이드하려면 [MSI 설치](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-windows.html) 프로세스를 반복해야 합니다.

------
#### [ AWS CLI version 1 ]
  + [Docker](https://docs.docker.com/install/), 버전 18.09 이상. 이전 버전도 작동할 수 있지만 18.09 이상을 사용하는 것이 좋습니다.
  + [Python](https://www.python.org/downloads/), 버전 3.6 이상.
  + [pip](https://pip.pypa.io/en/stable/installing) 버전 18.1 이상
  + AWS CLI 버전 1.17.10 이상
    +  AWS CLI 버전 1을 설치하려면 [AWS CLI 버전 1 설치를 참조하세요](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv1.html).
    + 를 구성하려면 구성을 AWS CLI참조하세요. [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html) 
    +  AWS CLI 버전 1의 최신 버전으로 업그레이드하려면 다음 명령을 실행합니다.

      ```
      pip install awscli --upgrade --user
      ```
**참고**  
Windows에서 AWS CLI 버전 1의 [MSI 설치를](https://docs.aws.amazon.com/cli/latest/userguide/install-windows.html#msi-on-windows) 사용하는 경우 다음 사항에 유의하세요.  
 AWS CLI 버전 1 설치가 botocore를 설치하지 못하는 경우 [Python 및 pip 설치를](https://docs.aws.amazon.com/cli/latest/userguide/awscli-install-windows.html#awscli-install-windows-pip) 사용해 보세요.
이후 AWS CLI 버전 1로 업그레이드하려면 MSI 설치 프로세스를 반복해야 합니다.

------
+ Amazon Elastic Container Registry(Amazon ECR) 리소스에 액세스하려면 다음 권한을 부여해야 합니다.
  + Amazon ECR을 사용하려면 사용자가 AWS Identity and Access Management (IAM) 정책을 통해 `ecr:GetAuthorizationToken` 권한을 부여해야 레지스트리에 인증하고 Amazon ECR 리포지토리에서 이미지를 푸시하거나 가져올 수 있습니다. 자세한 내용은 *Amazon Elastic Container Registry 사용 설명서*의 [Amazon ECR 리포지토리 정책 예시](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policy-examples.html) 및 [One Amazon ECR 리포지토리 액세스](https://docs.aws.amazon.com/AmazonECR/latest/userguide/security_iam_id-based-policy-examples.html#security_iam_id-based-policy-examples-access-one-bucket)를 참조하십시오.

## 1단계: Amazon ECR에서 AWS IoT Greengrass 컨테이너 이미지 가져오기
<a name="docker-pull-image"></a>

AWS 는 AWS IoT Greengrass 코어 소프트웨어가 설치된 Docker 이미지를 제공합니다.

**주의**  <a name="docker-images-python-2.7-removal"></a>
 AWS IoT Greengrass 코어 소프트웨어의 v1.11.6부터는 Greengrass Docker 이미지에 Python 2.7이 더 이상 포함되지 않습니다. Python 2.7이 2020년에 end-of-life에 도달했으며 더 이상 보안 업데이트를 수신하지 않기 때문입니다. 이러한 Docker 이미지로 업데이트하기로 선택한 경우, 업데이트를 프로덕션 장치에 배포하기 전에 애플리케이션이 새 Docker 이미지와 호환되는지 확인하는 것을 권장합니다. Greengrass Docker 이미지를 사용하는 애플리케이션에 Python 2.7이 필요한 경우, Python 2.7을 애플리케이션에 포함하도록 Greengrass Dockerfile을 수정할 수 있습니다.

Amazon ECR에서 `latest` 이미지를 끌어오는 방법을 보여 주는 단계를 알아보려면 해당 운영 체제를 선택하십시오.

### 컨테이너 이미지 가져오기(Linux)
<a name="docker-pull-image-linux"></a>

컴퓨터 터미널에서 다음 명령을 실행합니다.

1. <a name="docker-get-login"></a>Amazon ECR의 AWS IoT Greengrass 레지스트리에 로그인합니다.

   ```
   aws ecr get-login-password --region  us-west-2 | docker login --username AWS --password-stdin https://216483018798.dkr.ecr.us-west-2.amazonaws.com
   ```

   성공하면 `Login Succeeded` 출력이 인쇄됩니다.

1. <a name="docker-docker-pull"></a> AWS IoT Greengrass 컨테이너 이미지를 검색합니다.

   ```
   docker pull 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
   ```
**참고**  
`latest` 이미지에는 Amazon Linux 2 기본 이미지에 설치된 AWS IoT Greengrass 코어 소프트웨어의 안정적인 최신 버전이 포함되어 있습니다. 또한 리포지토리에서 다른 이미지를 끌어올 수도 있습니다. 사용 가능한 모든 이미지에 대한 태그를 찾으려면 [Docker Hub](https://hub.docker.com/r/amazon/aws-iot-greengrass)의 **태그** 페이지를 확인하거나 **aws ecr list-images** 명령을 사용하십시오. 예제:  

   ```
   aws ecr list-images --region us-west-2 --registry-id 216483018798 --repository-name aws-iot-greengrass
   ```

1. symlink 및 hardlink 보호를 활성화합니다. 컨테이너 AWS IoT Greengrass 에서 실행을 실험하는 경우 현재 부팅에 대해서만 설정을 활성화할 수 있습니다.
**참고**  
**sudo**를 사용해 이러한 명령을 실행해야 할 수 있습니다.
   + 현재 부트에 대해서만 설정을 활성화하려면:

     ```
     echo 1 > /proc/sys/fs/protected_hardlinks
     echo 1 > /proc/sys/fs/protected_symlinks
     ```
   + 재시작 후에도 유지되도록 설정을 활성화하려면:

     ```
     echo '# AWS IoT Greengrass' >> /etc/sysctl.conf 
     echo 'fs.protected_hardlinks = 1' >> /etc/sysctl.conf 
     echo 'fs.protected_symlinks = 1' >> /etc/sysctl.conf
     
     sysctl -p
     ```

1. <a name="docker-linux-enable-ipv4"></a> AWS IoT Greengrass 클라우드 배포 및 MQTT 통신이 Linux에서 작동하는 데 필요한 IPv4 네트워크 전달을 활성화합니다. `/etc/sysctl.conf` 파일에서 `net.ipv4.ip_forward`를 1로 설정한 다음 `sysctls`를 다시 로드합니다.

   ```
   sudo nano /etc/sysctl.conf
   # set this net.ipv4.ip_forward = 1
   sudo sysctl -p
   ```
**참고**  
nano 대신 사용자가 선택한 편집기를 사용할 수 있습니다.

### 컨테이너 이미지 가져오기(macOS)
<a name="docker-pull-image-mac"></a>

컴퓨터 터미널에서 다음 명령을 실행합니다.

1. <a name="docker-get-login"></a>Amazon ECR의 AWS IoT Greengrass 레지스트리에 로그인합니다.

   ```
   aws ecr get-login-password --region  us-west-2 | docker login --username AWS --password-stdin https://216483018798.dkr.ecr.us-west-2.amazonaws.com
   ```

   성공하면 `Login Succeeded` 출력이 인쇄됩니다.

1. <a name="docker-docker-pull"></a> AWS IoT Greengrass 컨테이너 이미지를 검색합니다.

   ```
   docker pull 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
   ```
**참고**  
`latest` 이미지에는 Amazon Linux 2 기본 이미지에 설치된 AWS IoT Greengrass 코어 소프트웨어의 안정적인 최신 버전이 포함되어 있습니다. 또한 리포지토리에서 다른 이미지를 끌어올 수도 있습니다. 사용 가능한 모든 이미지에 대한 태그를 찾으려면 [Docker Hub](https://hub.docker.com/r/amazon/aws-iot-greengrass)의 **태그** 페이지를 확인하거나 **aws ecr list-images** 명령을 사용하십시오. 예제:  

   ```
   aws ecr list-images --region us-west-2 --registry-id 216483018798 --repository-name aws-iot-greengrass
   ```

### 컨테이너 이미지 가져오기(Windows)
<a name="docker-pull-image-windows"></a>

명령 프롬프트에서 다음 명령을 실행합니다. Windows에서 도커 명령을 사용하려면 먼저 도커 데스크톱이 실행 중이어야 합니다.

1. <a name="docker-get-login"></a>Amazon ECR의 AWS IoT Greengrass 레지스트리에 로그인합니다.

   ```
   aws ecr get-login-password --region  us-west-2 | docker login --username AWS --password-stdin https://216483018798.dkr.ecr.us-west-2.amazonaws.com
   ```

   성공하면 `Login Succeeded` 출력이 인쇄됩니다.

1. <a name="docker-docker-pull"></a> AWS IoT Greengrass 컨테이너 이미지를 검색합니다.

   ```
   docker pull 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
   ```
**참고**  
`latest` 이미지에는 Amazon Linux 2 기본 이미지에 설치된 AWS IoT Greengrass 코어 소프트웨어의 안정적인 최신 버전이 포함되어 있습니다. 또한 리포지토리에서 다른 이미지를 끌어올 수도 있습니다. 사용 가능한 모든 이미지에 대한 태그를 찾으려면 [Docker Hub](https://hub.docker.com/r/amazon/aws-iot-greengrass)의 **태그** 페이지를 확인하거나 **aws ecr list-images** 명령을 사용하십시오. 예제:  

   ```
   aws ecr list-images --region us-west-2 --registry-id 216483018798 --repository-name aws-iot-greengrass
   ```

## 2단계: Greengrass 그룹 및 코어 생성 및 구성
<a name="docker-config-gg"></a>

Docker 이미지에는 AWS IoT Greengrass 코어 소프트웨어가 설치되어 있지만 Greengrass 그룹 및 코어를 생성해야 합니다. 이 단계에는 인증서와 코어 구성 파일을 다운로드하는 작업도 포함됩니다.
+ [모듈 2: AWS IoT Greengrass 코어 소프트웨어 설치](module2.md) 섹션의 단계를 따르세요. AWS IoT Greengrass 코어 소프트웨어를 다운로드하고 실행하는 단계를 건너뜁니다. 소프트웨어와 해당 런타임 종속성은 Docker 이미지에 이미 설치되어 있습니다.

## 3단계: AWS IoT Greengrass 로컬에서 실행
<a name="docker-run-gg"></a>

그룹이 구성된 후에는 코어를 구성하고 시작할 준비가 된 것입니다. 이렇게 하는 방법을 보여 주는 단계를 알아보려면 운영 체제를 선택하십시오.

### 로컬로 Greengrass 실행(Linux)
<a name="docker-run-gg-linux"></a>

컴퓨터 터미널에서 다음 명령을 실행합니다.

1. <a name="docker-create-certs-folder"></a>장치의 보안 리소스를 위한 폴더를 생성하고 인증서와 키를 이 폴더로 옮깁니다. 다음 명령을 실행합니다. *path-to-security-files*을 보안 리소스 경로로 바꾸고 *certificateId*를 파일 이름의 인증서 ID로 대체합니다.

   ```
   mkdir /tmp/certs
   mv path-to-security-files/certificateId-certificate.pem.crt /tmp/certs
   mv path-to-security-files/certificateId-public.pem.key /tmp/certs
   mv path-to-security-files/certificateId-private.pem.key /tmp/certs
   mv path-to-security-files/AmazonRootCA1.pem /tmp/certs
   ```

1. <a name="docker-create-config-folder"></a>디바이스 구성을 위한 폴더를 생성하고 AWS IoT Greengrass 코어 구성 파일을 해당 폴더로 이동합니다. 다음 명령을 실행합니다. *path-to-config-file*을 구성 파일의 경로로 바꿉니다.

   ```
   mkdir /tmp/config
   mv path-to-config-file/config.json /tmp/config
   ```

1. <a name="docker-docker-run"></a>Docker 컨테이너에서 인증서 AWS IoT Greengrass 및 구성 파일을 시작하고 바인드 마운트합니다.

   인증서와 구성 파일의 압축을 푼 경로로 `/tmp`를 바꿉니다.

   ```
   docker run --rm --init -it --name aws-iot-greengrass \
   --entrypoint /greengrass-entrypoint.sh \
   -v /tmp/certs:/greengrass/certs \
   -v /tmp/config:/greengrass/config \
   -p 8883:8883 \
   216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
   ```

   출력은 다음 예시와 같은 형식이어야 합니다.

   ```
   Setting up greengrass daemon
   Validating hardlink/softlink protection
   Waiting for up to 30s for Daemon to start
   
   Greengrass successfully started with PID: 10
   ```

### 로컬로 Greengrass 실행(macOS)
<a name="docker-run-gg-mac"></a>

컴퓨터 터미널에서 다음 명령을 실행합니다.

1. <a name="docker-create-certs-folder"></a>장치의 보안 리소스를 위한 폴더를 생성하고 인증서와 키를 이 폴더로 옮깁니다. 다음 명령을 실행합니다. *path-to-security-files*을 보안 리소스 경로로 바꾸고 *certificateId*를 파일 이름의 인증서 ID로 대체합니다.

   ```
   mkdir /tmp/certs
   mv path-to-security-files/certificateId-certificate.pem.crt /tmp/certs
   mv path-to-security-files/certificateId-public.pem.key /tmp/certs
   mv path-to-security-files/certificateId-private.pem.key /tmp/certs
   mv path-to-security-files/AmazonRootCA1.pem /tmp/certs
   ```

1. <a name="docker-create-config-folder"></a>디바이스 구성을 위한 폴더를 생성하고 AWS IoT Greengrass 코어 구성 파일을 해당 폴더로 이동합니다. 다음 명령을 실행합니다. *path-to-config-file*을 구성 파일의 경로로 바꿉니다.

   ```
   mkdir /tmp/config
   mv path-to-config-file/config.json /tmp/config
   ```

1. <a name="docker-docker-run"></a>Docker 컨테이너에서 인증서 AWS IoT Greengrass 및 구성 파일을 시작하고 바인드 마운트합니다.

   인증서와 구성 파일의 압축을 푼 경로로 `/tmp`를 바꿉니다.

   ```
   docker run --rm --init -it --name aws-iot-greengrass \
   --entrypoint /greengrass-entrypoint.sh \
   -v /tmp/certs:/greengrass/certs \
   -v /tmp/config:/greengrass/config \
   -p 8883:8883 \
   216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
   ```

   출력은 다음 예시와 같은 형식이어야 합니다.

   ```
   Setting up greengrass daemon
   Validating hardlink/softlink protection
   Waiting for up to 30s for Daemon to start
   
   Greengrass successfully started with PID: 10
   ```

### 로컬로 Greengrass 실행(Windows)
<a name="docker-run-gg-windows"></a>

1. 장치의 보안 리소스를 위한 폴더를 생성하고 인증서와 키를 이 폴더로 옮깁니다. 명령 프롬프트에서 다음 명령을 실행합니다. *path-to-security-files*을 보안 리소스 경로로 바꾸고 *certificateId*를 파일 이름의 인증서 ID로 대체합니다.

   ```
   mkdir C:\Users\%USERNAME%\Downloads\certs
   move path-to-security-files\certificateId-certificate.pem.crt C:\Users\%USERNAME%\Downloads\certs
   move path-to-security-files\certificateId-public.pem.key C:\Users\%USERNAME%\Downloads\certs
   move path-to-security-files\certificateId-private.pem.key C:\Users\%USERNAME%\Downloads\certs
   move path-to-security-files\AmazonRootCA1.pem C:\Users\%USERNAME%\Downloads\certs
   ```

1. 디바이스 구성을 위한 폴더를 생성하고 AWS IoT Greengrass 코어 구성 파일을 해당 폴더로 이동합니다. 명령 프롬프트에서 다음 명령을 실행합니다. *path-to-config-file*을 구성 파일의 경로로 바꿉니다.

   ```
   mkdir C:\Users\%USERNAME%\Downloads\config
   move path-to-config-file\config.json C:\Users\%USERNAME%\Downloads\config
   ```

1. Docker 컨테이너에서 인증서 AWS IoT Greengrass 및 구성 파일을 시작하고 바인드 마운트합니다. 명령 프롬프트에서 다음 명령을 실행합니다.

   ```
   docker run --rm --init -it --name aws-iot-greengrass --entrypoint /greengrass-entrypoint.sh -v c:/Users/%USERNAME%/Downloads/certs:/greengrass/certs -v c:/Users/%USERNAME%/Downloads/config:/greengrass/config -p 8883:8883 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
   ```

   도커에서 `C:\` 드라이브를 도커 데몬과 공유하라는 메시지가 나타나면 이 작업을 허용하여 도커 컨테이너 내부에 `C:\` 디렉터리를 바인드 탑재합니다. 자세한 내용은 도커 설명서의 [공유 드라이브](https://docs.docker.com/docker-for-windows/#shared-drives)를 참조하십시오.

   출력은 다음 예시와 같은 형식이어야 합니다.

   ```
   Setting up greengrass daemon
   Validating hardlink/softlink protection
   Waiting for up to 30s for Daemon to start
   
   Greengrass successfully started with PID: 10
   ```

**참고**  
컨테이너가 셸을 열지 않고 즉시 종료되는 경우 이미지 시작 시 Greengrass 런타임 로그를 바인드 탑재하여 문제를 디버그할 수 있습니다. 자세한 내용은 [도커 컨테이너 외부의 Greengrass 런타임 로그를 유지하려면](#debugging-docker-persist-logs) 단원을 참조하십시오.

## 4단계: Greengrass 그룹에 대한 "컨테이너 없음" 컨테이너화 구성
<a name="docker-no-container"></a>

Docker 컨테이너 AWS IoT Greengrass 에서를 실행하는 경우 모든 Lambda 함수는 컨테이너화 없이 실행되어야 합니다. 이 단계에서는 그룹의 기본 컨테이너화를 **컨테이너 없음**으로 설정합니다. 처음으로 그룹을 배포하기 전에 이 작업을 수행해야 합니다.

1. <a name="console-gg-groups"></a> AWS IoT 콘솔 탐색 창의 **관리**에서 **Greengrass 디바이스**를 확장한 다음 **그룹(V1)을** 선택합니다.

1. <a name="group-choose-group"></a>설정을 변경하려는 그룹을 선택합니다.

1. **Lambda 함수**탭을 선택합니다.

1. **기본 Lambda 함수 런타임 환경**에서 **편집**을 선택합니다.

1. **기본 Lambda 함수 런타임 환경 편집**의 **기본 Lambda 함수 컨테이너화**에서 컨테이너화 설정을 변경합니다.

1. **저장**을 선택합니다.

변경 사항은 그룹이 배포될 때 적용됩니다.

자세한 내용은 [그룹 내 Lambda 함수의 기본 컨테이너화 설정](lambda-group-config.md#lambda-containerization-groupsettings) 단원을 참조하십시오.

**참고**  
기본적으로 Lambda 함수는 그룹 컨테이너화 설정을 사용합니다. AWS IoT Greengrass 이(가) Docker 컨테이너에서 실행 중일 때 Lambda 함수에 **컨테이너 없음** 설정을 재정의하면 배포가 실패합니다.

## 5단계: AWS IoT Greengrass Docker 컨테이너에 Lambda 함수 배포
<a name="docker-add-lambdas"></a>

수명이 긴 Lambda 함수를 Greengrass Docker 컨테이너에 배포할 수 있습니다.
+ [모듈 3(1부):의 Lambda 함수 AWS IoT Greengrass](module3-I.md)의 단계를 따라 수명이 긴 Hello World Lambda 함수를 컨테이너에 배포합니다.

## 6단계: (선택 사항) Docker 컨테이너에서 실행 중인 Greengrass와 상호 작용하는 클라이언트 장치 배포
<a name="docker-add-devices"></a>

Docker 컨테이너에서 실행 중일 AWS IoT Greengrass 때와 상호 작용하는 클라이언트 디바이스를 배포할 수도 있습니다.
+ [모듈 4: AWS IoT Greengrass 그룹의 클라이언트 디바이스와 상호 작용](module4.md)의 단계에 따라 코어에 연결하고 MQTT 메시지를 전송하는 클라이언트 장치를 배포합니다.

## AWS IoT Greengrass Docker 컨테이너 중지
<a name="docker-stop"></a>

 AWS IoT Greengrass Docker 컨테이너를 중지하려면 터미널 또는 명령 프롬프트에서 Ctrl\$1C를 누릅니다. 이 작업은 `SIGTERM`을 Greengrass 대몬 프로세스로 전송하여 Greengrass 대몬 프로세스와 해당 대몬 프로세스로 시작된 모든 Lambda 프로세스를 제거합니다. Docker 컨테이너는 `/dev/init` 프로세스를 통해 PID 1로 초기화됩니다. 이렇게 하면 남아 있는 좀비 프로세스를 제거하는 데 도움이 됩니다. 자세한 내용은 [Docker 실행 참조](https://docs.docker.com/engine/reference/commandline/run/#options)를 확인하십시오.

## Docker 컨테이너 AWS IoT Greengrass 의 문제 해결
<a name="troubleshooting-docker-gg"></a>

다음 정보를 사용하여 Docker 컨테이너 AWS IoT Greengrass 에서 실행과 관련된 문제를 해결할 수 있습니다.

### 오류: TTY가 아닌 장치에서 대화형 로그인을 수행할 수 없습니다.
<a name="docker-troubleshootin-ecr-get-login-password"></a>

**해결책:** `aws ecr get-login-password` 명령을 실행할 때 이 오류가 발생할 수 있습니다. 가장 최신의 AWS CLI 버전 2 또는 1 이상이 설치되어 있는지 확인합니다. AWS CLI 버전 2를 사용하는 것이 좋습니다. 자세한 내용은 *AWS Command Line Interface 사용자 가이드*에서 [AWS CLI설치](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)를 참조하세요.

### 오류: 알 수 없는 옵션: no-include-email
<a name="docker-troubleshooting-cli-version"></a>

**해결책:** `aws ecr get-login` 명령을 실행할 때 이 오류가 발생할 수 있습니다. 최신 AWS CLI 버전이 설치되어 있는지 확인합니다(예: 실행: `pip install awscli --upgrade --user`). Windows를 사용하고 있고 MSI 설치 관리자를 사용하여 CLI를 설치한 경우 설치 프로세스를 반복해야 합니다. 자세한 내용은 *AWS Command Line Interface 사용 설명서*의 [Microsoft Windows에 AWS Command Line Interface 설치](https://docs.aws.amazon.com/cli/latest/userguide/awscli-install-windows.html)를 참조하십시오.

### 경고: IPv4가 비활성화되어 있습니다. 네트워킹이 작동하지 않습니다.
<a name="docker-troubleshooting-ipv4-disabled"></a>

**해결 방법:** Linux 컴퓨터에서 실행할 때이 경고 또는 유사한 메시지가 표시될 수 AWS IoT Greengrass 있습니다. 이 [step](#docker-linux-enable-ipv4). AWS IoT Greengrass cloud 배포에 설명된 대로 IPv4 네트워크 전달을 활성화하면 IPv4 전달이 활성화되지 않은 경우 MQTT 통신이 작동하지 않습니다. 자세한 내용은 Docker 설명서의 [런타임에 네임스페이스 커널 파라미터(sysctls) 구성](https://docs.docker.com/engine/reference/commandline/run/#configure-namespaced-kernel-parameters-sysctls-at-runtime)을 참조하십시오.

### 오류: 방화벽이 Windows와 컨테이너 간의 파일 공유를 차단하고 있습니다.
<a name="docker-troubleshooting-firewall"></a>

**해결책:** Windows 컴퓨터에서 Docker를 실행할 때 이 오류 또는 `Firewall Detected` 메시지를 받을 수 있습니다. 이 오류는 VPN(가상 프라이빗 네트워크)에 로그인되어 있고 네트워크 설정 때문에 공유 드라이브가 탑재되지 않는 경우에도 발생할 수 있습니다. 이러한 경우에는 VPN을 끄고 Docker 컨테이너를 재실행합니다.

### <account-id><user-name>오류: GetAuthorizationToken 작업을 호출하는 동안 오류가 발생했습니다(AccessDenieException): 사용자: arn:aws:iam::<account-id>:user/<user-name>에게 수행할 권한이 없습니다: ecr:GetAuthorizationToken on resource: \$1
<a name="docker-troubleshooting-ecr-perms"></a>

Amazon ECR 리포지토리에 액세스할 충분한 권한이 없는데 `aws ecr get-login-password` 명령을 실행할 경우 이 오류가 발생할 수 있습니다. 자세한 내용은 *Amazon ECR 사용 설명서*의 [Amazon ECR 리포지토리 정책 예제](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policy-examples.html) 및 [하나의 Amazon ECR 리포지토리에 액세스](https://docs.aws.amazon.com/AmazonECR/latest/userguide/security_iam_id-based-policy-examples.html)를 참조하세요.

일반적인 AWS IoT Greengrass 문제 해결 도움말은 섹션을 참조하세요[문제 해결 AWS IoT Greengrass](gg-troubleshooting.md).

### Docker 컨테이너 AWS IoT Greengrass 에서 디버깅
<a name="debugging-docker-gg"></a>

도커 컨테이너로 문제를 디버그하려면 Greengrass 런타임 로그를 유지하거나 대화형 셸을 도커 컨테이너에 연결할 수 있습니다.

#### 도커 컨테이너 외부의 Greengrass 런타임 로그를 유지하려면
<a name="debugging-docker-persist-logs"></a>

`/greengrass/ggc/var/log` 디렉터리를 바인드 마운트한 후 AWS IoT Greengrass Docker 컨테이너를 실행할 수 있습니다. 컨테이너가 종료되거나 제거된 후에도 로그는 유지됩니다.

**Linux 또는 macOS에서는**  
호스트에서 실행 중인 [Greengrass Docker 컨테이너를 중지](#docker-stop)하고 터미널에서 다음 명령을 실행합니다. 이렇게 하면 Greengrass `log` 디렉터리가 바인드 탑재되고 Docker 이미지가 시작됩니다.  
인증서와 구성 파일의 압축을 푼 경로로 `/tmp`를 바꿉니다.  

```
docker run --rm --init -it --name aws-iot-greengrass \
      --entrypoint /greengrass-entrypoint.sh \
      -v /tmp/certs:/greengrass/certs \
      -v /tmp/config:/greengrass/config \
      -v /tmp/log:/greengrass/ggc/var/log \
      -p 8883:8883 \
      216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
```
그런 다음 Docker 컨테이너 내부에서 Greengrass가 실행되는 중에 호스트의 `/tmp/log`에서 로그를 점검하여 무슨 일이 발생했는지 확인할 수 있습니다.

**Windows**  
호스트에서 실행 중인 [Greengrass Docker 컨테이너를 중지](#docker-stop)하고 명령 프롬프트에서 다음 명령을 실행합니다. 이렇게 하면 Greengrass `log` 디렉터리가 바인드 탑재되고 Docker 이미지가 시작됩니다.  

```
cd C:\Users\%USERNAME%\Downloads
mkdir log
docker run --rm --init -it --name aws-iot-greengrass --entrypoint /greengrass-entrypoint.sh -v c:/Users/%USERNAME%/Downloads/certs:/greengrass/certs -v c:/Users/%USERNAME%/Downloads/config:/greengrass/config -v c:/Users/%USERNAME%/Downloads/log:/greengrass/ggc/var/log -p 8883:8883 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
```
그런 다음 Docker 컨테이너 내부에서 Greengrass가 실행되는 중에 호스트의 `C:/Users/%USERNAME%/Downloads/log`에서 로그를 점검하여 무슨 일이 발생했는지 확인할 수 있습니다.

#### 대화형 셸을 도커 컨테이너에 연결하려면
<a name="debugging-docker-attach-shell"></a>

대화형 쉘을 실행 중인 AWS IoT Greengrass Docker 컨테이너에 연결할 수 있습니다. 이는 Greengrass 도커 컨테이너의 상태를 조사하는 데 도움이 될 수 있습니다.

**Linux 또는 macOS에서는**  
Greengrass Docker 컨테이너가 실행되는 동안 별도의 터미널에서 다음 명령을 실행합니다.  

```
docker exec -it $(docker ps -a -q -f "name=aws-iot-greengrass") /bin/bash
```

**Windows**  
Greengrass Docker 컨테이너가 실행되는 동안 별도의 명령 프롬프트에서 다음 명령을 실행합니다.  

```
docker ps -a -q -f "name=aws-iot-greengrass"
```
*gg-container-id*를 이전 명령의 `container_id` 결과로 바꿉니다.  

```
docker exec -it gg-container-id /bin/bash
```