

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

# AWS Lambda 함수 실행
<a name="run-lambda-functions"></a>

**참고**  
AWS IoT Greengrass는 현재 Windows 코어 디바이스에서 이 기능을 지원하지 않습니다.

AWS IoT Greengrass 코어 디바이스에서 실행되는 구성 요소로 AWS Lambda 함수를 가져올 수 있습니다. 다음 경우에 이를 수행할 수 있습니다.
+ 코어 디바이스에 배포하려는 Lambda 함수에 애플리케이션 코드가 있습니다.
+ AWS IoT Greengrass V2 코어 디바이스에서 실행하려는 AWS IoT Greengrass V1 애플리케이션이 있습니다. 자세한 내용은 [2단계: AWS IoT Greengrass V1 애플리케이션 마이그레이션을 위한 AWS IoT Greengrass V2 구성 요소 생성 및 배포](set-up-v2-test-device.md#run-v1-applications) 섹션을 참조하세요.

Lambda 함수에는 다음 구성 요소에 대한 종속성이 포함되어 있습니다. 함수를 가져오는 경우 이러한 구성 요소를 종속성으로 정의할 필요는 없습니다. Lambda 함수 구성 요소를 배포하는 경우 배포에는 이러한 Lambda 구성 요소 종속성이 포함되어 있습니다.
+ [Lambda 런처 구성 요소](lambda-launcher-component.md)(`aws.greengrass.LambdaLauncher`)는 프로세스와 환경 구성을 처리합니다.
+ [Lambda 관리자 구성 요소](lambda-manager-component.md)(`aws.greengrass.LambdaManager`)는 프로세스 간 통신 및 스케일링을 처리합니다.
+ [Lambda 런타임 구성 요소](lambda-runtimes-component.md)(`aws.greengrass.LambdaRuntimes`)는 지원되는 각 Lambda 런타임에 대한 아티팩트를 제공합니다.

**Topics**
+ [요구 사항](#run-lambda-functions-requirements)
+ [Lambda 함수 수명 주기 구성](#lambda-lifecycle)
+ [Lambda 함수 컨테이너화 구성](#lambda-containerization)
+ [Lambda 함수를 구성 요소로 가져오기(콘솔)](import-lambda-function-console.md)
+ [Lambda 함수를 구성 요소로 가져오기(AWS CLI)](import-lambda-function-cli.md)

## 요구 사항
<a name="run-lambda-functions-requirements"></a>

AWS IoT Greengrass 코어 소프트웨어에서 함수를 실행하려면 코어 디바이스와 Lambda 함수가 다음과 같은 요구 사항을 충족해야 합니다.
+ <a name="core-device-lambda-function-requirements"></a>Lambda 함수를 실행하려면 코어 디바이스가 요구 사항을 충족해야 합니다. 코어 디바이스에서 컨테이너화된 Lambda 함수를 실행하려면 디바이스가 요구 사항을 충족해야 합니다. 자세한 내용은 [Lambda 함수 요구 사항](setting-up.md#greengrass-v2-lambda-requirements) 섹션을 참조하세요.
+ 코어 디바이스에 Lambda 함수가 사용하는 프로그래밍 언어를 설치해야 합니다.
**작은 정보**  
프로그래밍 언어를 설치하는 구성 요소를 생성한 다음 해당 구성 요소를 Lambda 함수 구성 요소의 종속성으로 지정할 수 있습니다. Greengrass는 Python, Node.js, Java 런타임의 모든 Lambda 지원 버전을 지원합니다. Greengrass는 더 이상 사용되지 않는 Lambda 런타임 버전에 추가 제한 사항을 적용하지 않습니다. AWS IoT Greengrass에서는 이러한 더 이상 사용되지 않는 런타임을 사용하는 Lambda 함수를 실행할 수 있지만 AWS Lambda에서 이를 생성할 수는 없습니다. Lambda 런타임용 AWS IoT Greengrass 지원에 대한 자세한 내용은 [AWS Lambda 함수 실행](#run-lambda-functions) 섹션을 참조하세요.

## Lambda 함수 수명 주기 구성
<a name="lambda-lifecycle"></a>

Lambda 함수 수명 주기에 따라 함수가 시작되는 시점과 컨테이너를 생성 및 사용하는 방법이 결정됩니다. 수명 주기에 따라 AWS IoT Greengrass 코어 소프트웨어가 함수 핸들러 외부에 있는 변수와 사전 처리 논리를 유지하는 방법도 결정됩니다.

AWS IoT Greengrass는 온디맨드(기본값)와 수명이 긴 수명 주기를 지원합니다.
+ **온디맨드** 함수는 호출되면 시작되고 실행할 태스크가 남아 있지 않을 때 종료됩니다. 함수를 간접적으로 호출할 때마다 샌드박스라고도 하는 별도의 컨테이너가 생성되어 간접 호출을 처리합니다. 단, 기존 컨테이너를 재사용할 수 있는 경우는 예외입니다. 모든 컨테이너는 함수에 전송하는 데이터를 처리할 수 있습니다.

  온디맨드 함수의 다중 호출은 동시에 실행할 수 있습니다.

  함수 핸들러 외부에서 정의한 변수 및 사전 처리 논리는 새 컨테이너가 생성될 때 유지되지 않습니다.
+ **수명이 긴**(또는 *고정된*) 함수는 AWS IoT Greengrass 코어 소프트웨어가 시작될 때 시작되며 단일 컨테이너에서 실행됩니다. 동일한 컨테이너가 함수에 전송하는 모든 데이터를 처리합니다.

  AWS IoT Greengrass 코어 소프트웨어가 이전 호출을 실행할 때까지 다중 호출은 대기 상태가 됩니다.

  함수 핸들러 외부에서 정의한 변수 및 사전 처리 논리는 모든 핸들러 호출 시 유지됩니다.

  초기 입력 없이 작업을 시작해야 하는 경우에는 수명이 긴 Lambda 함수를 사용합니다. 예를 들어 수명이 긴 함수는 기계 학습 모델을 로드하고 처리하기 시작하여 함수가 디바이스 데이터를 수신하는 경우 준비된 상태가 되도록 할 수 있습니다.
**참고**  
수명이 긴 함수는 핸들러 호출할 때마다 적용되는 제한 시간이 있습니다. 무기한으로 실행되는 코드를 호출하려면 핸들러 외부에서 시작해야 합니다. 핸들러 외부에 함수 초기화를 방지할 수 있는 차단 코드가 없는지 확인하세요.  
이러한 함수는 배포 도중 또는 재부팅과 같이 AWS IoT Greengrass 코어 소프트웨어가 중지되지 않는 한 실행됩니다. 이러한 함수는 함수에 잡히지 않은 예외가 발생하거나 메모리 제한을 초과하거나 핸들러 제한 시간과 같은 오류 상태가 발생하는 경우에는 실행되지 않습니다.

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

## Lambda 함수 컨테이너화 구성
<a name="lambda-containerization"></a>

기본적으로 Lambda 함수는 AWS IoT Greengrass 컨테이너의 내부에서 실행됩니다. Greengrass 컨테이너는 함수와 호스트 사이를 격리합니다. 이러한 격리는 호스트와 컨테이너의 함수 모두에 대한 보안을 강화합니다.

컨테이너화 없이 실행해야 하는 사용 사례가 아니라면 Lambda 함수를 Greengrass 컨테이너에서 실행하는 것이 좋습니다. Greengrass 컨테이너에서 Lambda 함수를 실행하면 리소스에 대한 액세스를 제한하는 방법을 더 잘 제어할 수 있습니다.

다음 경우에는 컨테이너화하지 않고 Lambda 함수를 실행할 수 있습니다.
+ 컨테이너 모드를 지원하지 않는 디바이스에서 AWS IoT Greengrass를 실행하려고 합니다. 특수한 Linux 배포를 사용하거나 오래된 이전 커널 버전을 사용하려는 경우를 예로 들 수 있습니다.
+ 자체 OverlayFS를 사용하는 다른 컨테이너 환경에서 Lambda 함수를 실행하려 하지만 Greengrass 컨테이너에서 실행 시 OverlayFS 충돌이 발생하는 경우.
+ 배포 시점에 경로를 결정할 수 없거나 배포 이후 경로가 변경될 수 있는 로컬 리소스에 액세스해야 합니다. 해당 리소스의 예로 플러그형 디바이스를 들 수 있습니다.
+ 프로세스로 작성된 이전 애플리케이션이 있고 이를 Greengrass 컨테이너에서 실행하는 경우 문제가 발생합니다.


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

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

Lambda 함수를 배포할 때 컨테이너화를 변경하면 함수가 예상대로 작동하지 않을 수 있습니다. Lambda 함수가 새로운 컨테이너화 설정에서 더 이상 사용할 수 없는 로컬 리소스를 사용하는 경우 배포가 실패합니다.
+ Lambda 함수를 Greengrass 컨테이너에서 실행하는 방식에서 컨테이너화 없이 실행하는 방식으로 변경하면 해당 함수의 메모리 제한이 삭제됩니다. 연결된 로컬 리소스를 사용하기보다 파일 시스템에 직접 액세스해야 합니다. Lambda 함수를 배포하기 전에 연결된 모든 리소스를 제거해야 합니다.
+ Lambda 함수를 컨테이너화 없이 실행하는 방식에서 컨테이너에서 실행하는 방식으로 변경하면 Lambda 함수는 파일 시스템에 대한 직접 액세스 권한을 상실합니다. 각 함수에 대한 메모리 제한을 정의하거나 기본 16MB 메모리 제한을 수락해야 합니다. 배포 시 각 Lambda 함수에 대해 이러한 설정을 구성할 수 있습니다.

Lambda 함수 구성 요소의 컨테이너화 설정을 변경하려면 구성 요소 배포 시 `containerMode` 구성 파라미터의 값을 다음 옵션 중 하나로 설정합니다.<a name="lambda-function-component-container-mode-parameter"></a>
+ `NoContainer` – 구성 요소가 격리된 런타임 환경에서 실행되지 않습니다.
+ `GreengrassContainer` – 구성 요소가 AWS IoT Greengrass 컨테이너 내부의 격리된 런타임 환경에서 실행됩니다.

구성 요소를 배포하고 구성하는 방법에 대한 자세한 내용은 [디바이스에 AWS IoT Greengrass 구성 요소 배포](manage-deployments.md) 및 [구성 요소 구성 업데이트](update-component-configurations.md) 섹션을 참조하세요.

# Lambda 함수를 구성 요소로 가져오기(콘솔)
<a name="import-lambda-function-console"></a>

[AWS IoT Greengrass 콘솔](https://console.aws.amazon.com/greengrass)을 사용하여 Lambda 함수 구성 요소를 생성할 때 기존 AWS Lambda 함수를 가져온 다음 Greengrass 디바이스에서 실행되는 구성 요소를 생성하도록 구성합니다.

시작하기 전에 Greengrass 디바이스에서 Lambda 함수 실행 [요구 사항](https://docs.aws.amazon.com/greengrass/v2/developerguide/run-lambda-functions.html#run-lambda-functions-requirements)을 검토하세요.

**Topics**
+ [1단계: 가져올 Lambda 함수 선택](#import-lambda-console-choose-function)
+ [2단계: Lambda 함수 파라미터 구성](#import-lambda-console-configure-function-parameters)
+ [3단계: (선택 사항) Lambda 함수에 지원되는 플랫폼 지정](#import-lambda-console-configure-platforms)
+ [4단계: (선택 사항) Lambda 함수의 구성 요소 종속성 지정](#import-lambda-console-configure-dependencies)
+ [5단계: (선택 사항) 컨테이너에서 Lambda 함수 실행](#import-lambda-console-run-isolated)
+ [6단계: Lambda 함수 구성 요소 생성](#import-lambda-console-create-deploy)

## 1단계: 가져올 Lambda 함수 선택
<a name="import-lambda-console-choose-function"></a>

1. [AWS IoT Greengrass 콘솔](https://console.aws.amazon.com/greengrass) 탐색 메뉴에서 **구성 요소**를 선택합니다.

1. **구성 요소** 페이지에서 **구성 요소 생성**을 선택합니다.

1. **구성 요소 생성** 페이지의 **구성 요소 정보**에서 **Lambda 함수 가져오기**를 선택합니다.

1. **Lambda 함수**에서 가져오려는 Lambda 함수를 검색하고 선택합니다.

   AWS IoT Greengrass 는 Lambda 함수의 이름으로 구성 요소를 생성합니다.

1. **Lambda 함수 버전**에서 가져올 버전을 선택합니다. `$LATEST` 등과 같은 Lambda 별칭은 선택할 수 없습니다.

   AWS IoT Greengrass 는 Lambda 함수 버전을 유효한 의미 체계 버전으로 사용하여 구성 요소를 생성합니다. 예를 들어 함수 버전이 `3`인 경우 구성 요소 버전은 `3.0.0`가 됩니다.

## 2단계: Lambda 함수 파라미터 구성
<a name="import-lambda-console-configure-function-parameters"></a>

**구성 요소 생성** 페이지의 **Lambda 함수 구성**에서 Lambda 함수를 실행하는 데 사용할 다음 파라미터를 구성합니다.

1. (선택 사항) Lambda 함수가 작업 메시지를 구독하는 이벤트 소스 목록을 추가합니다. 이벤트 소스를 지정하여이 함수가 로컬 게시/구독 메시지 및 AWS IoT Core MQTT 메시지를 구독하도록 할 수 있습니다. Lambda 함수는 이벤트 소스에서 메시지를 수신할 때 직접 호출됩니다.
**참고**  
이 함수를 다른 Lambda 함수 또는 구성 요소의 메시지에 구독하려면 이 Lambda 함수 구성 요소를 배포할 때 [레거시 구독 라우터 구성 요소](legacy-subscription-router-component.md)를 배포합니다. 레거시 구독 라우터 구성 요소를 배포하는 경우 Lambda 함수가 사용하는 구독을 지정합니다.

   **이벤트 소스**에서 다음을 수행하여 이벤트 소스 추가:

   1. 추가하는 각 이벤트 소스에 대해 다음 옵션 지정: 
      + **주제** - 메시지에 대해 구독하는 주제입니다.
      + **유형** - 이벤트 소스의 유형입니다. 다음 옵션 중 하나를 선택합니다.
        + **로컬 게시/구독** - 로컬 게시/구독 메시지를 구독합니다.

          [Greengrass nucleus](greengrass-nucleus-component.md) v2.6.0 이상 및 [Lambda 관리자](lambda-manager-component.md) v2.2.5 이상을 사용하는 경우 이 유형을 지정할 때 **주제**에서 MQTT 주제 와일드카드(`+` 및 `#`)를 사용할 수 있습니다.
        + **AWS IoT Core MQTT** - AWS IoT Core MQTT 메시지를 구독합니다.

          이 유형을 지정할 때 **주제**에서 MQTT 주제 와일드카드(`+` 및 `#`)를 사용할 수 있습니다.

   1. 다른 이벤트 소스를 추가하려면 **이벤트 소스 추가**를 선택한 다음 이전 단계를 반복합니다. 이벤트 소스를 제거하려면 제거하려는 이벤트 소스 옆에 있는 **제거**를 선택합니다.

1. **제한 시간(초)**에 고정되지 않은 Lambda 함수가 제한 시간이 되기 전에 먼저 실행될 수 있는 최대 시간을 초 단위로 입력합니다. 기본값은 3초입니다.

1. **고정**에서 Lambda 함수 구성 요소가 고정되었는지 여부를 선택합니다. 기본값은 **True**입니다.<a name="lambda-function-lifecycle-type"></a>
   + 고정(또는 수명이 긴) Lambda 함수는가 AWS IoT Greengrass 시작되어 자체 컨테이너에서 계속 실행될 때 시작됩니다.
   + 고정되지 않은(또는 온디맨드) Lambda 함수는 작업 항목을 수신한 경우에만 시작되고 지정된 최대 유휴 시간 동안 유휴 상태로 유지된 후에 종료됩니다. 함수에 여러 작업 항목이 있는 경우 AWS IoT Greengrass 코어 소프트웨어는 함수의 여러 인스턴스를 생성합니다.

1. (선택 사항) **추가 파라미터**에서 다음 Lambda 함수 파라미터를 설정합니다.
   + **상태 제한 시간(초)** - Lambda 함수 구성 요소가 상태 업데이트를 Lambda 관리자 구성 요소로 전송하는 간격(초)입니다. 이 파라미터는 고정된 함수에만 적용됩니다. 기본값은 60초입니다.
   + **최대 대기열 크기** - Lambda 함수 구성 요소에 대한 메시지 대기열의 최대 크기입니다. AWS IoT Greengrass 코어 소프트웨어는 Lambda 함수를 실행하여 각 메시지를 사용할 수 있을 때까지 메시지를 FIFO(선입선출) 대기열에 저장합니다. 기본값은 1,000개 메시지입니다.
   + **최대 인스턴스 수** - 고정되지 않은 Lambda 함수가 동시에 실행할 수 있는 최대 인스턴스 수입니다. 기본값은 인스턴스 100개입니다.
   + **최대 유휴 시간(초)** - AWS IoT Greengrass 코어 소프트웨어가 프로세스를 중지하기 전에 고정되지 않은 Lambda 함수가 유휴 상태가 될 수 있는 초 단위의 최대 시간입니다. 기본값은 60초입니다.
   + **인코딩 유형** - Lambda 함수가 지원하는 페이로드의 유형입니다. 다음 옵션 중 하나를 선택합니다.
     + **JSON**
     + **이진**

     기본값은 JSON입니다.

1. (선택 사항) 실행 시 Lambda 함수에 전달할 명령줄 인수 목록을 지정합니다.

   1. **추가 파라미터, 프로세스 인수**에서 **인수 추가**를 선택합니다.

   1. 추가하는 각 인수에 대해 함수에 전달할 인수를 입력합니다.

   1. 인수를 제거하려면 제거하려는 인수 옆에 있는 **제거**를 선택합니다.

1. (선택 사항) Lambda 함수가 실행될 때 사용할 수 있는 환경 변수를 지정합니다. 환경 변수를 사용하면 함수 코드를 변경할 필요 없이 구성 설정을 저장하고 업데이트할 수 있습니다.

   1. **추가 파라미터, 환경 변수**에서 **환경 변수 추가**를 선택합니다.

   1. 추가하는 각 환경 변수에 대해 다음 옵션을 지정합니다.
      + **키** - 변수 이름.
      + **값** - 이 변수의 기본값.

   1. 환경 변수를 제거하려면 제거하려는 환경 변수 옆에 있는 **제거**를 선택합니다.

## 3단계: (선택 사항) Lambda 함수에 지원되는 플랫폼 지정
<a name="import-lambda-console-configure-platforms"></a>

모든 코어 디바이스에는 운영 체제 및 아키텍처에 대한 속성이 있습니다. Lambda 함수 구성 요소를 배포할 때 AWS IoT Greengrass 코어 소프트웨어는 지정한 플랫폼 값을 코어 디바이스의 플랫폼 속성과 비교하여 Lambda 함수가 해당 디바이스에서 지원되는지 여부를 결정합니다.

**참고**  
Greengrass nucleus 구성 요소를 코어 디바이스에 배포할 때 사용자 지정 플랫폼 속성을 지정할 수 있습니다. 자세한 내용은 [Greengrass nucleus 구성 요소](greengrass-nucleus-component.md)의 [플랫폼 재정의 파라미터](greengrass-nucleus-component.md#greengrass-nucleus-component-configuration-platform-overrides)를 참조하세요.

**Lambda 함수 구성, 추가 파라미터, 플랫폼**에서 다음을 수행하여 이 Lambda 함수가 지원하는 플랫폼을 지정합니다.

1. 각 플랫폼에 대해 다음 옵션을 지정합니다.
   + **운영 체제** - 플랫폼의 운영 체제 이름입니다. 현재 지원되는 값은 `linux`입니다.
   + **아키텍처** - 플랫폼의 프로세서 아키텍처입니다. 지원되는 값은 다음과 같습니다.
     + `amd64`
     + `arm`
     + `aarch64`
     + `x86`

1. 다른 플랫폼을 추가하려면 **플랫폼 추가**를 선택하고 이전 단계를 반복합니다. 지원되는 플랫폼을 제거하려면 제거할 플랫폼 옆에 있는 **제거**를 선택합니다.

## 4단계: (선택 사항) Lambda 함수의 구성 요소 종속성 지정
<a name="import-lambda-console-configure-dependencies"></a>

구성 요소 종속성은 함수가 사용하는 추가 AWS제공 구성 요소 또는 사용자 지정 구성 요소를 식별합니다. Lambda 함수 구성 요소를 배포할 때 배포에는 함수에서 실행하는 이러한 종속성이 포함됩니다.

**중요**  <a name="import-v1-lambda-note"></a>
 AWS IoT Greengrass V1에서 실행하기 위해 생성한 Lambda 함수를 가져오려면 보안 암호, 로컬 섀도우, 스트림 관리자 등 함수가 사용하는 기능에 대한 개별 구성 요소 종속성을 정의해야 합니다. 종속성 상태가 변경되는 경우 Lambda 함수 구성 요소가 다시 시작되도록 이러한 구성 요소를 [하드 종속성](component-recipe-reference.md)으로 정의합니다. 자세한 내용은 [V1 Lambda 함수 가져오기](set-up-v2-test-device.md#run-v1-lambda-functions) 단원을 참조하십시오.

**Lambda 함수 구성, 추가 파라미터, 구성 요소 종속성**에서 다음 단계를 완료하여 Lambda 함수의 구성 요소 종속성을 지정합니다.

1.  **종속성 추가**를 선택합니다.

1. 추가하는 각 구성 요소 종속성에 대해 다음 옵션을 지정합니다.
   + **구성 요소 이름** - 구성 요소 이름입니다. 예를 들어 **aws.greengrass.StreamManager**를 입력하여 [스트림 관리자 구성 요소](stream-manager-component.md)를 포함합니다.
   + **버전 요구사항** – 구성 요소 종속성의 호환 버전을 식별하는 npm 스타일 의미 체계 버전 제약 조건입니다. 단일 버전 또는 여러 버전 범위를 지정할 수 있습니다. 예를 들어 **^1.0.0**을 입력하여 이 Lambda 함수가 스트림 관리자 구성 요소의 첫 번째 메이저 버전에 따라 달라지도록 지정합니다. 의미 체계 버전 제약 조건에 대한 자세한 내용은 [npm semver 계산기](https://semver.npmjs.com/)를 참조하세요.
   + **유형** - 종속성의 유형입니다. 다음 옵션 중 하나를 선택합니다.
     + **하드** – 종속성 상태가 변경되면 Lambda 함수 구성 요소가 다시 시작됩니다. 이는 기본 선택입니다.
     + **소프트** – 종속성 상태가 변경되면 Lambda 함수 구성 요소가 다시 시작되지 않습니다.

1. 구성 요소 종속성을 제거하려면 구성 요소 종속성 옆에 있는 **제거**를 선택합니다.

## 5단계: (선택 사항) 컨테이너에서 Lambda 함수 실행
<a name="import-lambda-console-run-isolated"></a>

기본적으로 Lambda 함수는 AWS IoT Greengrass 코어 소프트웨어 내의 격리된 런타임 환경에서 실행됩니다. 격리 없이(**컨테이너 없음** 모드) Lambda 함수를 프로세스로 실행하도록 선택할 수도 있습니다.

**Linux 프로세스 구성**의 **격리 모드**에서 다음 옵션 중에서 선택하여 Lambda 함수의 컨테이너화 선택:
+ **Greengrass 컨테이너** - Lambda 함수가 컨테이너에서 실행됩니다. 이는 기본 선택입니다.
+ **컨테이너 없음** - Lambda 함수가 격리 없이 프로세스로 실행됩니다.

컨테이너에서 Lambda 함수를 실행하는 경우 다음 단계를 완료하여 Lambda 함수에 대한 프로세스 구성을 구성합니다.

1. 컨테이너에서 사용할 수 있는 메모리의 양과 시스템 리소스(예: 볼륨 및 디바이스)를 구성할 수 있습니다.

   **컨테이너 파라미터**에서 다음을 수행합니다.

   1. **메모리 크기**에 컨테이너에 할당할 메모리 크기를 입력합니다. 메모리 크기를 **MB** 또는 **KB** 단위로 지정할 수 있습니다.

   1. **읽기 전용 sys 폴더**에서 컨테이너가 디바이스의 `/sys` 폴더에서 정보를 읽을 수 있는지 여부를 선택합니다. 기본값은 **False**입니다.

1. (선택 사항) 컨테이너화된 Lambda 함수가 액세스할 수 있는 로컬 볼륨을 구성합니다. 볼륨을 정의하면 AWS IoT Greengrass 코어 소프트웨어가 소스 파일을 컨테이너 내부의 대상에 탑재합니다.

   1. **볼륨**에서 **볼륨 추가**를 선택합니다.

   1. 추가하는 각 볼륨에 대해 다음 옵션 지정:
      + **물리적 볼륨** - 코어 디바이스의 소스 폴더 경로입니다.
      + **논리적 볼륨** - 컨테이너의 대상 폴더 경로입니다.
      + **권한** – (선택 사항) 컨테이너에서 소스 폴더에 액세스할 수 있는 권한입니다. 다음 옵션 중 하나를 선택합니다.
        + **읽기 전용** - Lambda 함수에 소스 폴더에 대한 읽기 전용 액세스 권한이 있습니다. 이는 기본 선택입니다.
        + **읽기-쓰기** - Lambda 함수에 소스 폴더에 대한 읽기-쓰기 액세스 권한이 있습니다.
      + **그룹 소유자 추가** – (선택 사항) Lambda 함수 구성 요소를 실행하는 시스템 그룹을 소스 폴더의 소유자로 추가할지 여부입니다. 기본값은 **False**입니다.

   1. 볼륨을 제거하려면 제거하려는 볼륨 옆에 있는 **제거**를 선택합니다.

1. (선택 사항) 컨테이너화된 Lambda 함수가 액세스할 수 있는 로컬 시스템 디바이스를 구성합니다.

   1. **디바이스**에서 **디바이스 추가**를 선택합니다.

   1. 추가하는 각 디바이스에 대해 다음 옵션 지정:
      + **탑재 경로** - 코어 디바이스의 시스템 디바이스 경로입니다.
      + **권한** – (선택 사항) 컨테이너에서 시스템 디바이스에 액세스할 수 있는 권한입니다. 다음 옵션 중 하나를 선택합니다.
        + **읽기 전용** - Lambda 함수에 시스템 디바이스에 대한 읽기 전용 액세스 권한이 있습니다. 이는 기본 선택입니다.
        + **읽기-쓰기** - Lambda 함수에 소스 폴더에 대한 읽기-쓰기 액세스 권한이 있습니다.
      + **그룹 소유자 추가** – (선택 사항) Lambda 함수 구성 요소를 실행하는 시스템 그룹을 시스템 디바이스의 소유자로 추가할지 여부입니다. 기본값은 **False**입니다.

## 6단계: Lambda 함수 구성 요소 생성
<a name="import-lambda-console-create-deploy"></a>

Lambda 함수 구성 요소에 대한 설정을 구성한 후 **생성**을 선택하여 새 구성 요소 생성을 완료합니다.

코어 디바이스에서 Lambda 함수를 실행하기 위해 코어 디바이스에 새 구성 요소를 배포할 수 있습니다. 자세한 내용은 [디바이스에 AWS IoT Greengrass 구성 요소 배포](manage-deployments.md) 단원을 참조하십시오.

# Lambda 함수를 구성 요소로 가져오기(AWS CLI)
<a name="import-lambda-function-cli"></a>

[CreateComponentVersion](https://docs.aws.amazon.com/greengrass/v2/APIReference/API_CreateComponentVersion.html) 작업을 사용하여 Lambda 함수에서 구성 요소를 생성합니다. 이 작업을 직접적으로 호출할 때 `lambdaFunction`을 지정하여 Lambda 함수를 가져옵니다.

**Topics**
+ [1단계: Lambda 함수 구성 정의](#create-lambda-function-configuration-cli)
+ [2단계: Lambda 함수 구성 요소 생성](#create-lambda-component-cli)

## 1단계: Lambda 함수 구성 정의
<a name="create-lambda-function-configuration-cli"></a>

1. `lambda-function-component.json`이라는 파일을 만들고 다음 JSON을 파일로 복사합니다. `lambdaArn`을 가져올 Lambda 함수의 ARN으로 바꿉니다.

   ```
   {
     "lambdaFunction": {
       "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1"
     }
   }
   ```
**중요**  
가져올 함수의 버전이 포함된 ARN을 지정해야 합니다. `$LATEST`같은 버전 별칭을 사용할 수 없습니다.

1. (선택 사항) 구성 요소의 이름(`componentName`)을 지정합니다. 이 파라미터를 생략하면가 Lambda 함수의 이름으로 구성 요소를 AWS IoT Greengrass 생성합니다.

   ```
   {
     "lambdaFunction": {
       "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1",
       "componentName": "com.example.HelloWorldLambda"
     }
   }
   ```

1. (선택 사항) 구성 요소의 버전(`componentVersion`)을 지정합니다. 이 파라미터를 생략하면는 Lambda 함수 버전을 유효한 의미 체계 버전으로 사용하여 구성 요소를 AWS IoT Greengrass 생성합니다. 예를 들어 함수 버전이 `3`인 경우 구성 요소 버전은 `3.0.0`가 됩니다.
**참고**  
<a name="component-version-uniqueness-para"></a>업로드하는 각 구성 요소 버전은 고유해야 합니다. 업로드한 후에는 편집할 수 없으므로 올바른 구성 요소 버전을 업로드해야 합니다.  
<a name="semver-para"></a>AWS IoT Greengrass 는 구성 요소에 의미 체계 버전을 사용합니다. *시맨틱 버전은 메이저*.*마이너*.*패치* 번호 시스템을 따릅니다. 예를 들어 `1.0.0` 버전은 구성 요소의 첫 번째 주요 릴리스를 나타냅니다. 자세한 내용은 [의미 체계 버전 사양](https://semver.org/)을 참조하세요.

   ```
   {
     "lambdaFunction": {
       "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1",
       "componentName": "com.example.HelloWorldLambda",
       "componentVersion": "1.0.0"
     }
   }
   ```

1. (선택 사항) 이 Lambda 함수가 지원하는 플랫폼을 지정합니다. 각 플랫폼에는 플랫폼을 식별하는 속성 맵이 포함되어 있습니다. 모든 코어 디바이스에는 운영 체제(`os`) 및 아키텍처(`architecture`)에 대한 속성이 있습니다. AWS IoT Greengrass 코어 소프트웨어는 다른 플랫폼 속성을 추가할 수 있습니다. [Greengrass nucleus 구성 요소](greengrass-nucleus-component.md)를 코어 디바이스에 배포할 때 사용자 지정 플랫폼 속성을 지정할 수 있습니다. 해결 방법:

   1. `lambda-function-component.json`의 Lambda 함수에 플랫폼 목록(`componentPlatforms`)을 추가합니다.

      ```
      {
        "lambdaFunction": {
          "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1",
          "componentName": "com.example.HelloWorldLambda",
          "componentVersion": "1.0.0",
          "componentPlatforms": [
          
          ]
        }
      }
      ```

   1. 지원되는 각 플랫폼을 목록에 추가합니다. 각 플랫폼에는 식별할 수 있는 친숙한 `name` 및 속성 맵이 있습니다. 다음 예제에서는 이 함수가 Linux를 실행하는 x86 디바이스를 지원하도록 지정합니다.

      ```
      {
        "name": "Linux x86",
        "attributes": {
          "os": "linux",
          "architecture": "x86"
        }
      }
      ```

      `lambda-function-component.json`에는 다음 예제와 유사한 문서가 포함될 수 있습니다.

      ```
      {
        "lambdaFunction": {
          "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1",
          "componentName": "com.example.HelloWorldLambda",
          "componentVersion": "1.0.0",
          "componentPlatforms": [
            {
              "name": "Linux x86",
              "attributes": {
                "os": "linux",
                "architecture": "x86"
              }
            }
          ]
        }
      }
      ```

1. (선택 사항) Lambda 함수의 구성 요소 종속성을 지정합니다. Lambda 함수 구성 요소를 배포할 때 배포에는 함수에서 실행하는 이러한 종속성이 포함됩니다.
**중요**  <a name="import-v1-lambda-note"></a>
 AWS IoT Greengrass V1에서 실행하기 위해 생성한 Lambda 함수를 가져오려면 보안 암호, 로컬 섀도우, 스트림 관리자 등 함수가 사용하는 기능에 대한 개별 구성 요소 종속성을 정의해야 합니다. 종속성 상태가 변경되는 경우 Lambda 함수 구성 요소가 다시 시작되도록 이러한 구성 요소를 [하드 종속성](component-recipe-reference.md)으로 정의합니다. 자세한 내용은 [V1 Lambda 함수 가져오기](set-up-v2-test-device.md#run-v1-lambda-functions) 단원을 참조하십시오.

   해결 방법:

   1. `lambda-function-component.json`의 Lambda 함수에 구성 요소 종속성 맵(`componentDependencies`)을 추가합니다.

      ```
      {
        "lambdaFunction": {
          "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1",
          "componentName": "com.example.HelloWorldLambda",
          "componentVersion": "1.0.0",
          "componentPlatforms": [
            {
              "name": "Linux x86",
              "attributes": {
                "os": "linux",
                "architecture": "x86"
              }
            }
          ],
          "componentDependencies": {
            
          }
        }
      }
      ```

   1. 맵에 각 구성 요소 종속성을 추가합니다. 구성 요소 이름을 키로 지정하고 다음 파라미터를 사용하여 객체 지정:
      + `versionRequirement` – 구성 요소 종속성의 호환 버전을 식별하는 npm 스타일 의미 체계 버전 제약 조건입니다. 단일 버전 또는 여러 버전 범위를 지정할 수 있습니다. 의미 체계 버전 제약 조건에 대한 자세한 내용은 [npm semver 계산기](https://semver.npmjs.com/)를 참조하세요.
      + `dependencyType` – (선택 사항) 종속성의 유형입니다. 다음 중에서 선택합니다.
        + `SOFT` – 종속성 상태가 변경되면 Lambda 함수 구성 요소가 다시 시작되지 않습니다.
        + `HARD` – 종속성 상태가 변경되면 Lambda 함수 구성 요소가 다시 시작됩니다.

        기본값은 `HARD`입니다.

      다음 예제에서는 이 Lambda 함수가 [스트림 관리자 구성 요소](stream-manager-component.md)의 첫 번째 메이저 버전에 따라 달라지도록 지정합니다. 스트림 관리자가 다시 시작하거나 업데이트하면 Lambda 함수 구성 요소가 다시 시작됩니다.

      ```
      {
        "aws.greengrass.StreamManager": {
          "versionRequirement": "^1.0.0",
          "dependencyType": "HARD"
        }
      }
      ```

      `lambda-function-component.json`에는 다음 예제와 유사한 문서가 포함될 수 있습니다.

      ```
      {
        "lambdaFunction": {
          "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1",
          "componentName": "com.example.HelloWorldLambda",
          "componentVersion": "1.0.0",
          "componentPlatforms": [
            {
              "name": "Linux x86",
              "attributes": {
                "os": "linux",
                "architecture": "x86"
              }
            }
          ],
          "componentDependencies": {
            "aws.greengrass.StreamManager": {
              "versionRequirement": "^1.0.0",
              "dependencyType": "HARD"
            }
          }
        }
      }
      ```

1. (선택 사항) 함수 실행에 사용할 Lambda 함수 파라미터를 구성합니다. 환경 변수, 메시지 이벤트 소스, 제한 시간 및 컨테이너 설정과 같은 옵션을 구성할 수 있습니다. 해결 방법:

   1. Lambda 파라미터 객체(`componentLambdaParameters`)를 `lambda-function-component.json`의 Lambda 함수에 추가합니다.

      ```
      {
        "lambdaFunction": {
          "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1",
          "componentName": "com.example.HelloWorldLambda",
          "componentVersion": "1.0.0",
          "componentPlatforms": [
            {
              "name": "Linux x86",
              "attributes": {
                "os": "linux",
                "architecture": "x86"
              }
            }
          ],
          "componentDependencies": {
            "aws.greengrass.StreamManager": {
              "versionRequirement": "^1.0.0",
              "dependencyType": "HARD"
            }
          },
          "componentLambdaParameters": {
          
          }
        }
      }
      ```

   1. (선택 사항) Lambda 함수가 작업 메시지를 구독하는 이벤트 소스를 지정합니다. 이벤트 소스를 지정하여이 함수가 로컬 게시/구독 메시지 및 AWS IoT Core MQTT 메시지를 구독하도록 할 수 있습니다. Lambda 함수는 이벤트 소스에서 메시지를 수신할 때 직접 호출됩니다.
**참고**  
이 함수를 다른 Lambda 함수 또는 구성 요소의 메시지에 구독하려면 이 Lambda 함수 구성 요소를 배포할 때 [레거시 구독 라우터 구성 요소](legacy-subscription-router-component.md)를 배포합니다. 레거시 구독 라우터 구성 요소를 배포하는 경우 Lambda 함수가 사용하는 구독을 지정합니다.

      해결 방법:

      1. Lambda 함수 파라미터에 이벤트 소스 목록(`eventSources`)을 추가합니다.

         ```
         {
           "lambdaFunction": {
             "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1",
             "componentName": "com.example.HelloWorldLambda",
             "componentVersion": "1.0.0",
             "componentPlatforms": [
               {
                 "name": "Linux x86",
                 "attributes": {
                   "os": "linux",
                   "architecture": "x86"
                 }
               }
             ],
             "componentDependencies": {
               "aws.greengrass.StreamManager": {
                 "versionRequirement": "^1.0.0",
                 "dependencyType": "HARD"
               }
             },
             "componentLambdaParameters": {
               "eventSources": [
               
               ]
             }
           }
         }
         ```

      1. 목록에 각 이벤트 소스를 추가합니다. 각 이벤트 소스에는 다음 파라미터가 있습니다.
         + `topic` - 메시지에 대해 구독하는 주제입니다.
         + `type` - 이벤트 소스의 유형입니다. 다음 옵션 중 하나를 선택합니다.
           + `PUB_SUB` – 로컬 게시/구독 메시지를 구독합니다.

             [Greengrass nucleus](greengrass-nucleus-component.md) v2.6.0 이상 및 [Lambda 관리자](lambda-manager-component.md) v2.2.5 이상을 사용하는 경우 이 유형을 지정할 때 `topic`에서 MQTT 주제 와일드카드(`+` 및 `#`)를 사용할 수 있습니다.
           + `IOT_CORE` - AWS IoT Core MQTT 메시지를 구독합니다.

             이 유형을 지정할 때 `topic`에서 MQTT 주제 와일드카드(`+` 및 `#`)를 사용할 수 있습니다.

           다음 예시에서는 주제 필터와 일치하는 `hello/world/+` 주제에 대해 AWS IoT Core MQTT를 구독합니다.

           ```
           {
             "topic": "hello/world/+",
             "type": "IOT_CORE"
           }
           ```

           `lambda-function-component.json`의 경우 다음 예제와 비슷할 것입니다.

           ```
           {
             "lambdaFunction": {
               "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1",
               "componentName": "com.example.HelloWorldLambda",
               "componentVersion": "1.0.0",
               "componentPlatforms": [
                 {
                   "name": "Linux x86",
                   "attributes": {
                     "os": "linux",
                     "architecture": "x86"
                   }
                 }
               ],
               "componentDependencies": {
                 "aws.greengrass.StreamManager": {
                   "versionRequirement": "^1.0.0",
                   "dependencyType": "HARD"
                 }
               },
               "componentLambdaParameters": {
                 "eventSources": [
                   {
                     "topic": "hello/world/+",
                     "type": "IOT_CORE"
                   }
                 ]
               }
             }
           }
           ```

   1. (선택 사항) Lambda 함수 파라미터 객체에서 다음 파라미터 중 하나를 지정합니다.
      + `environmentVariables` - Lambda 함수가 실행될 때 사용할 수 있는 환경 변수의 맵입니다.
      + `execArgs` - Lambda 함수가 실행될 때 전달할 인수 목록입니다.
      + `inputPayloadEncodingType` - Lambda 함수가 지원하는 페이로드의 유형입니다. 다음 옵션 중 하나를 선택합니다.
        +  `json` 
        +  `binary` 

        기본값: `json`
      + `pinned` - Lambda 함수가 고정되었는지 여부입니다. 기본값은 `true`입니다.<a name="lambda-function-lifecycle-type"></a>
        + 고정(또는 수명이 긴) Lambda 함수는가 AWS IoT Greengrass 시작되어 자체 컨테이너에서 계속 실행될 때 시작됩니다.
        + 고정되지 않은(또는 온디맨드) Lambda 함수는 작업 항목을 수신한 경우에만 시작되고 지정된 최대 유휴 시간 동안 유휴 상태로 유지된 후에 종료됩니다. 함수에 여러 작업 항목이 있는 경우 AWS IoT Greengrass 코어 소프트웨어는 함수의 여러 인스턴스를 생성합니다.

        `maxIdleTimeInSeconds`를 사용하여 함수의 최대 유휴 시간을 설정합니다.
      + `timeoutInSeconds` - 제한 시간이 되기 전까지 Lambda 함수를 실행할 수 있는 최대 시간(초)입니다. 기본값은 3초입니다.
      + `statusTimeoutInSeconds` - Lambda 함수 구성 요소가 상태 업데이트를 Lambda 관리자 구성 요소로 전송하는 간격(초)입니다. 이 파라미터는 고정된 함수에만 적용됩니다. 기본값은 60초입니다.
      + `maxIdleTimeInSeconds` - AWS IoT Greengrass 코어 소프트웨어가 프로세스를 중지하기 전에 고정되지 않은 Lambda 함수가 유휴 상태가 될 수 있는 초 단위의 최대 시간입니다. 기본값은 60초입니다.
      + `maxInstancesCount` - 고정되지 않은 Lambda 함수가 동시에 실행할 수 있는 최대 인스턴스 수입니다. 기본값은 인스턴스 100개입니다.
      + `maxQueueSize` - Lambda 함수 구성 요소에 대한 메시지 대기열의 최대 크기입니다. AWS IoT Greengrass 코어 소프트웨어는 Lambda 함수를 실행하여 각 메시지를 사용할 수 있을 때까지 메시지를 FIFO(first-in-first-out) 대기열에 저장합니다. 기본값은 1,000개 메시지입니다.

      `lambda-function-component.json`에는 다음 예제와 유사한 문서가 포함될 수 있습니다.

      ```
      {
        "lambdaFunction": {
          "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1",
          "componentName": "com.example.HelloWorldLambda",
          "componentVersion": "1.0.0",
          "componentPlatforms": [
            {
              "name": "Linux x86",
              "attributes": {
                "os": "linux",
                "architecture": "x86"
              }
            }
          ],
          "componentDependencies": {
            "aws.greengrass.StreamManager": {
              "versionRequirement": "^1.0.0",
              "dependencyType": "HARD"
            }
          },
          "componentLambdaParameters": {
            "eventSources": [
              {
                "topic": "hello/world/+",
                "type": "IOT_CORE"
              }
            ],
            "environmentVariables": {
              "LIMIT": "300"
            },
            "execArgs": [
              "-d"
            ],
            "inputPayloadEncodingType": "json",
            "pinned": true,
            "timeoutInSeconds": 120,
            "statusTimeoutInSeconds": 30,
            "maxIdleTimeInSeconds": 30,
            "maxInstancesCount": 50,
            "maxQueueSize": 500
          }
        }
      }
      ```

   1. (선택 사항) Lambda 함수의 컨테이너 설정을 구성합니다. 기본적으로 Lambda 함수는 AWS IoT Greengrass 코어 소프트웨어 내의 격리된 런타임 환경에서 실행됩니다. 격리 없이 Lambda 함수를 프로세스로 실행하도록 선택할 수도 있습니다. 컨테이너에서 Lambda 함수를 실행하면 컨테이너의 메모리 크기와 Lambda 함수에서 사용할 수 있는 시스템 리소스를 구성합니다. 해결 방법:

      1. Linux 프로세스 파라미터 객체(`linuxProcessParams`)를 `lambda-function-component.json`의 Lambda 파라미터 객체에 추가합니다.

         ```
         {
           "lambdaFunction": {
             "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1",
             "componentName": "com.example.HelloWorldLambda",
             "componentVersion": "1.0.0",
             "componentPlatforms": [
               {
                 "name": "Linux x86",
                 "attributes": {
                   "os": "linux",
                   "architecture": "x86"
                 }
               }
             ],
             "componentDependencies": {
               "aws.greengrass.StreamManager": {
                 "versionRequirement": "^1.0.0",
                 "dependencyType": "HARD"
               }
             },
             "componentLambdaParameters": {
               "eventSources": [
                 {
                   "topic": "hello/world/+",
                   "type": "IOT_CORE"
                 }
               ],
               "environmentVariables": {
                 "LIMIT": "300"
               },
               "execArgs": [
                 "-d"
               ],
               "inputPayloadEncodingType": "json",
               "pinned": true,
               "timeoutInSeconds": 120,
               "statusTimeoutInSeconds": 30,
               "maxIdleTimeInSeconds": 30,
               "maxInstancesCount": 50,
               "maxQueueSize": 500,
               "linuxProcessParams": {
               
               }
             }
           }
         }
         ```

      1. (선택 사항) Lambda 함수가 컨테이너에서 실행되는지 여부를 지정합니다. 프로세스 파라미터 객체에 `isolationMode` 파라미터를 추가하고. 다음 옵션 중에서 선택합니다.
         + `GreengrassContainer` - Lambda 함수가 컨테이너너에서 실행됩니다.
         + `NoContainer` - Lambda 함수가 격리 없이 프로세스로 실행됩니다.

         기본값은 `GreengrassContainer`입니다.

      1. (선택 사항) 컨테이너에서 Lambda 함수를 실행하는 경우 컨테이너에서 사용할 수 있는 메모리의 양과 시스템 리소스(예: 볼륨 및 디바이스)를 구성할 수 있습니다. 해결 방법:

         1. 컨테이너 파라미터 객체(`containerParams`)를 `lambda-function-component.json`의 Linux 프로세스 파라미터 객체에 추가합니다.

            ```
            {
              "lambdaFunction": {
                "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1",
                "componentName": "com.example.HelloWorldLambda",
                "componentVersion": "1.0.0",
                "componentPlatforms": [
                  {
                    "name": "Linux x86",
                    "attributes": {
                      "os": "linux",
                      "architecture": "x86"
                    }
                  }
                ],
                "componentDependencies": {
                  "aws.greengrass.StreamManager": {
                    "versionRequirement": "^1.0.0",
                    "dependencyType": "HARD"
                  }
                },
                "componentLambdaParameters": {
                  "eventSources": [
                    {
                      "topic": "hello/world/+",
                      "type": "IOT_CORE"
                    }
                  ],
                  "environmentVariables": {
                    "LIMIT": "300"
                  },
                  "execArgs": [
                    "-d"
                  ],
                  "inputPayloadEncodingType": "json",
                  "pinned": true,
                  "timeoutInSeconds": 120,
                  "statusTimeoutInSeconds": 30,
                  "maxIdleTimeInSeconds": 30,
                  "maxInstancesCount": 50,
                  "maxQueueSize": 500,
                  "linuxProcessParams": {
                    "containerParams": {
                    
                    }
                  }
                }
              }
            }
            ```

         1. (선택 사항) `memorySizeInKB` 파라미터를 추가하여 컨테이너의 메모리 크기를 지정합니다. 기본값은 16,384KB(16MB)입니다.

         1. (선택 사항) `mountROSysfs` 파라미터를 추가하여 컨테이너가 디바이스의 `/sys` 폴더에서 정보를 읽을 수 있는지 여부를 지정합니다. 기본값은 `false`입니다.

         1. (선택 사항) 컨테이너화된 Lambda 함수가 액세스할 수 있는 로컬 볼륨을 구성합니다. 볼륨을 정의하면 AWS IoT Greengrass 코어 소프트웨어가 소스 파일을 컨테이너 내부의 대상에 탑재합니다. 해결 방법:

            1. 컨테이너 파라미터에 볼륨 목록(`volumes`)을 추가합니다.

               ```
               {
                 "lambdaFunction": {
                   "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1",
                   "componentName": "com.example.HelloWorldLambda",
                   "componentVersion": "1.0.0",
                   "componentPlatforms": [
                     {
                       "name": "Linux x86",
                       "attributes": {
                         "os": "linux",
                         "architecture": "x86"
                       }
                     }
                   ],
                   "componentDependencies": {
                     "aws.greengrass.StreamManager": {
                       "versionRequirement": "^1.0.0",
                       "dependencyType": "HARD"
                     }
                   },
                   "componentLambdaParameters": {
                     "eventSources": [
                       {
                         "topic": "hello/world/+",
                         "type": "IOT_CORE"
                       }
                     ],
                     "environmentVariables": {
                       "LIMIT": "300"
                     },
                     "execArgs": [
                       "-d"
                     ],
                     "inputPayloadEncodingType": "json",
                     "pinned": true,
                     "timeoutInSeconds": 120,
                     "statusTimeoutInSeconds": 30,
                     "maxIdleTimeInSeconds": 30,
                     "maxInstancesCount": 50,
                     "maxQueueSize": 500,
                     "linuxProcessParams": {
                       "containerParams": {
                         "memorySizeInKB": 32768,
                         "mountROSysfs": true,
                         "volumes": [
                         
                         ]
                       }
                     }
                   }
                 }
               }
               ```

            1. 목록에 각 볼륨을 추가합니다. 각 볼륨에는 다음 파라미터가 있습니다.
               + `sourcePath` - 코어 디바이스의 소스 폴더 경로입니다.
               + `destinationPath` - 컨테이너의 대상 폴더 경로입니다.
               + `permission` – (선택 사항) 컨테이너에서 소스 폴더에 액세스할 수 있는 권한입니다. 다음 옵션 중 하나를 선택합니다.
                 + `ro` - Lambda 함수에 소스 폴더에 대한 읽기 전용 액세스 권한이 있습니다.
                 + `rw` - Lambda 함수에 소스 폴더에 대한 읽기-쓰기 액세스 권한이 있습니다.

                 기본값은 `ro`입니다.
               + `addGroupOwner` – (선택 사항) Lambda 함수 구성 요소를 실행하는 시스템 그룹을 소스 폴더의 소유자로 추가할지 여부입니다. 기본값은 `false`입니다.

               `lambda-function-component.json`에는 다음 예제와 유사한 문서가 포함될 수 있습니다.

               ```
               {
                 "lambdaFunction": {
                   "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1",
                   "componentName": "com.example.HelloWorldLambda",
                   "componentVersion": "1.0.0",
                   "componentPlatforms": [
                     {
                       "name": "Linux x86",
                       "attributes": {
                         "os": "linux",
                         "architecture": "x86"
                       }
                     }
                   ],
                   "componentDependencies": {
                     "aws.greengrass.StreamManager": {
                       "versionRequirement": "^1.0.0",
                       "dependencyType": "HARD"
                     }
                   },
                   "componentLambdaParameters": {
                     "eventSources": [
                       {
                         "topic": "hello/world/+",
                         "type": "IOT_CORE"
                       }
                     ],
                     "environmentVariables": {
                       "LIMIT": "300"
                     },
                     "execArgs": [
                       "-d"
                     ],
                     "inputPayloadEncodingType": "json",
                     "pinned": true,
                     "timeoutInSeconds": 120,
                     "statusTimeoutInSeconds": 30,
                     "maxIdleTimeInSeconds": 30,
                     "maxInstancesCount": 50,
                     "maxQueueSize": 500,
                     "linuxProcessParams": {
                       "containerParams": {
                         "memorySizeInKB": 32768,
                         "mountROSysfs": true,
                         "volumes": [
                           {
                             "sourcePath": "/var/data/src",
                             "destinationPath": "/var/data/dest",
                             "permission": "rw",
                             "addGroupOwner": true
                           }
                         ]
                       }
                     }
                   }
                 }
               }
               ```

         1. (선택 사항) 컨테이너화된 Lambda 함수가 액세스할 수 있는 로컬 시스템 디바이스를 구성합니다. 해결 방법:

            1. 컨테이너 파라미터에 시스템 디바이스 목록(`devices`)을 추가합니다.

               ```
               {
                 "lambdaFunction": {
                   "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1",
                   "componentName": "com.example.HelloWorldLambda",
                   "componentVersion": "1.0.0",
                   "componentPlatforms": [
                     {
                       "name": "Linux x86",
                       "attributes": {
                         "os": "linux",
                         "architecture": "x86"
                       }
                     }
                   ],
                   "componentDependencies": {
                     "aws.greengrass.StreamManager": {
                       "versionRequirement": "^1.0.0",
                       "dependencyType": "HARD"
                     }
                   },
                   "componentLambdaParameters": {
                     "eventSources": [
                       {
                         "topic": "hello/world/+",
                         "type": "IOT_CORE"
                       }
                     ],
                     "environmentVariables": {
                       "LIMIT": "300"
                     },
                     "execArgs": [
                       "-d"
                     ],
                     "inputPayloadEncodingType": "json",
                     "pinned": true,
                     "timeoutInSeconds": 120,
                     "statusTimeoutInSeconds": 30,
                     "maxIdleTimeInSeconds": 30,
                     "maxInstancesCount": 50,
                     "maxQueueSize": 500,
                     "linuxProcessParams": {
                       "containerParams": {
                         "memorySizeInKB": 32768,
                         "mountROSysfs": true,
                         "volumes": [
                           {
                             "sourcePath": "/var/data/src",
                             "destinationPath": "/var/data/dest",
                             "permission": "rw",
                             "addGroupOwner": true
                           }
                         ],
                         "devices": [
                         
                         ]
                       }
                     }
                   }
                 }
               }
               ```

            1. 목록에 각 시스템 디바이스를 추가합니다. 각 시스템 디바이스에는 다음 파라미터가 있습니다.
               + `path` - 코어 디바이스의 시스템 디바이스 경로입니다.
               + `permission` – (선택 사항) 컨테이너에서 시스템 디바이스에 액세스할 수 있는 권한입니다. 다음 옵션 중 하나를 선택합니다.
                 + `ro` - Lambda 함수에 시스템 디바이스에 대한 읽기 전용 액세스 권한이 있습니다.
                 + `rw` - Lambda 함수에 시스템 디바이스에 대한 읽기-쓰기 액세스 권한이 있습니다.

                 기본값은 `ro`입니다.
               + `addGroupOwner` – (선택 사항) Lambda 함수 구성 요소를 실행하는 시스템 그룹을 시스템 디바이스의 소유자로 추가할지 여부입니다. 기본값은 `false`입니다.

            `lambda-function-component.json`에는 다음 예제와 유사한 문서가 포함될 수 있습니다.

            ```
            {
              "lambdaFunction": {
                "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1",
                "componentName": "com.example.HelloWorldLambda",
                "componentVersion": "1.0.0",
                "componentPlatforms": [
                  {
                    "name": "Linux x86",
                    "attributes": {
                      "os": "linux",
                      "architecture": "x86"
                    }
                  }
                ],
                "componentDependencies": {
                  "aws.greengrass.StreamManager": {
                    "versionRequirement": "^1.0.0",
                    "dependencyType": "HARD"
                  }
                },
                "componentLambdaParameters": {
                  "eventSources": [
                    {
                      "topic": "hello/world/+",
                      "type": "IOT_CORE"
                    }
                  ],
                  "environmentVariables": {
                    "LIMIT": "300"
                  },
                  "execArgs": [
                    "-d"
                  ],
                  "inputPayloadEncodingType": "json",
                  "pinned": true,
                  "timeoutInSeconds": 120,
                  "statusTimeoutInSeconds": 30,
                  "maxIdleTimeInSeconds": 30,
                  "maxInstancesCount": 50,
                  "maxQueueSize": 500,
                  "linuxProcessParams": {
                    "containerParams": {
                      "memorySizeInKB": 32768,
                      "mountROSysfs": true,
                      "volumes": [
                        {
                          "sourcePath": "/var/data/src",
                          "destinationPath": "/var/data/dest",
                          "permission": "rw",
                          "addGroupOwner": true
                        }
                      ],
                      "devices": [
                        {
                          "path": "/dev/sda3",
                          "permission": "rw",
                          "addGroupOwner": true
                        }
                      ]
                    }
                  }
                }
              }
            }
            ```

1. (선택 사항) 구성 요소에 대한 태그(`tags`)를 추가합니다. 자세한 내용은 [AWS IoT Greengrass Version 2 리소스에 태그 지정](tag-resources.md) 단원을 참조하십시오.

## 2단계: Lambda 함수 구성 요소 생성
<a name="create-lambda-component-cli"></a>

1. 다음 명령을 실행하여 `lambda-function-component.json`에서 Lambda 함수 구성 요소를 생성합니다.

   ```
   aws greengrassv2 create-component-version --cli-input-json file://lambda-function-component.json
   ```

   요청에 성공하는 경우 응답은 다음 예제와 비슷합니다.

   ```
   {
     "arn": "arn:aws:greengrass:region:123456789012:components:com.example.HelloWorldLambda:versions:1.0.0",
     "componentName": "com.example.HelloWorldLambda",
     "componentVersion": "1.0.0",
     "creationTimestamp": "Mon Dec 15 20:56:34 UTC 2020",
     "status": {
       "componentState": "REQUESTED",
       "message": "NONE",
       "errors": {}
     }
   }
   ```

   출력에서 `arn`을 복사하여 다음 단계에서 구성 요소의 상태를 확인합니다.

1. 구성 요소를 생성할 때 구성 요소의 상태는 `REQUESTED`입니다. 그런 다음 구성 요소를 배포할 수 있는지 AWS IoT Greengrass 확인합니다. 다음 명령을 실행하여 구성 요소 상태를 쿼리하고 구성 요소가 배포 가능한지 확인할 수 있습니다. `arn`을 이전 단계의 ARN으로 바꿉니다.

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

   구성 요소가 검증되면 응답은 구성 요소 상태가 `DEPLOYABLE`임을 나타냅니다.

   ```
   {
     "arn": "arn:aws:greengrass:region:account-id:components:com.example.HelloWorldLambda:versions:1.0.0",
     "componentName": "com.example.HelloWorldLambda",
     "componentVersion": "1.0.0",
     "creationTimestamp": "2020-12-15T20:56:34.376000-08:00",
     "publisher": "AWS Lambda",
     "status": {
       "componentState": "DEPLOYABLE",
       "message": "NONE",
       "errors": {}
     },
     "platforms": [
       {
         "name": "Linux x86",
         "attributes": {
           "architecture": "x86",
           "os": "linux"
         }
       }
     ]
   }
   ```

   구성 요소가 `DEPLOYABLE`이면 Lambda 함수를 코어 디바이스에 배포할 수 있습니다. 자세한 내용은 [디바이스에 AWS IoT Greengrass 구성 요소 배포](manage-deployments.md) 단원을 참조하십시오.