

지원 종료 공지: 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 코어에서 데이터 스트림 관리
<a name="stream-manager"></a>

AWS IoT Greengrass 스트림 관리자를 사용하면 대용량 IoT 데이터를 로 더 쉽고 안정적으로 전송할 수 있습니다 AWS 클라우드. 스트림 관리자는 데이터 스트림을 로컬에서 처리하고 AWS 클라우드 자동으로 로 내보냅니다. 이 기능은 AWS 클라우드 또는 로컬 스토리지 대상으로 내보내기 전에 로컬에서 데이터를 처리하고 분석하는 기계 학습(ML) 추론과 같은 일반적인 엣지 시나리오와 통합됩니다.

스트림 관리자는 애플리케이션 개발을 단순화합니다. IoT 애플리케이션은 사용자 지정 스트림 관리 기능을 구축하는 대신 표준화된 메커니즘을 사용하여 대용량 스트림을 처리하고 로컬 데이터 보존 정책을 관리할 수 있습니다. IoT 애플리케이션은 스트림에 대해 읽기 및 쓰기를 수행할 수 있습니다. 스트림별로 스토리지 유형, 크기 및 데이터 보존에 대한 정책을 정의하여 스트림 관리자가 스트림을 처리하고 내보내는 방법을 제어할 수 있습니다.

스트림 관리자는 연결이 간헐적이거나 제한된 환경에서 작동하도록 설계되었습니다. 대역폭 사용, 제한 시간 동작, 코어가 연결되거나 연결이 끊어질 때 스트림 데이터가 처리되는 방식을 정의할 수 있습니다. 중요한 데이터의 경우 우선 순위를 설정하여 스트림을 AWS 클라우드로 내보내는 순서를 제어할 수 있습니다.

스토리지 또는 추가 처리 및 분석을 위해 로 자동 내보내기 AWS 클라우드 를 구성할 수 있습니다. 스트림 관리자는 다음 AWS 클라우드 대상으로의 내보내기를 지원합니다.<a name="supported-export-destinations"></a>
+ 의 채널 AWS IoT 분석. <a name="ita-export-destination"></a>AWS IoT 분석 를 사용하면 데이터에 대한 고급 분석을 수행하여 비즈니스 결정을 내리고 기계 학습 모델을 개선할 수 있습니다. 자세한 내용은 *AWS IoT Analytics 사용 설명서*의 [What is AWS IoT Analytics?](https://docs.aws.amazon.com/iotanalytics/latest/userguide/welcome.html)를 참조하세요.
+ Kinesis Data Streams의 스트림. <a name="aks-export-destination"></a>Kinesis Data Streams는 일반적으로 대용량 데이터를 종합하여 데이터 웨어하우스나 map-reduce 클러스터에 로드하는 데 사용됩니다. 자세한 내용은 *Amazon Kinesis 개발자 안내서*의 [Amazon Kinesis Data Streams이란 무엇입니까?](https://docs.aws.amazon.com/streams/latest/dev/what-is-this-service.html)를 참조하세요.
+ 의 자산 속성 AWS IoT SiteWise. <a name="itsw-export-destination"></a>AWS IoT SiteWise 를 사용하면 산업 장비에서 대규모로 데이터를 수집, 구성 및 분석할 수 있습니다. 자세한 내용은 *AWS IoT SiteWise 사용 설명서*의 [What is AWS IoT SiteWise?](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/what-is-sitewise.html)를 참조하세요.
+ Amazon S3 객체. <a name="s3-export-destination"></a>Amazon S3를 사용하여 대량의 데이터를 저장 및 검색할 수 있습니다. 자세한 내용은 *Amazon Simple Storage Service 개발자 안내서*의 [Amazon S3란 무엇인가요?](https://docs.aws.amazon.com/AmazonS3/latest/dev/Welcome.html)를 참조하세요.

## 스트림 관리 워크플로우
<a name="stream-manager-workflow"></a>

IoT 애플리케이션은 AWS IoT Greengrass 코어 SDK를 통해 스트림 관리자와 상호 작용합니다. 간단한 워크플로우에서 Greengrass 코어에서 실행 중인 사용자 정의 Lambda 함수는 시계열 온도 및 압력 지표와 같은 IoT 데이터를 소비합니다. Lambda 함수는 데이터를 필터링하거나 압축한 다음 AWS IoT Greengrass 코어 SDK를 호출하여 스트림 관리자의 스트림에 데이터를 쓸 수 있습니다. 스트림 관리자는 스트림에 대해 정의된 정책에 따라 자동으로 스트림을 AWS 클라우드 로 내보낼 수 있습니다. 사용자 정의 Lambda 함수는 데이터를 로컬 데이터베이스 또는 스토리지 리포지토리로 직접 보낼 수도 있습니다.

IoT 애플리케이션에는 스트림에 대해 읽기 또는 쓰기를 수행하는 여러 개의 사용자 정의 Lambda 함수가 포함될 수 있습니다. 이러한 로컬 Lambda 함수는 스트림 읽기 및 쓰기를 수행하여 로컬에서 데이터를 필터링, 집계 및 분석할 수 있습니다. 따라서 데이터가 코어에서 클라우드 또는 로컬 대상으로 전송되기 전에 로컬 이벤트에 신속하게 대응하고 중요한 정보를 추출하는 것이 가능합니다.

다음 다이어그램에는 예제 워크플로우가 나와 있습니다.

![\[스트림 관리자 워크플로우에 대한 다이어그램입니다.\]](http://docs.aws.amazon.com/ko_kr/greengrass/v1/developerguide/images/stream-manager-architecture.png)


스트림 관리자를 사용하려면 먼저 스트림 관리자 파라미터를 구성하여 Greengrass 코어의 모든 스트림에 적용되는 그룹 수준 런타임 설정을 정의합니다. 이러한 사용자 정의 가능한 설정을 통해 비즈니스 요구 사항 및 환경 제약에 따라 스트림 관리자가 스트림을 저장, 처리 및 내보내는 방법을 제어할 수 있습니다. 자세한 내용은 [AWS IoT Greengrass 스트림 관리자 구성](configure-stream-manager.md) 단원을 참조하십시오.

스트림 관리자를 구성한 후 IoT 애플리케이션을 생성하고 배포할 수 있습니다. 이는 일반적으로 AWS IoT Greengrass Core SDK`StreamManagerClient`에서를 사용하여 스트림을 생성하고 상호 작용하는 사용자 정의 Lambda 함수입니다. 스트림 생성 중에 Lambda 함수는 내보내기 대상, 우선순위, 지속성과 같은 스트림별 정책을 정의합니다. `StreamManagerClient` 작업을 위한 코드 스니펫을 포함한 자세한 내용은 [StreamManagerClient를 사용하여 스트림 작업](work-with-streams.md)를 참조하세요.

간단한 워크플로우를 구성하는 자습서는 또는 [로 데이터 스트림 내보내기 AWS 클라우드 (콘솔)](stream-manager-console.md) 또는 [로 데이터 스트림 내보내기 AWS 클라우드 (CLI)](stream-manager-cli.md)를 참조하세요.

## 요구 사항
<a name="stream-manager-requirements"></a>

스트림 관리자 사용을 위해 다음 요구 사항이 적용됩니다.
+ 스트림 관리자가 활성화된 상태에서 AWS IoT Greengrass 코어 소프트웨어 v1.10 이상을 사용해야 합니다. 자세한 내용은 [AWS IoT Greengrass 스트림 관리자 구성](configure-stream-manager.md) 단원을 참조하십시오.

  <a name="stream-manager-not-supported-openwrt-para"></a>스트림 관리자는 OpenWrt 배포에서 지원되지 않습니다.
+ Java 8 런타임(JDK 8)이 코어에 설치되어 있어야 합니다.<a name="install-java8-runtime-general"></a>
  + Debian 기반 배포판(Raspbian 포함) 또는 Ubuntu 기반 배포판의 경우 다음 명령을 실행합니다.

    ```
    sudo apt install openjdk-8-jdk
    ```
  + Red Hat 기반 배포판(Amazon Linux 포함) 의 경우 다음 명령을 실행합니다.

    ```
    sudo yum install java-1.8.0-openjdk
    ```

    자세한 내용은 OpenJDK 설명서의 [OpenJDK 패키지 다운로드 및 설치 방법](https://openjdk.java.net/install/)을 참조하십시오.

   
+ 스트림 관리자에는 기본 AWS IoT Greengrass 코어 소프트웨어 외에 최소 70MB의 RAM이 필요합니다. 총 메모리 요구 사항은 워크로드에 따라 다릅니다.

   
+ 사용자 정의 Lambda 함수는 [AWS IoT Greengrass 코어 SDK](lambda-functions.md#lambda-sdks-core)를 사용하여 스트림 관리자와 상호 작용해야 합니다. AWS IoT Greengrass 코어 SDK는 여러 언어로 제공되지만 다음 버전에서만 스트림 관리자 작업을 지원합니다.<a name="streammanagerclient-sdk-versions"></a>
  + Java SDK (v1.4.0 이상)
  + Python SDK(v1.5.0 이상)
  + Node.js SDK(v1.6.0 이상)

  Lambda 함수 런타임에 해당하는 버전의 SDK를 다운로드하여 Lambda 함수 배포 패키지에 포함시킵니다.
**참고**  
Python용 AWS IoT Greengrass 코어 SDK에는 Python 3.7 이상이 필요하며 다른 패키지 종속성이 있습니다. 자세한 내용은 [Lambda 함수 배포 패키지 생성(콘솔)](stream-manager-console.md#stream-manager-console-create-deployment-package) 또는 [Lambda 함수 배포 패키지 생성(CLI)](stream-manager-cli.md#stream-manager-cli-create-deployment-package)을 참조하십시오.
+ 스트림의 AWS 클라우드 내보내기 대상을 정의하는 경우 내보내기 대상을 생성하고 Greengrass 그룹 역할에서 액세스 권한을 부여해야 합니다. 대상에 따라 다른 요구 사항도 적용될 수 있습니다. 자세한 내용은 다음을 참조하세요.<a name="export-destinations-links"></a>
  + [AWS IoT 분석 채널](stream-export-configurations.md#export-to-iot-analytics)
  + [Amazon Kinesis Data Streams](stream-export-configurations.md#export-to-kinesis)
  + [AWS IoT SiteWise 자산 속성](stream-export-configurations.md#export-to-iot-sitewise)
  + [Amazon S3 객체](stream-export-configurations.md#export-to-s3)

  이러한 AWS 클라우드 리소스를 유지 관리하는 것은 사용자의 책임입니다.

## 데이터 보안
<a name="stream-manager-security"></a>

스트림 관리자를 사용할 때는 다음과 같은 보안 고려 사항에 유의하십시오.

### 로컬 데이터 보안
<a name="stream-manager-security-stream-data"></a>

AWS IoT Greengrass 는 코어 디바이스의 구성 요소 간에 저장 중이거나 로컬로 전송 중인 스트림 데이터를 암호화하지 않습니다.
+ **저장 시 데이터**. 스트림 데이터는 Greengrass 코어의 스토리지 디렉터리에 로컬로 저장됩니다. 데이터 보안을 위해 AWS IoT Greengrass 는 활성화된 경우 Unix 파일 권한과 전체 디스크 암호화를 사용합니다. 선택적 [STREAM\$1MANAGER\$1STORE\$1ROOT\$1DIR](configure-stream-manager.md#STREAM_MANAGER_STORE_ROOT_DIR) 파라미터를 사용하여 스토리지 디렉터리를 지정할 수 있습니다. 나중에 다른 스토리지 디렉터리를 사용하도록이 파라미터를 변경하는 경우는 이전 스토리지 디렉터리 또는 해당 콘텐츠를 삭제하지 AWS IoT Greengrass 않습니다.

   
+ **로컬로 전송 중인 데이터**.는 데이터 소스, Lambda 함수, AWS IoT Greengrass 코어 SDK 및 스트림 관리자 간의 코어에서 로컬로 전송 중인 스트림 데이터를 암호화하지 AWS IoT Greengrass 않습니다.

   
+ **로 전송 중인 데이터입니다 AWS 클라우드**. 스트림 관리자가 로 내보낸 데이터 스트림은 전송 계층 보안(TLS)을 통한 표준 AWS 서비스 클라이언트 암호화를 AWS 클라우드 사용합니다.

자세한 내용은 [데이터 암호화](data-encryption.md) 단원을 참조하십시오.

### 클라이언트 인증
<a name="stream-manager-security-client-authentication"></a>

스트림 관리자 클라이언트는 AWS IoT Greengrass 코어 SDK를 사용하여 스트림 관리자와 통신합니다. 클라이언트 인증이 활성화되면 Greengrass 그룹의 Lambda 함수만 스트림 관리자의 스트림과 상호 작용할 수 있습니다. 클라이언트 인증이 비활성화되면 Greengrass 코어(예: [Docker 컨테이너](docker-app-connector.md))에서 실행 중인 모든 프로세스가 스트림 관리자의 스트림과 상호 작용할 수 있습니다. 비즈니스 사례에 필요한 경우에만 인증을 비활성화해야 합니다.

[STREAM\$1MANAGER\$1AUTHENTICATE\$1CLIENT](configure-stream-manager.md#STREAM_MANAGER_AUTHENTICATE_CLIENT) 파라미터를 사용하여 클라이언트 인증 모드를 설정합니다. 콘솔 또는 AWS IoT Greengrass API에서이 파라미터를 구성할 수 있습니다. 변경 사항은 그룹이 배포된 후에 적용됩니다.


****  

|   | 활성화됨 | 비활성 | 
| --- | --- | --- | 
| 파라미터값 | `true`(기본값 및 권장) | `false` | 
| 허용된 클라이언트 | Greengrass 그룹의 사용자 정의 Lambda 함수 | Greengrass 그룹의 사용자 정의 Lambda 함수 Greengrass 코어 장치에서 실행 중인 기타 프로세스 | 

## 다음 사항도 참조하세요.
<a name="stream-manager-see-also"></a>
+ [AWS IoT Greengrass 스트림 관리자 구성](configure-stream-manager.md)
+ [StreamManagerClient를 사용하여 스트림 작업](work-with-streams.md)
+ [지원되는 AWS 클라우드 대상에 대한 구성 내보내기](stream-export-configurations.md)
+ [로 데이터 스트림 내보내기 AWS 클라우드 (콘솔)](stream-manager-console.md)
+ [로 데이터 스트림 내보내기 AWS 클라우드 (CLI)](stream-manager-cli.md)

# AWS IoT Greengrass 스트림 관리자 구성
<a name="configure-stream-manager"></a>

 AWS IoT Greengrass 코어에서 스트림 관리자는 IoT 디바이스 데이터를 저장, 처리 및 내보낼 수 있습니다. 스트림 관리자는 그룹 수준의 런타임 설정을 구성하는 데 사용하는 파라미터를 제공합니다. 이러한 설정은 Greengrass 코어의 모든 스트림에 적용됩니다. AWS IoT 콘솔 또는 AWS IoT Greengrass API를 사용하여 스트림 관리자 설정을 구성할 수 있습니다. 변경 사항은 그룹이 배포된 후에 적용됩니다.

**참고**  
스트림 관리자를 구성한 후에는 Greengrass 코어에서 실행되는 IoT 애플리케이션을 생성 및 배포하고 스트림 관리자와 상호 작용할 수 있습니다. 이러한 IoT 애플리케이션은 일반적으로 사용자 정의 Lambda 함수입니다. 자세한 내용은 [StreamManagerClient를 사용하여 스트림 작업](work-with-streams.md) 단원을 참조하십시오.

## 스트림 관리자 파라미터
<a name="stream-manager-parameters"></a>

스트림 관리자는 그룹 수준 설정을 정의할 수 있도록 다음과 같은 파라미터를 제공합니다. 모든 파라미터는 선택 사항입니다.

**스토리지 디렉터리**  <a name="STREAM_MANAGER_STORE_ROOT_DIR"></a>
파라미터 이름: `STREAM_MANAGER_STORE_ROOT_DIR`  
스트림을 저장하는 데 사용되는 로컬 디렉터리의 절대 경로입니다. 이 값은 슬래시로 시작해야 합니다(예: `/data`).  
스트림 데이터 보안에 대한 자세한 내용은 [로컬 데이터 보안](stream-manager.md#stream-manager-security-stream-data) 섹션을 참조하십시오.  
최소 AWS IoT Greengrass 코어 버전: 1.10.0

[**Server port**]  
파라미터 이름: `STREAM_MANAGER_SERVER_PORT`  
스트림 관리자와 통신하는 데 사용되는 로컬 포트 번호입니다. 기본값은 `8088`입니다.  
최소 AWS IoT Greengrass 코어 버전: 1.10.0

**클라이언트 인증**  <a name="STREAM_MANAGER_AUTHENTICATE_CLIENT"></a>
파라미터 이름: `STREAM_MANAGER_AUTHENTICATE_CLIENT`  
스트림 관리자와 상호 작용하기 위해 클라이언트가 인증되어야 하는지 여부를 나타냅니다. 클라이언트와 스트림 관리자 간의 모든 상호 작용은 AWS IoT Greengrass 코어 SDK에 의해 제어됩니다. 이 파라미터는 AWS IoT Greengrass Core SDK를 호출하여 스트림 작업을 수행할 수 있는 클라이언트를 결정합니다. 자세한 내용은 [클라이언트 인증](stream-manager.md#stream-manager-security-client-authentication) 단원을 참조하십시오.  
유효한 값은 `true` 또는 `false`입니다. 기본값은 `true`입니다(권장).  
+ `true`. Greengrass Lambda 함수만 클라이언트로 사용할 수 있습니다. Lambda 함수 클라이언트는 내부 AWS IoT Greengrass 코어 프로토콜을 사용하여 AWS IoT Greengrass 코어 SDK로 인증합니다.
+ `false`. AWS IoT Greengrass 코어에서 실행되는 모든 프로세스가 클라이언트가 되도록 허용합니다. 비즈니스 사례에 필요한 경우가 아니면 `false`로 설정하지 마십시오. 예를 들어 코어 장치의 비Lambda 프로세스가 스트림 관리자(예: 코어에서 실행되는 [Docker 컨테이너](docker-app-connector.md))와 직접 통신해야 하는 경우에만 이 값을 `false`로 설정합니다.
최소 AWS IoT Greengrass 코어 버전: 1.10.0

**최대 대역폭**  
파라미터 이름: `STREAM_MANAGER_EXPORTER_MAX_BANDWIDTH`  
데이터를 내보내는 데 사용할 수 있는 평균 최대 대역폭(초당 킬로비트)입니다. 기본값은 사용 가능한 대역폭을 무제한으로 사용할 수 있도록 허용합니다.  
최소 AWS IoT Greengrass 코어 버전: 1.10.0

**스레드 풀 크기**  
파라미터 이름: `STREAM_MANAGER_EXPORTER_THREAD_POOL_SIZE`  
데이터를 내보내는 데 사용할 수 있는 최대 활성 스레드 수입니다. 기본값은 `5`입니다.  
최적의 크기는 하드웨어, 스트림 볼륨 및 계획된 내보내기 스트림 수에 따라 다릅니다. 내보내기 속도가 느린 경우 이 설정을 조정하여 하드웨어 및 비즈니스 사례에 가장 적합한 크기를 찾을 수 있습니다. 코어 장치 하드웨어의 CPU 및 메모리는 제한적인 요소입니다. 시작을 위해 이 값을 장치의 프로세서 코어 수와 동일하게 설정해 볼 수 있습니다.  
하드웨어가 지원할 수 있는 크기 보다 크게 설정하지 않도록 주의하세요. 각 스트림은 하드웨어 리소스를 소비하므로 제한된 장치에서 내보내기 스트림 수를 제한해야 합니다.  
최소 AWS IoT Greengrass 코어 버전: 1.10.0

**JVM 인수**  
파라미터 이름: `JVM_ARGS`  
시작 시 스트림 관리자에게 전달할 사용자 정의 Java 가상 머신 인수입니다. 여러 인수는 공백으로 구분해야 합니다.  
JVM에서 사용하는 기본 설정을 재정의해야 하는 경우에만 이 파라미터를 사용합니다. 예를 들어 많은 수의 스트림을 내보낼 계획이 있다면 기본 힙 크기를 늘려야 할 수 있습니다.  
최소 AWS IoT Greengrass 코어 버전: 1.10.0

**읽기 전용 입력 파일 디렉터리**  <a name="stream-manager-read-only-directories"></a>
파라미터 이름: `STREAM_MANAGER_READ_ONLY_DIRS`  
입력 파일을 저장하는 루트 파일 시스템 외부의 디렉터리에 대한 절대 경로를 쉼표로 구분한 목록입니다. 스트림 관리자는 Amazon S3에 파일을 읽고 업로드하고 디렉터리를 읽기 전용으로 마운트합니다. Amazon S3에 로그 데이터 내보내기에 대한 자세한 내용은 [Amazon S3 객체](stream-export-configurations.md#export-to-s3) 섹션을 참조하세요.  
다음 조건이 충족되는 경우에만 이 파라미터를 사용하십시오.  
+ Amazon S3로 내보내는 스트림의 입력 파일 디렉터리는 다음 위치 중 하나에 있습니다.
  + 루트 파일 시스템이 아닌 파티션.
  + 루트 파일 시스템의 `/tmp` 아래.
+ Greengrass 그룹의 [기본 컨테이너화는](lambda-group-config.md#lambda-containerization-groupsettings) **Greengrass 컨테이너**입니다.
예제 값: `/mnt/directory-1,/mnt/directory-2,/tmp`  
최소 AWS IoT Greengrass 코어 버전: 1.11.0

**멀티파트 업로드의 최소 크기**  <a name="stream-manager-minimum-part-size"></a>
파라미터 이름: `STREAM_MANAGER_EXPORTER_S3_DESTINATION_MULTIPART_UPLOAD_MIN_PART_SIZE_BYTES`  
Amazon S3에 대한 멀티파트 업로드의 최소 부분 크기(바이트). 스트림 관리자는 이 설정과 입력 파일의 크기를 사용하여 멀티파트 PUT 요청에서 데이터를 일괄 처리하는 방법을 결정합니다. 기본값 및 최소값은 `5242880` 바이트(5MB)입니다.  
스트림 관리자는 스트림의 `sizeThresholdForMultipartUploadBytes` 속성을 사용하여 Amazon S3에 단일 업로드로 내보낼지 멀티파트 업로드로 내보낼지 결정합니다. 사용자 정의 Lambda 함수는 Amazon S3로 내보내는 스트림을 생성할 때 이 임계값을 설정합니다. 기본 임계값 크기는 5MB입니다.
최소 AWS IoT Greengrass 코어 버전: 1.11.0

## 스트림 관리자 설정 구성(콘솔)
<a name="configure-stream-manager-console"></a>

콘솔을 사용하여 다음 관리 작업을 수행할 수 있습니다 AWS IoT .
+ [스트림 관리자가 활성화되어 있는지 확인](#check-stream-manager-console)
+ [그룹 생성 중에 스트림 관리자 활성화 또는 비활성화](#enable-stream-manager-console-new-group)
+ [기존 그룹에 대해 스트림 관리자를 활성화 또는 비활성화](#enable-stream-manager-console-existing-group)
+ [스트림 관리자 설정 변경](#change-stream-manager-console)

변경 사항은 Greengrass 그룹이 배포된 후에 적용됩니다. 스트림 관리자와 상호 작용하는 Lambda 함수를 포함하는 Greengrass 그룹을 배포하는 방법을 보여주는 튜토리얼은 [로 데이터 스트림 내보내기 AWS 클라우드 (콘솔)](stream-manager-console.md)을 참조하십시오.

**참고**  <a name="ggstreammanager-function-config-console"></a>
콘솔을 사용하여 스트림 관리자를 활성화하고 그룹을 배포하는 경우 스트림 관리자의 메모리 크기가 기본 4GB로 설정됩니다. 메모리 크기를 최소 128,000KB로 설정하는 것이 좋습니다.

 

### 스트림 관리자가 활성화되어 있는지 확인하려면(콘솔)
<a name="check-stream-manager-console"></a>

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

1. <a name="group-choose-target-group"></a>대상 그룹을 선택합니다.

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

1. **시스템 Lambda 함수**에서 **스트림 관리자**를 선택하고 **편집**을 선택합니다.

1. 활성화 또는 비활성화 상태를 확인합니다. 구성된 모든 사용자 지정 스트림 관리자 설정도 표시됩니다.

 

### 그룹 생성 중에 스트림 관리자를 활성화 또는 비활성화하려면(콘솔)
<a name="enable-stream-manager-console-new-group"></a>

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

1. **그룹 생성**을 선택합니다. 다음 페이지에서 선택한 항목에 따라 그룹에 대한 스트림 관리자를 구성하는 방법이 결정됩니다.

1. **그룹 이름 지정**을 진행하고 **Greengrass 코어** 페이지를 선택합니다.

1. **그룹 생성**을 선택합니다.

1. 그룹 구성 페이지에서 **Lambda 함수** 탭을 선택하고 **스트림 관리자**를 선택한 다음 **편집**을 선택합니다.
   + 스트림 관리자를 기본 설정으로 활성화하려면 **기본 설정으로 활성화**를 선택합니다.

      
   + 사용자 지정 설정으로 스트림 관리자를 활성화하려면 **설정 사용자 지정**을 선택합니다.

     1. **스트림 관리자 구성** 페이지에서 **사용자 지정 설정으로 활성화**를 선택합니다.

     1. **사용자 정의 설정**에 스트림 관리자 파라미터의 값을 입력합니다. 자세한 내용은 [스트림 관리자 파라미터](#stream-manager-parameters) 단원을 참조하십시오. 가 기본값을 AWS IoT Greengrass 사용할 수 있도록 필드를 비워 둡니다.

         
   + 스트림 관리자를 비활성화하려면 **비활성화**를 선택합니다.

     1. **Configure stream manager(스트림 관리자 구성)** 페이지에서 **비활성화**를 선택합니다.

         

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

1. <a name="continue-create-group"></a>나머지 페이지를 계속 진행하여 그룹을 생성합니다.

1. **클라이언트 장치** 페이지에서 보안 리소스를 다운로드하고 정보를 검토한 다음, **완료**를 선택합니다.
**참고**  
스트림 관리자가 활성화된 경우 그룹을 배포하기 전에 코어 장치에 [Java 8 런타임을 설치](stream-manager.md#stream-manager-requirements)해야 합니다.

 

### 기존 그룹에 대해 스트림 관리자를 활성화 또는 비활성화하려면(콘솔)
<a name="enable-stream-manager-console-existing-group"></a>

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

1. <a name="group-choose-target-group"></a>대상 그룹을 선택합니다.

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

1. **시스템 Lambda 함수**에서 **스트림 관리자**를 선택하고 **편집**을 선택합니다.

1. 활성화 또는 비활성화 상태를 확인합니다. 구성된 모든 사용자 지정 스트림 관리자 설정도 표시됩니다.

 

### 스트림 관리자 설정을 변경하려면(콘솔)
<a name="change-stream-manager-console"></a>

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

1. <a name="group-choose-target-group"></a>대상 그룹을 선택합니다.

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

1. **시스템 Lambda 함수**에서 **스트림 관리자**를 선택하고 **편집**을 선택합니다.

1. 활성화 또는 비활성화 상태를 확인합니다. 구성된 모든 사용자 지정 스트림 관리자 설정도 표시됩니다.

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

## 스트림 관리자 설정 구성(CLI)
<a name="configure-stream-manager-cli"></a>

에서 시스템 `GGStreamManager` Lambda 함수를 AWS CLI사용하여 스트림 관리자를 구성합니다. 시스템 Lambda 함수는 AWS IoT Greengrass 코어 소프트웨어의 구성 요소입니다. 스트림 관리자 및 일부 기타 시스템 Lambda 함수의 경우 Greengrass 그룹에서 해당 `Function` 및 `FunctionDefinitionVersion` 객체를 관리하여 Greengrass 기능을 구성할 수 있습니다. 자세한 내용은 [AWS IoT Greengrass 그룹 객체 모델 개요](deployments.md#api-overview) 단원을 참조하십시오.

다음과 같은 관리 작업에서 API를 사용할 수 있습니다. 이 섹션의 예제에서는를 사용하는 방법을 보여주 AWS CLI지만 AWS IoT Greengrass API를 직접 호출하거나 SDK를 AWS 사용할 수도 있습니다.
+ [스트림 관리자가 활성화되어 있는지 확인](#check-stream-manager-cli)
+ [스트림 관리자를 활성화, 비활성화 또는 구성](#enable-stream-manager-cli)

변경 사항은 그룹이 배포된 후에 적용됩니다. 스트림 관리자와 상호 작용하는 Lambda 함수를 사용하여 Greengrass 그룹을 배포하는 방법을 보여주는 튜토리얼은 [로 데이터 스트림 내보내기 AWS 클라우드 (CLI)](stream-manager-cli.md) 섹션을 참조하십시오.

**작은 정보**  
스트림 관리자가 활성화되어 있고 코어 장치에서 실행 중인지 확인하려면 장치의 터미널에서 다음 명령을 실행할 수 있습니다.  

```
ps aux | grep -i 'streammanager'
```

 

### 스트림 관리자가 활성화되어 있는지 확인하려면(CLI)
<a name="check-stream-manager-cli"></a>

배포된 함수 정의 버전에 시스템 `GGStreamManager` Lambda 함수가 포함되어 있으면 스트림 관리자가 활성화됩니다. 확인하려면 다음을 수행하십시오.

1. <a name="get-group-id-latestversion"></a>대상 Greengrass 그룹 및 그룹 버전의 ID를 확인합니다. 이 절차에서는 이것이 최신 그룹 및 그룹 버전이라고 가정합니다. 다음 쿼리는 가장 최근에 생성된 그룹을 반환합니다.

   ```
   aws greengrass list-groups --query "reverse(sort_by(Groups, &CreationTimestamp))[0]"
   ```

   또는 이름으로 쿼리할 수도 있습니다. 그룹 이름은 고유한 이름이 아니어도 되므로 여러 그룹을 반환할 수도 있습니다.

   ```
   aws greengrass list-groups --query "Groups[?Name=='MyGroup']"
   ```
**참고**  
<a name="find-group-ids-console"></a> AWS IoT 콘솔에서 이러한 값을 찾을 수도 있습니다. 그룹 ID는 그룹의 **설정** 페이지에 표시됩니다. 그룹 버전 ID는 그룹의 **배포** 탭에 표시됩니다.

1. <a name="copy-group-id-latestversion"></a>출력에서 대상 그룹의 `Id` 및 `LatestVersion` 값을 복사합니다.

1. <a name="get-latest-group-version"></a>최신 그룹 버전을 확인합니다.
   + *group-id*를 복사한 `Id`로 바꿉니다.
   + *latest-group-version-id*를 복사한 `LatestVersion`으로 바꿉니다.

   ```
   aws greengrass get-group-version \
   --group-id group-id \
   --group-version-id latest-group-version-id
   ```

1. 출력의 `FunctionDefinitionVersionArn`에서 함수 정의 및 함수 정의 버전의 ID를 복사합니다.
   + 함수 정의 ID는 Amazon 리소스 이름(ARN)의 `functions` 세그먼트 뒤에 나오는 GUID입니다.
   + 함수 정의 버전 ID는 ARN의 `versions` 세그먼트 뒤에 나오는 GUID입니다.

   ```
   arn:aws:greengrass:us-west-2:123456789012:/greengrass/definition/functions/function-definition-id/versions/function-definition-version-id
   ```

1. 함수 정의 버전을 가져옵니다.
   + *function-definition-id*를 함수 정의 ID로 바꿉니다.
   + *function-definition-version-id*를 함수 정의 버전 ID로 바꿉니다.

   ```
   aws greengrass get-function-definition-version \
   --function-definition-id function-definition-id \
   --function-definition-version-id function-definition-version-id
   ```

출력의 `functions` 배열이 `GGStreamManager` 함수를 포함하는 경우, 스트림 관리자가 활성화됩니다. 함수에 대해 정의된 모든 환경 변수는 스트림 관리자의 사용자 지정 설정을 나타냅니다.

### 스트림 관리자를 활성화, 비활성화 또는 구성하려면(CLI)
<a name="enable-stream-manager-cli"></a>

에서 시스템 `GGStreamManager` Lambda 함수를 AWS CLI사용하여 스트림 관리자를 구성합니다. 변경 사항은 그룹을 배포한 후에 적용됩니다.
+ 스트림 관리자를 활성화하려면 함수 정의 버전의 `functions` 배열에 `GGStreamManager`을 포함시킵니다. 사용자 지정 설정을 구성하려면 해당 [스트림 관리자 파라미터](#stream-manager-parameters)에 대한 환경 변수를 정의합니다.
+ 스트림 관리자를 비활성화하려면 함수 정의 버전의 `functions` 배열에서 `GGStreamManager`을 제거합니다.

**기본 설정의 스트림 관리자**  
다음 예제 구성에서는 기본 설정으로 스트림 관리자를 활성화합니다. 임의의 함수 ID를 `streamManager`로 설정합니다.  

```
{
    "FunctionArn": "arn:aws:lambda:::function:GGStreamManager:1",
    "FunctionConfiguration": {
        "MemorySize": 4194304,
        "Pinned": true,
        "Timeout": 3
    },
    "Id": "streamManager"
}
```
`FunctionConfiguration` 속성의 경우 다음 사항을 알고 있을 수 있습니다.  
+ `MemorySize`는 기본 설정으로 4194304KB(4GB)로 설정됩니다. 이 값은 언제든지 변경할 수 있습니다. 최소 128,000KB로 `MemorySize`를 설정하는 것이 좋습니다.
+ `Pinned`를 `true`로 설정해야 합니다.
+ `Timeout`은 함수 정의 버전에서 필요하지만, `GGStreamManager`에서는 이를 사용하지 않습니다.

**사용자 지정 설정의 스트림 관리자**  <a name="enable-stream-manager-custom-settings"></a>
다음 예제 구성에서는 스토리지 디렉터리, 서버 포트 및 스레드 풀 크기 파라미터에 대한 사용자 지정 값을 사용하여 스트림 관리자를 활성화합니다.  

```
{
    "FunctionArn": "arn:aws:lambda:::function:GGStreamManager:1",
    "FunctionConfiguration": {
        "Environment": {
            "Variables": {
                "STREAM_MANAGER_STORE_ROOT_DIR": "/data",
                "STREAM_MANAGER_SERVER_PORT": "1234",
                "STREAM_MANAGER_EXPORTER_THREAD_POOL_SIZE": "4"
            }
        },
        "MemorySize": 4194304,
        "Pinned": true,
        "Timeout": 3
    },
    "Id": "streamManager"
}
```
AWS IoT Greengrass 는 환경 변수로 지정되지 않은 [스트림 관리자 파라미터](#stream-manager-parameters)의 기본값을 사용합니다.

**Amazon S3 내보내기에 대한 사용자 지정 설정이 포함된 스트림 관리자**  <a name="enable-stream-manager-custom-settings-s3"></a>
다음 예제 구성을 사용하면 스트림 관리자가 업로드 디렉터리 및 최소 멀티파트 업로드 크기 파라미터에 대한 사용자 지정 값을 사용할 수 있습니다.  

```
{
    "FunctionArn": "arn:aws:lambda:::function:GGStreamManager:1",
    "FunctionConfiguration": {
        "Environment": {
            "Variables": {
                "STREAM_MANAGER_READ_ONLY_DIRS": "/mnt/directory-1,/mnt/directory-2,/tmp",
                "STREAM_MANAGER_EXPORTER_S3_DESTINATION_MULTIPART_UPLOAD_MIN_PART_SIZE_BYTES": "10485760"
            }
        },
        "MemorySize": 4194304,
        "Pinned": true,
        "Timeout": 3
    },
    "Id": "streamManager"
}
```

 

**스트림 관리자를 활성화, 비활성화 또는 구성하려면(CLI)**

1. <a name="get-group-id-latestversion"></a>대상 Greengrass 그룹 및 그룹 버전의 ID를 확인합니다. 이 절차에서는 이것이 최신 그룹 및 그룹 버전이라고 가정합니다. 다음 쿼리는 가장 최근에 생성된 그룹을 반환합니다.

   ```
   aws greengrass list-groups --query "reverse(sort_by(Groups, &CreationTimestamp))[0]"
   ```

   또는 이름으로 쿼리할 수도 있습니다. 그룹 이름은 고유한 이름이 아니어도 되므로 여러 그룹을 반환할 수도 있습니다.

   ```
   aws greengrass list-groups --query "Groups[?Name=='MyGroup']"
   ```
**참고**  
<a name="find-group-ids-console"></a> AWS IoT 콘솔에서 이러한 값을 찾을 수도 있습니다. 그룹 ID는 그룹의 **설정** 페이지에 표시됩니다. 그룹 버전 ID는 그룹의 **배포** 탭에 표시됩니다.

1. <a name="copy-group-id-latestversion"></a>출력에서 대상 그룹의 `Id` 및 `LatestVersion` 값을 복사합니다.

1. <a name="get-latest-group-version"></a>최신 그룹 버전을 확인합니다.
   + *group-id*를 복사한 `Id`로 바꿉니다.
   + *latest-group-version-id*를 복사한 `LatestVersion`으로 바꿉니다.

   ```
   aws greengrass get-group-version \
   --group-id group-id \
   --group-version-id latest-group-version-id
   ```

1. `FunctionDefinitionVersionArn`을 제외한 `CoreDefinitionVersionArn` 및 모든 버전 ARN을 출력에서 복사합니다. 나중에 새 그룹 버전을 만들 때 이러한 값들이 사용됩니다.

1. <a name="parse-function-def-id"></a>출력의 `FunctionDefinitionVersionArn`에서 함수 정의의 ID를 복사합니다. 다음 예제에서와 같이, ARN에서 `functions` 세그먼트 다음에 나오는 GUID가 ID가 됩니다.

   ```
   arn:aws:greengrass:us-west-2:123456789012:/greengrass/definition/functions/bcfc6b49-beb0-4396-b703-6dEXAMPLEcu5/versions/0f7337b4-922b-45c5-856f-1aEXAMPLEsf6
   ```
**참고**  
또는 [https://docs.aws.amazon.com/cli/latest/reference/greengrass/create-function-definition.html](https://docs.aws.amazon.com/cli/latest/reference/greengrass/create-function-definition.html) 명령을 실행하여 함수 정의를 생성하고, 출력에서 ID를 복사할 수 있습니다.

1. <a name="enable-stream-manager-function-definition-version"></a>함수 정의에 함수 정의 버전을 추가합니다.
   + *function-definition-id*를 함수 정의에서 복사한 `Id`로 바꿉니다.
   + `functions` 배열에 Greengrass 코어에 사용할 수 있게 하려는 다른 모든 함수를 포함시킵니다. `get-function-definition-version` 명령을 사용하여 기존 함수 목록을 가져올 수 있습니다.

      
**기본 설정으로 스트림 관리자 활성화**  
다음 예제에서는 `functions` 배열에 `GGStreamManager` 함수를 포함하여 스트림 관리자를 활성화합니다. 이 예제에서는 [스트림 관리자 파라미터](#stream-manager-parameters)에 기본값을 사용합니다.  

   ```
   aws greengrass create-function-definition-version \
   --function-definition-id function-definition-id \
   --functions '[
           {
               "FunctionArn": "arn:aws:lambda:::function:GGStreamManager:1",
               "FunctionConfiguration": {
                   "MemorySize":  4194304,
                   "Pinned": true,
                   "Timeout": 3
               },
               "Id": "streamManager"
           },
           {    
               "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:MyLambdaFunction:MyAlias",
               "FunctionConfiguration": {
                   "Executable": "myLambdaFunction.function_handler",
                   "MemorySize": 16000,
                   "Pinned": true,
                   "Timeout": 5
               },
               "Id": "myLambdaFunction"
           },
           ... more user-defined functions
       ]
   }'
   ```
이 예제의 `myLambdaFunction` 함수는 사용자 정의 Lambda 함수 중 하나를 나타냅니다.  
**사용자 지정 설정으로 스트림 관리자 활성화**  
다음 예제에서는 `functions` 배열에 `GGStreamManager` 함수를 포함하여 스트림 관리자를 활성화합니다. 기본값을 변경하지 않는 한 모든 스트림 관리자 설정은 선택 사항입니다. 이 예제에서는 환경 변수를 사용하여 사용자 지정 값을 설정하는 방법을 보여줍니다.  

   ```
   aws greengrass create-function-definition-version \
   --function-definition-id function-definition-id \
   --functions '[
           {
               "FunctionArn": "arn:aws:lambda:::function:GGStreamManager:1",
               "FunctionConfiguration": {
                   "Environment": {
                       "Variables": {
                           "STREAM_MANAGER_STORE_ROOT_DIR": "/data",
                           "STREAM_MANAGER_SERVER_PORT": "1234",
                           "STREAM_MANAGER_EXPORTER_THREAD_POOL_SIZE": "4"
                       }
                   },
                   "MemorySize":  4194304,
                   "Pinned": true,
                   "Timeout": 3
               },
               "Id": "streamManager"
           },
           {    
               "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:MyLambdaFunction:MyAlias",
               "FunctionConfiguration": {
                   "Executable": "myLambdaFunction.function_handler",
                   "MemorySize": 16000,
                   "Pinned": true,
                   "Timeout": 5
               },
               "Id": "myLambdaFunction"
           },
           ... more user-defined functions
       ]
   }'
   ```
`FunctionConfiguration` 속성의 경우 다음 사항을 알고 있을 수 있습니다.  
   + `MemorySize`는 기본 설정으로 4194304KB(4GB)로 설정됩니다. 이 값은 언제든지 변경할 수 있습니다. 최소 128,000KB로 `MemorySize`를 설정하는 것이 좋습니다.
   + `Pinned`를 `true`로 설정해야 합니다.
   + `Timeout`은 함수 정의 버전에서 필요하지만, `GGStreamManager`에서는 이를 사용하지 않습니다.  
**스트림 관리자 비활성화**  
다음 예제에서는 `GGStreamManager` 함수를 생략하여 스트림 관리자를 비활성화합니다.  

   ```
   aws greengrass create-function-definition-version \
   --function-definition-id function-definition-id \
   --functions '[
           {       
               "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:MyLambdaFunction:MyAlias",
               "FunctionConfiguration": {
                   "Executable": "myLambdaFunction.function_handler",
                   "MemorySize": 16000,
                   "Pinned": true,
                   "Timeout": 5
               },
               "Id": "myLambdaFunction"
           },
           ... more user-defined functions
       ]
   }'
   ```
Lambda 함수를 배포하지 않으려면 함수 정의 버전을 완전히 생략할 수 있습니다.

1. <a name="copy-function-def-version-arn"></a>출력에서 함수 정의 버전의 `Arn`를 복사합니다.

1. <a name="create-group-version-with-sys-lambda"></a>시스템 Lambda 함수를 포함하는 그룹 버전을 만듭니다.
   + *group-id*를 그룹의 `Id`로 바꿉니다.
   + *core-definition-version-arn*을 최신 그룹 버전에서 복사한 `CoreDefinitionVersionArn`으로 바꿉니다.
   + *function-definition-version-arn*을 새 함수 정의 버전에서 복사한 `Arn`으로 바꿉니다.
   + 최신 그룹 버전에서 복사한 다른 그룹 구성 요소의 ARN(예: `SubscriptionDefinitionVersionArn` 또는 `DeviceDefinitionVersionArn`)을 바꿉니다.
   + 사용되지 않은 파라미터를 모두 제거합니다. 예를 들어 그룹 버전에 리소스가 포함되어 있지 않으면 `--resource-definition-version-arn`을 제거합니다.

   ```
   aws greengrass create-group-version \
   --group-id group-id \
   --core-definition-version-arn core-definition-version-arn \
   --function-definition-version-arn function-definition-version-arn \
   --device-definition-version-arn device-definition-version-arn \
   --logger-definition-version-arn logger-definition-version-arn \
   --resource-definition-version-arn resource-definition-version-arn \
   --subscription-definition-version-arn subscription-definition-version-arn
   ```

1. <a name="copy-group-version-id"></a>출력에서 `Version`을 복사합니다. 새 그룹 버전의 ID가 이 값이 됩니다.

1. <a name="create-group-deployment"></a>새로운 그룹 버전을 사용하여 그룹을 배포합니다.
   + *group-id*를 해당 그룹에서 복사한 `Id`로 바꿉니다.
   + *group-version-id*를 새 그룹 버전에서 복사한 `Version`으로 바꿉니다.

   ```
   aws greengrass create-deployment \
   --group-id group-id \
   --group-version-id group-version-id \
   --deployment-type NewDeployment
   ```

 

나중에 스트림 관리자 설정을 다시 편집하려면 이 절차를 따르십시오. 업데이트된 구성으로 `GGStreamManager` 함수가 포함된 함수 정의 버전을 생성하십시오. 그룹 버전은 코어에 배포하려는 모든 구성 요소 버전 ARN을 참조해야 합니다. 변경 사항은 그룹이 배포된 후에 적용됩니다.

## 다음 사항도 참조하세요.
<a name="configure-stream-manager-see-also"></a>
+ [AWS IoT Greengrass 코어에서 데이터 스트림 관리](stream-manager.md)
+ [StreamManagerClient를 사용하여 스트림 작업](work-with-streams.md)
+ [지원되는 AWS 클라우드 대상에 대한 구성 내보내기](stream-export-configurations.md)
+ [로 데이터 스트림 내보내기 AWS 클라우드 (콘솔)](stream-manager-console.md)
+ [로 데이터 스트림 내보내기 AWS 클라우드 (CLI)](stream-manager-cli.md)

# StreamManagerClient를 사용하여 스트림 작업
<a name="work-with-streams"></a>

 AWS IoT Greengrass 코어에서 실행되는 사용자 정의 Lambda 함수는 [AWS IoT Greengrass 코어 SDK](lambda-functions.md#lambda-sdks)의 `StreamManagerClient` 객체를 사용하여 스트림 [관리자에서 스트림](stream-manager.md)을 생성한 다음 스트림과 상호 작용할 수 있습니다. Lambda 함수는 스트림을 생성할 때 스트림의 AWS 클라우드 대상, 우선 순위, 기타 내보내기 및 데이터 보존 정책을 정의합니다. 스트림 관리자로 데이터를 전송하기 위해 Lambda 함수는 데이터를 스트림에 추가합니다. 스트림에 대해 내보내기 대상이 정의된 경우 스트림 관리자는 스트림을 자동으로 내보냅니다.

**참고**  
<a name="stream-manager-clients"></a>일반적으로 스트림 관리자의 클라이언트는 사용자 정의 Lambda 함수입니다. 비즈니스 사례에서 필요한 경우 Greengrass 코어(예: Docker 컨테이너)에서 실행되는 비 Lambda 프로세도 스트림 관리자와 상호 작용하도록 허용할 수 있습니다. 자세한 내용은 [클라이언트 인증](stream-manager.md#stream-manager-security-client-authentication) 단원을 참조하십시오.

이 주제의 코드 조각은 클라이언트가 스트림 작업을 위해 `StreamManagerClient` 메서드를 직접적으로 호출하여 사용하는 방법을 보여줍니다. 메서드 및 해당 인수에 대한 구현 세부 정보를 보려면 각 코드 조각 다음에 나열된 SDK 참조에 대한 링크를 사용합니다. 전체 Python Lambda 함수를 포함하는 자습서는 [로 데이터 스트림 내보내기 AWS 클라우드 (콘솔)](stream-manager-console.md) 단원 또는 [로 데이터 스트림 내보내기 AWS 클라우드 (CLI)](stream-manager-cli.md) 단원을 참조하십시오.

Lambda 함수는 함수 핸들러 외부에서 `StreamManagerClient`을(를) 인스턴스화해야 합니다. 핸들러에서 인스턴스화된 함수는 호출될 때마다 스트림 관리자에 대한 `client` 및 연결을 만듭니다.

**참고**  
핸들러에서 `StreamManagerClient`을(를) 인스턴스한 경우, `client`이(가) 작업을 완료하면 사용자가 `close()` 메서드를 명시적으로 호출해야 합니다. 그렇지 않으면 `client`은(는) 연결을 열어두고 스크립트가 종료될 때까지 다른 스레드를 실행합니다.

`StreamManagerClient`에서는 다음 작업을 지원합니다.
+ [메시지 스트림 생성](#streammanagerclient-create-message-stream)
+ [메시지 추가](#streammanagerclient-append-message)
+ [메시지 읽기](#streammanagerclient-read-messages)
+ [스트림 나열](#streammanagerclient-list-streams)
+ [메시지 스트림 설명](#streammanagerclient-describe-message-stream)
+ [메시지 스트림 업데이트](#streammanagerclient-update-message-stream)
+ [메시지 스트림 삭제](#streammanagerclient-delete-message-stream)

## 메시지 스트림 생성
<a name="streammanagerclient-create-message-stream"></a>

스트림을 생성하기 위해 사용자 정의 Lambda 함수가 생성 메서드를 직접적으로 호출하고 `MessageStreamDefinition` 객체를 전달합니다. 이 객체는 스트림의 고유한 이름을 지정하고 최대 스트림 크기에 도달했을 때 스트림 관리자가 새 데이터를 처리하는 방법을 정의합니다. `MessageStreamDefinition` 및 해당 데이터 유형(예: `ExportDefinition`, `StrategyOnFull` 및 `Persistence`)을 사용하여 다른 스트림 속성을 정의할 수 있습니다. 다음이 포함됩니다.
+ 자동 내보내기를 위한 대상 AWS IoT SiteWise, AWS IoT 분석 Kinesis Data Streams 및 Amazon S3 대상입니다. 자세한 내용은 [지원되는 AWS 클라우드 대상에 대한 구성 내보내기](stream-export-configurations.md) 단원을 참조하십시오.
+ 내보내기 우선 순위. 스트림 관리자는 우선 순위가 낮은 스트림보다 우선 순위가 높은 스트림을 먼저 내보냅니다.
+  AWS IoT 분석, Kinesis Data Streams 및 대상의 최대 배치 크기 및 AWS IoT SiteWise 배치 간격입니다. 스트림 관리자는 두 조건 중 하나가 충족되면 메시지를 내보냅니다.
+ TTL(Time-to-Live). 스트림 데이터를 처리에 사용할 수 있도록 보장하는 시간입니다. 이 기간 내에 데이터를 사용할 수 있는지 확인해야 합니다. 이는 삭제 정책이 아닙니다. TTL 기간 직후에는 데이터가 삭제되지 않을 수 있습니다.
+ 스트림 지속성. 스트림을 파일 시스템에 저장하여 코어 재시작 시 데이터를 유지하거나 메모리에 스트림을 저장하도록 선택합니다.
+ 시작 시퀀스 번호 내보내기에서 시작 메시지로 사용할 메시지의 시퀀스 번호를 지정합니다.

`MessageStreamDefinition`에 대한 자세한 내용은 대상 언어에 대한 SDK 참조를 확인하세요.
+ Java SDK의 [MessageStreamDefinition](https://aws.github.io/aws-greengrass-core-sdk-java/com/amazonaws/greengrass/streammanager/model/MessageStreamDefinition.html)
+ Node.js SDK의 [MessageStreamDefinition](https://aws.github.io/aws-greengrass-core-sdk-js/aws-greengrass-core-sdk.StreamManager.MessageStreamDefinition.html)
+ Python SDK의 [MessageStreamDefinition](https://aws.github.io/aws-greengrass-core-sdk-python/_apidoc/greengrasssdk.stream_manager.data.html#greengrasssdk.stream_manager.data.MessageStreamDefinition)

**참고**  
<a name="streammanagerclient-http-config"></a>`StreamManagerClient`는 스트림을 HTTP 서버로 내보내는 데 사용할 수 있는 대상을 제공합니다. 이 대상은 테스트 목적으로만 사용됩니다. 이 대상은 안정적이지 않으며 프로덕션 환경에서 사용할 수 없습니다.

스트림이 생성되면 Lambda 함수는 스트림에 [메시지를 추가](#streammanagerclient-append-message)하여 내보내기용 데이터를 보내고 로컬 처리를 위해 스트림에서 [메시지를 읽을](#streammanagerclient-append-message) 수 있습니다. 생성하는 스트림 수는 하드웨어 기능 및 비즈니스 사례에 따라 다릅니다. 한 전략은 스트림에 대해 여러 대상을 정의할 수 있지만 AWS IoT 분석 또는 Kinesis 데이터 스트림의 각 대상 채널에 대해 스트림을 생성하는 것입니다. 스트림은 안정적인 수명을 가지고 있습니다.

### 요구 사항
<a name="streammanagerclient-create-message-stream-reqs"></a>

이 작업에는 다음과 같은 요구 사항이 있습니다.
+ <a name="streammanagerclient-min-ggc-1.10.0"></a>최소 AWS IoT Greengrass 코어 버전: 1.10.0
+ <a name="streammanagerclient-min-sdk-ggc-1.10.0"></a>최소 AWS IoT Greengrass 코어 SDK 버전: Python: 1.5.0  \$1  Java: 1.4.0  \$1  Node.js: 1.6.0

**참고**  
 AWS IoT SiteWise 또는 Amazon S3 내보내기 대상을 사용하여 스트림을 생성하는 데 필요한 요구 사항은 다음과 같습니다.  
<a name="streammanagerclient-min-ggc-1.11.0"></a>최소 AWS IoT Greengrass 코어 버전: 1.11.0
<a name="streammanagerclient-min-sdk-ggc-1.11.0"></a>최소 AWS IoT Greengrass 코어 SDK 버전: Python: 1.6.0  \$1  Java: 1.5.0  \$1  Node.js: 1.7.0

### 예제
<a name="streammanagerclient-create-message-stream-examples"></a>

다음 코드 조각은 `StreamName`(이)라는 스트림을 생성합니다. 이는 `MessageStreamDefinition` 및 하위 데이터 유형의 스트림 속성을 정의합니다.

------
#### [ Python ]

```
client = StreamManagerClient()
 
try:
    client.create_message_stream(MessageStreamDefinition(
        name="StreamName",  # Required.
        max_size=268435456,  # Default is 256 MB.
        stream_segment_size=16777216,  # Default is 16 MB.
        time_to_live_millis=None,  # By default, no TTL is enabled.
        strategy_on_full=StrategyOnFull.OverwriteOldestData,  # Required.
        persistence=Persistence.File,  # Default is File.
        flush_on_write=False,  # Default is false.
        export_definition=ExportDefinition(  # Optional. Choose where/how the stream is exported to the AWS 클라우드.
            kinesis=None,
            iot_analytics=None,
            iot_sitewise=None,
            s3_task_executor=None
        )
    ))
except StreamManagerException:
    pass
    # Properly handle errors.
except ConnectionError or asyncio.TimeoutError:
    pass
    # Properly handle errors.
```

Python SDK 참조: [create\$1message\$1stream](https://aws.github.io/aws-greengrass-core-sdk-python/_apidoc/greengrasssdk.stream_manager.streammanagerclient.html#greengrasssdk.stream_manager.streammanagerclient.StreamManagerClient.create_message_stream) \$1 [MessageStreamDefinition](https://aws.github.io/aws-greengrass-core-sdk-python/_apidoc/greengrasssdk.stream_manager.data.html#greengrasssdk.stream_manager.data.MessageStreamDefinition)

------
#### [ Java ]

```
try (final StreamManagerClient client = GreengrassClientBuilder.streamManagerClient().build()) {
    client.createMessageStream(
            new MessageStreamDefinition()
                    .withName("StreamName") // Required.
                    .withMaxSize(268435456L)  // Default is 256 MB.
                    .withStreamSegmentSize(16777216L)  // Default is 16 MB.
                    .withTimeToLiveMillis(null)  // By default, no TTL is enabled.
                    .withStrategyOnFull(StrategyOnFull.OverwriteOldestData)  // Required.
                    .withPersistence(Persistence.File)  // Default is File.
                    .withFlushOnWrite(false)  // Default is false.
                    .withExportDefinition(  // Optional. Choose where/how the stream is exported to the AWS 클라우드.
                            new ExportDefinition()
                                    .withKinesis(null)
                                    .withIotAnalytics(null)
                                    .withIotSitewise(null)
                                    .withS3TaskExecutor(null)
                    )
 
    );
} catch (StreamManagerException e) {
    // Properly handle exception.
}
```

Java SDK 참조: [createMessageStream](https://aws.github.io/aws-greengrass-core-sdk-java/com/amazonaws/greengrass/streammanager/client/StreamManagerClient.html#createMessageStream-com.amazonaws.greengrass.streammanager.model.MessageStreamDefinition-) \$1 [MessageStreamDefinition](https://aws.github.io/aws-greengrass-core-sdk-java/com/amazonaws/greengrass/streammanager/model/MessageStreamDefinition.html)

------
#### [ Node.js ]

```
const client = new StreamManagerClient();
client.onConnected(async () => {
    try {
        await client.createMessageStream(
            new MessageStreamDefinition()
                .withName("StreamName") // Required.
                .withMaxSize(268435456)  // Default is 256 MB.
                .withStreamSegmentSize(16777216)  // Default is 16 MB.
                .withTimeToLiveMillis(null)  // By default, no TTL is enabled.
                .withStrategyOnFull(StrategyOnFull.OverwriteOldestData)  // Required.
                .withPersistence(Persistence.File)  // Default is File.
                .withFlushOnWrite(false)  // Default is false.
                .withExportDefinition(  // Optional. Choose where/how the stream is exported to the AWS 클라우드.
                    new ExportDefinition()
                        .withKinesis(null)
                        .withIotAnalytics(null)
                        .withIotSitewise(null)
                        .withS3TaskExecutor(null)
                )
        );
    } catch (e) {
        // Properly handle errors.
    }
});
client.onError((err) => {
    // Properly handle connection errors.
    // This is called only when the connection to the StreamManager server fails.
});
```

Node.js SDK 참조: [createMessageStream](https://aws.github.io/aws-greengrass-core-sdk-js/aws-greengrass-core-sdk.StreamManager.StreamManagerClient.html#createMessageStream) \$1 [MessageStreamDefinition](https://aws.github.io/aws-greengrass-core-sdk-js/aws-greengrass-core-sdk.StreamManager.MessageStreamDefinition.html)

------

내보내기 대상 구성에 대한 자세한 내용은 [지원되는 AWS 클라우드 대상에 대한 구성 내보내기](stream-export-configurations.md) 섹션을 참조하세요.

 

## 메시지 추가
<a name="streammanagerclient-append-message"></a>

내보내기를 위해 스트림 관리자로 데이터를 전송하려면 Lambda 함수가 데이터를 대상 스트림에 추가합니다. 내보내기 대상은 이 메소드에 전달할 데이터 유형을 결정합니다.

### 요구 사항
<a name="streammanagerclient-append-message-reqs"></a>

이 작업에는 다음과 같은 요구 사항이 있습니다.
+ <a name="streammanagerclient-min-ggc-1.10.0"></a>최소 AWS IoT Greengrass 코어 버전: 1.10.0
+ <a name="streammanagerclient-min-sdk-ggc-1.10.0"></a>최소 AWS IoT Greengrass 코어 SDK 버전: Python: 1.5.0  \$1  Java: 1.4.0  \$1  Node.js: 1.6.0

**참고**  
 AWS IoT SiteWise 또는 Amazon S3 내보내기 대상에 메시지를 추가하는 데 필요한 요구 사항은 다음과 같습니다.  
<a name="streammanagerclient-min-ggc-1.11.0"></a>최소 AWS IoT Greengrass 코어 버전: 1.11.0
<a name="streammanagerclient-min-sdk-ggc-1.11.0"></a>최소 AWS IoT Greengrass 코어 SDK 버전: Python: 1.6.0  \$1  Java: 1.5.0  \$1  Node.js: 1.7.0

### 예제
<a name="streammanagerclient-append-message-examples"></a>

#### AWS IoT 분석 또는 Kinesis Data Streams 내보내기 대상
<a name="streammanagerclient-append-message-blob"></a>

다음 코드 조각은 `StreamName`이라는 스트림에 메시지를 추가합니다. AWS IoT 분석 또는 Kinesis Data Streams 대상의 경우 Lambda 함수는 데이터 BLOB을 추가합니다.

이 코드 조각에는 다음과 같은 요구 사항이 있습니다.
+ <a name="streammanagerclient-min-ggc-1.10.0"></a>최소 AWS IoT Greengrass 코어 버전: 1.10.0
+ <a name="streammanagerclient-min-sdk-ggc-1.10.0"></a>최소 AWS IoT Greengrass 코어 SDK 버전: Python: 1.5.0  \$1  Java: 1.4.0  \$1  Node.js: 1.6.0

------
#### [ Python ]

```
client = StreamManagerClient()
 
try:
    sequence_number = client.append_message(stream_name="StreamName", data=b'Arbitrary bytes data')
except StreamManagerException:
    pass
    # Properly handle errors.
except ConnectionError or asyncio.TimeoutError:
    pass
    # Properly handle errors.
```

Python SDK 참조: [append\$1message](https://aws.github.io/aws-greengrass-core-sdk-python/_apidoc/greengrasssdk.stream_manager.streammanagerclient.html#greengrasssdk.stream_manager.streammanagerclient.StreamManagerClient.append_message)

------
#### [ Java ]

```
try (final StreamManagerClient client = GreengrassClientBuilder.streamManagerClient().build()) {
    long sequenceNumber = client.appendMessage("StreamName", "Arbitrary byte array".getBytes());
} catch (StreamManagerException e) {
    // Properly handle exception.
}
```

Java SDK 참조: [appendMessage](https://aws.github.io/aws-greengrass-core-sdk-java/com/amazonaws/greengrass/streammanager/client/StreamManagerClient.html#appendMessage-java.lang.String-byte:A-)

------
#### [ Node.js ]

```
const client = new StreamManagerClient();
client.onConnected(async () => {
    try {
        const sequenceNumber = await client.appendMessage("StreamName", Buffer.from("Arbitrary byte array"));
    } catch (e) {
        // Properly handle errors.
    }
});
client.onError((err) => {
    // Properly handle connection errors.
    // This is called only when the connection to the StreamManager server fails.
});
```

Node.js SDK 참조: [appendMessage](https://aws.github.io/aws-greengrass-core-sdk-js/aws-greengrass-core-sdk.StreamManager.StreamManagerClient.html#appendMessage)

------

#### AWS IoT SiteWise 내보내기 대상
<a name="streammanagerclient-append-message-sitewise"></a>

다음 코드 조각은 `StreamName`이라는 스트림에 메시지를 추가합니다. AWS IoT SiteWise 대상의 경우 Lambda 함수는 직렬화된 `PutAssetPropertyValueEntry` 객체를 추가합니다. 자세한 내용은 [로 내보내기 AWS IoT SiteWise](stream-export-configurations.md#export-streams-to-sitewise) 단원을 참조하십시오.

**참고**  
<a name="BatchPutAssetPropertyValue-data-reqs"></a>데이터를 전송할 때 AWS IoT SiteWise데이터는 `BatchPutAssetPropertyValue` 작업의 요구 사항을 충족해야 합니다. 자세한 내용은 *AWS IoT SiteWise API 참조*의 [BatchPutAssetPropertyValue](https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_BatchPutAssetPropertyValue.html)를 참조하세요.

이 코드 조각에는 다음과 같은 요구 사항이 있습니다.
+ <a name="streammanagerclient-min-ggc-1.11.0"></a>최소 AWS IoT Greengrass 코어 버전: 1.11.0
+ <a name="streammanagerclient-min-sdk-ggc-1.11.0"></a>최소 AWS IoT Greengrass 코어 SDK 버전: Python: 1.6.0  \$1  Java: 1.5.0  \$1  Node.js: 1.7.0

------
#### [ Python ]

```
client = StreamManagerClient()
 
try:
    # SiteWise requires unique timestamps in all messages. Add some randomness to time and offset.

    # Note: To create a new asset property data, you should use the classes defined in the
    # greengrasssdk.stream_manager module.

    time_in_nanos = TimeInNanos(
        time_in_seconds=calendar.timegm(time.gmtime()) - random.randint(0, 60), offset_in_nanos=random.randint(0, 10000)
    )
    variant = Variant(double_value=random.random())
    asset = [AssetPropertyValue(value=variant, quality=Quality.GOOD, timestamp=time_in_nanos)]
    putAssetPropertyValueEntry = PutAssetPropertyValueEntry(entry_id=str(uuid.uuid4()), property_alias="PropertyAlias", property_values=asset)
    sequence_number = client.append_message(stream_name="StreamName", data=Util.validate_and_serialize_to_json_bytes(putAssetPropertyValueEntry))
except StreamManagerException:
    pass
    # Properly handle errors.
except ConnectionError or asyncio.TimeoutError:
    pass
    # Properly handle errors.
```

Python SDK 참조: [append\$1message](https://aws.github.io/aws-greengrass-core-sdk-python/_apidoc/greengrasssdk.stream_manager.streammanagerclient.html#greengrasssdk.stream_manager.streammanagerclient.StreamManagerClient.append_message) \$1 [PutAssetPropertyValueEntry](https://aws.github.io/aws-greengrass-core-sdk-python/_apidoc/greengrasssdk.stream_manager.data.html#greengrasssdk.stream_manager.data.PutAssetPropertyValueEntry)

------
#### [ Java ]

```
try (final StreamManagerClient client = GreengrassClientBuilder.streamManagerClient().build()) {
    Random rand = new Random();
    // Note: To create a new asset property data, you should use the classes defined in the
    // com.amazonaws.greengrass.streammanager.model.sitewise package.
    List<AssetPropertyValue> entries = new ArrayList<>() ;

    // IoTSiteWise requires unique timestamps in all messages. Add some randomness to time and offset.
    final int maxTimeRandomness = 60;
    final int maxOffsetRandomness = 10000;
    double randomValue = rand.nextDouble();
    TimeInNanos timestamp = new TimeInNanos()
            .withTimeInSeconds(Instant.now().getEpochSecond() - rand.nextInt(maxTimeRandomness))
            .withOffsetInNanos((long) (rand.nextInt(maxOffsetRandomness)));
    AssetPropertyValue entry = new AssetPropertyValue()
            .withValue(new Variant().withDoubleValue(randomValue))
            .withQuality(Quality.GOOD)
            .withTimestamp(timestamp);
    entries.add(entry);

    PutAssetPropertyValueEntry putAssetPropertyValueEntry = new PutAssetPropertyValueEntry()
            .withEntryId(UUID.randomUUID().toString())
            .withPropertyAlias("PropertyAlias")
            .withPropertyValues(entries);
    long sequenceNumber = client.appendMessage("StreamName", ValidateAndSerialize.validateAndSerializeToJsonBytes(putAssetPropertyValueEntry));
} catch (StreamManagerException e) {
    // Properly handle exception.
}
```

Java SDK 참조: [appendMessage](https://aws.github.io/aws-greengrass-core-sdk-java/com/amazonaws/greengrass/streammanager/client/StreamManagerClient.html#appendMessage-java.lang.String-byte:A-) \$1 [PutAssetPropertyValueEntry](https://aws.github.io/aws-greengrass-core-sdk-java/com/amazonaws/greengrass/streammanager/model/sitewise/PutAssetPropertyValueEntry.html)

------
#### [ Node.js ]

```
const client = new StreamManagerClient();
client.onConnected(async () => {
    try {
        const maxTimeRandomness = 60;
        const maxOffsetRandomness = 10000;
        const randomValue = Math.random();
        // Note: To create a new asset property data, you should use the classes defined in the
        // aws-greengrass-core-sdk StreamManager module.
        const timestamp = new TimeInNanos()
            .withTimeInSeconds(Math.round(Date.now() / 1000) - Math.floor(Math.random() - maxTimeRandomness))
            .withOffsetInNanos(Math.floor(Math.random() * maxOffsetRandomness));
        const entry = new AssetPropertyValue()
            .withValue(new Variant().withDoubleValue(randomValue))
            .withQuality(Quality.GOOD)
            .withTimestamp(timestamp);

        const putAssetPropertyValueEntry =  new PutAssetPropertyValueEntry()
            .withEntryId(`${ENTRY_ID_PREFIX}${i}`)
            .withPropertyAlias("PropertyAlias")
            .withPropertyValues([entry]);
        const sequenceNumber = await client.appendMessage("StreamName", util.validateAndSerializeToJsonBytes(putAssetPropertyValueEntry));
    } catch (e) {
        // Properly handle errors.
    }
});
client.onError((err) => {
    // Properly handle connection errors.
    // This is called only when the connection to the StreamManager server fails.
});
```

Node.js SDK 참조: [appendMessage](https://aws.github.io/aws-greengrass-core-sdk-js/aws-greengrass-core-sdk.StreamManager.StreamManagerClient.html#appendMessage) \$1 [PutAssetPropertyValueEntry](https://aws.github.io/aws-greengrass-core-sdk-js/aws-greengrass-core-sdk.StreamManager.PutAssetPropertyValueEntry.html)

------

#### Amazon S3 대상
<a name="streammanagerclient-append-message-export-task"></a>

다음 코드 조각은 `StreamName`이라는 스트림에 내보내기 작업을 추가합니다. Amazon S3 대상의 경우, Lambda 함수는 소스 입력 파일 및 대상 Amazon S3 객체에 대한 정보가 포함된 직렬화된 `S3ExportTaskDefinition` 객체를 추가합니다. 지정된 객체가 없는 경우 Stream Manager가 자동으로 생성합니다. 자세한 내용은 [Amazon S3로 내보내기](stream-export-configurations.md#export-streams-to-s3) 단원을 참조하십시오.

이 코드 조각에는 다음과 같은 요구 사항이 있습니다.
+ <a name="streammanagerclient-min-ggc-1.11.0"></a>최소 AWS IoT Greengrass 코어 버전: 1.11.0
+ <a name="streammanagerclient-min-sdk-ggc-1.11.0"></a>최소 AWS IoT Greengrass 코어 SDK 버전: Python: 1.6.0  \$1  Java: 1.5.0  \$1  Node.js: 1.7.0

------
#### [ Python ]

```
client = StreamManagerClient()
 
try:
    # Append an Amazon S3 Task definition and print the sequence number.
    s3_export_task_definition = S3ExportTaskDefinition(input_url="URLToFile", bucket="BucketName", key="KeyName")
    sequence_number = client.append_message(stream_name="StreamName", data=Util.validate_and_serialize_to_json_bytes(s3_export_task_definition))
except StreamManagerException:
    pass
    # Properly handle errors.
except ConnectionError or asyncio.TimeoutError:
    pass
    # Properly handle errors.
```

Python SDK 참조: [append\$1message](https://aws.github.io/aws-greengrass-core-sdk-python/_apidoc/greengrasssdk.stream_manager.streammanagerclient.html#greengrasssdk.stream_manager.streammanagerclient.StreamManagerClient.append_message) \$1 [S3ExportTaskDefinition](https://aws.github.io/aws-greengrass-core-sdk-python/_apidoc/greengrasssdk.stream_manager.data.html#greengrasssdk.stream_manager.data.S3ExportTaskDefinition)

------
#### [ Java ]

```
try (final StreamManagerClient client = GreengrassClientBuilder.streamManagerClient().build()) {
    // Append an Amazon S3 export task definition and print the sequence number.
    S3ExportTaskDefinition s3ExportTaskDefinition = new S3ExportTaskDefinition()
        .withBucket("BucketName")
        .withKey("KeyName")
        .withInputUrl("URLToFile");
    long sequenceNumber = client.appendMessage("StreamName", ValidateAndSerialize.validateAndSerializeToJsonBytes(s3ExportTaskDefinition));
} catch (StreamManagerException e) {
    // Properly handle exception.
}
```

Java SDK 참조: [appendMessage](https://aws.github.io/aws-greengrass-core-sdk-java/com/amazonaws/greengrass/streammanager/client/StreamManagerClient.html#appendMessage-java.lang.String-byte:A-) \$1 [S3ExportTaskDefinition](https://aws.github.io/aws-greengrass-core-sdk-java/com/amazonaws/greengrass/streammanager/model/S3ExportTaskDefinition.html)

------
#### [ Node.js ]

```
const client = new StreamManagerClient();
client.onConnected(async () => {
    try {
     // Append an Amazon S3 export task definition and print the sequence number.
     const taskDefinition = new S3ExportTaskDefinition()
        .withBucket("BucketName")
        .withKey("KeyName")
        .withInputUrl("URLToFile");
        const sequenceNumber = await client.appendMessage("StreamName", util.validateAndSerializeToJsonBytes(taskDefinition)));
    } catch (e) {
        // Properly handle errors.
    }
});
client.onError((err) => {
    // Properly handle connection errors.
    // This is called only when the connection to the StreamManager server fails.
});
```

Node.js SDK 참조: [appendMessage](https://aws.github.io/aws-greengrass-core-sdk-js/aws-greengrass-core-sdk.StreamManager.StreamManagerClient.html#appendMessage) \$1 [S3ExportTaskDefinition](https://aws.github.io/aws-greengrass-core-sdk-js/aws-greengrass-core-sdk.StreamManager.S3ExportTaskDefinition.html)

------

 

## 메시지 읽기
<a name="streammanagerclient-read-messages"></a>

스트림의 메시지 읽기

### 요구 사항
<a name="streammanagerclient-read-messages-reqs"></a>

이 작업에는 다음과 같은 요구 사항이 있습니다.
+ <a name="streammanagerclient-min-ggc-1.10.0"></a>최소 AWS IoT Greengrass 코어 버전: 1.10.0
+ <a name="streammanagerclient-min-sdk-ggc-1.10.0"></a>최소 AWS IoT Greengrass 코어 SDK 버전: Python: 1.5.0  \$1  Java: 1.4.0  \$1  Node.js: 1.6.0

### 예제
<a name="streammanagerclient-read-messages-examples"></a>

다음 코드 조각은 `StreamName`이라는 스트림에서 메시지를 읽습니다. 읽기 메서드는 읽기를 시작할 시퀀스 번호, 읽기를 수행할 최소 및 최대 숫자, 메시지 읽기 시간 제한을 지정하는 선택적 `ReadMessagesOptions` 객체를 가져옵니다.

------
#### [ Python ]

```
client = StreamManagerClient()
 
try:
    message_list = client.read_messages(
        stream_name="StreamName",
        # By default, if no options are specified, it tries to read one message from the beginning of the stream.
        options=ReadMessagesOptions(
            desired_start_sequence_number=100,
            # Try to read from sequence number 100 or greater. By default, this is 0.
            min_message_count=10,
            # Try to read 10 messages. If 10 messages are not available, then NotEnoughMessagesException is raised. By default, this is 1.
            max_message_count=100,  # Accept up to 100 messages. By default this is 1.
            read_timeout_millis=5000
            # Try to wait at most 5 seconds for the min_messsage_count to be fulfilled. By default, this is 0, which immediately returns the messages or an exception.
        )
    )
except StreamManagerException:
    pass
    # Properly handle errors.
except ConnectionError or asyncio.TimeoutError:
    pass
    # Properly handle errors.
```

Python SDK 참조: [read\$1messages](https://aws.github.io/aws-greengrass-core-sdk-python/_apidoc/greengrasssdk.stream_manager.streammanagerclient.html#greengrasssdk.stream_manager.streammanagerclient.StreamManagerClient.read_messages) \$1 [ReadMessagesOptions](https://aws.github.io/aws-greengrass-core-sdk-python/_apidoc/greengrasssdk.stream_manager.data.html#greengrasssdk.stream_manager.data.ReadMessagesOptions)

------
#### [ Java ]

```
try (final StreamManagerClient client = GreengrassClientBuilder.streamManagerClient().build()) {
    List<Message> messages = client.readMessages("StreamName",
            // By default, if no options are specified, it tries to read one message from the beginning of the stream.
            new ReadMessagesOptions()
                    // Try to read from sequence number 100 or greater. By default this is 0.
                    .withDesiredStartSequenceNumber(100L)
                    // Try to read 10 messages. If 10 messages are not available, then NotEnoughMessagesException is raised. By default, this is 1.
                    .withMinMessageCount(10L)
                    // Accept up to 100 messages. By default this is 1.
                    .withMaxMessageCount(100L)
                    // Try to wait at most 5 seconds for the min_messsage_count to be fulfilled. By default, this is 0, which immediately returns the messages or an exception.
                    .withReadTimeoutMillis(Duration.ofSeconds(5L).toMillis())
    );
} catch (StreamManagerException e) {
    // Properly handle exception.
}
```

Java SDK 참조: [readMessages](https://aws.github.io/aws-greengrass-core-sdk-java/com/amazonaws/greengrass/streammanager/client/StreamManagerClient.html#readMessages-java.lang.String-com.amazonaws.greengrass.streammanager.model.ReadMessagesOptions-) \$1 [ReadMessagesOptions](https://aws.github.io/aws-greengrass-core-sdk-java/com/amazonaws/greengrass/streammanager/model/ReadMessagesOptions.html)

------
#### [ Node.js ]

```
const client = new StreamManagerClient();
client.onConnected(async () => {
    try {
        const messages = await client.readMessages("StreamName",
            // By default, if no options are specified, it tries to read one message from the beginning of the stream.
            new ReadMessagesOptions()
                // Try to read from sequence number 100 or greater. By default this is 0.
                .withDesiredStartSequenceNumber(100)
                // Try to read 10 messages. If 10 messages are not available, then NotEnoughMessagesException is thrown. By default, this is 1.
                .withMinMessageCount(10)
                // Accept up to 100 messages. By default this is 1.
                .withMaxMessageCount(100)
                // Try to wait at most 5 seconds for the minMessageCount to be fulfilled. By default, this is 0, which immediately returns the messages or an exception.
                .withReadTimeoutMillis(5 * 1000)
        );
    } catch (e) {
        // Properly handle errors.
    }
});
client.onError((err) => {
    // Properly handle connection errors.
    // This is called only when the connection to the StreamManager server fails.
});
```

Node.js SDK 참조: [readMessages](https://aws.github.io/aws-greengrass-core-sdk-js/aws-greengrass-core-sdk.StreamManager.StreamManagerClient.html#readMessages) \$1 [ReadMessagesOptions](https://aws.github.io/aws-greengrass-core-sdk-js/aws-greengrass-core-sdk.StreamManager.ReadMessagesOptions.html)

------

 

## 스트림 나열
<a name="streammanagerclient-list-streams"></a>

스트림 매니저에서 스트림 목록을 가져옵니다.

### 요구 사항
<a name="streammanagerclient-list-streams-reqs"></a>

이 작업에는 다음과 같은 요구 사항이 있습니다.
+ <a name="streammanagerclient-min-ggc-1.10.0"></a>최소 AWS IoT Greengrass 코어 버전: 1.10.0
+ <a name="streammanagerclient-min-sdk-ggc-1.10.0"></a>최소 AWS IoT Greengrass 코어 SDK 버전: Python: 1.5.0  \$1  Java: 1.4.0  \$1  Node.js: 1.6.0

### 예제
<a name="streammanagerclient-list-streams-examples"></a>

다음 코드 조각은 스트림 관리자에서 이름별로 스트림 목록을 가져옵니다.

------
#### [ Python ]

```
client = StreamManagerClient()
 
try:
    stream_names = client.list_streams()
except StreamManagerException:
    pass
    # Properly handle errors.
except ConnectionError or asyncio.TimeoutError:
    pass
    # Properly handle errors.
```

Python SDK 참조: [list\$1streams](https://aws.github.io/aws-greengrass-core-sdk-python/_apidoc/greengrasssdk.stream_manager.streammanagerclient.html#greengrasssdk.stream_manager.streammanagerclient.StreamManagerClient.list_streams)

------
#### [ Java ]

```
try (final StreamManagerClient client = GreengrassClientBuilder.streamManagerClient().build()) {
    List<String> streamNames = client.listStreams();
} catch (StreamManagerException e) {
    // Properly handle exception.
}
```

Java SDK 참조: [listStreams](https://aws.github.io/aws-greengrass-core-sdk-java/com/amazonaws/greengrass/streammanager/client/StreamManagerClient.html#listStreams--)

------
#### [ Node.js ]

```
const client = new StreamManagerClient();
client.onConnected(async () => {
    try {
        const streams = await client.listStreams();
    } catch (e) {
        // Properly handle errors.
    }
});
client.onError((err) => {
    // Properly handle connection errors.
    // This is called only when the connection to the StreamManager server fails.
});
```

Node.js SDK 참조: [listStreams](https://aws.github.io/aws-greengrass-core-sdk-js/aws-greengrass-core-sdk.StreamManager.StreamManagerClient.html#listStreams)

------

 

## 메시지 스트림 설명
<a name="streammanagerclient-describe-message-stream"></a>

스트림 정의, 크기, 내보내기 상태 등 스트림에 대한 메타데이터를 가져옵니다.

### 요구 사항
<a name="streammanagerclient-describe-message-stream-reqs"></a>

이 작업에는 다음과 같은 요구 사항이 있습니다.
+ <a name="streammanagerclient-min-ggc-1.10.0"></a>최소 AWS IoT Greengrass 코어 버전: 1.10.0
+ <a name="streammanagerclient-min-sdk-ggc-1.10.0"></a>최소 AWS IoT Greengrass 코어 SDK 버전: Python: 1.5.0  \$1  Java: 1.4.0  \$1  Node.js: 1.6.0

### 예제
<a name="streammanagerclient-describe-message-stream-examples"></a>

다음 코드 조각은 스트림의 정의, 크기 및 내보내기 상태를 포함하여 `StreamName`라는 스트림에 대한 메타데이터를 가져옵니다.

------
#### [ Python ]

```
client = StreamManagerClient()
 
try:
    stream_description = client.describe_message_stream(stream_name="StreamName")
    if stream_description.export_statuses[0].error_message:
        # The last export of export destination 0 failed with some error
        # Here is the last sequence number that was successfully exported
        stream_description.export_statuses[0].last_exported_sequence_number
 
    if (stream_description.storage_status.newest_sequence_number >
            stream_description.export_statuses[0].last_exported_sequence_number):
        pass
        # The end of the stream is ahead of the last exported sequence number
except StreamManagerException:
    pass
    # Properly handle errors.
except ConnectionError or asyncio.TimeoutError:
    pass
    # Properly handle errors.
```

Python SDK 참조: [describe\$1message\$1stream](https://aws.github.io/aws-greengrass-core-sdk-python/_apidoc/greengrasssdk.stream_manager.streammanagerclient.html#greengrasssdk.stream_manager.streammanagerclient.StreamManagerClient.describe_message_stream)

------
#### [ Java ]

```
try (final StreamManagerClient client = GreengrassClientBuilder.streamManagerClient().build()) {
    MessageStreamInfo description = client.describeMessageStream("StreamName");
    String lastErrorMessage = description.getExportStatuses().get(0).getErrorMessage();
    if (lastErrorMessage != null && !lastErrorMessage.equals("")) {
        // The last export of export destination 0 failed with some error.
        // Here is the last sequence number that was successfully exported.
        description.getExportStatuses().get(0).getLastExportedSequenceNumber();
    }
 
    if (description.getStorageStatus().getNewestSequenceNumber() >
            description.getExportStatuses().get(0).getLastExportedSequenceNumber()) {
        // The end of the stream is ahead of the last exported sequence number.
    }
} catch (StreamManagerException e) {
    // Properly handle exception.
}
```

Java SDK 참조: [describeMessageStream](https://aws.github.io/aws-greengrass-core-sdk-java/com/amazonaws/greengrass/streammanager/client/StreamManagerClient.html#describeMessageStream-java.lang.String-)

------
#### [ Node.js ]

```
const client = new StreamManagerClient();
client.onConnected(async () => {
    try {
        const description = await client.describeMessageStream("StreamName");
        const lastErrorMessage = description.exportStatuses[0].errorMessage;
        if (lastErrorMessage) {
            // The last export of export destination 0 failed with some error.
            // Here is the last sequence number that was successfully exported.
            description.exportStatuses[0].lastExportedSequenceNumber;
        }
 
        if (description.storageStatus.newestSequenceNumber >
            description.exportStatuses[0].lastExportedSequenceNumber) {
            // The end of the stream is ahead of the last exported sequence number.
        }
    } catch (e) {
        // Properly handle errors.
    }
});
client.onError((err) => {
    // Properly handle connection errors.
    // This is called only when the connection to the StreamManager server fails.
});
```

Node.js SDK 참조: [describeMessageStream](https://aws.github.io/aws-greengrass-core-sdk-js/aws-greengrass-core-sdk.StreamManager.StreamManagerClient.html#describeMessageStream)

------

 

## 메시지 스트림 업데이트
<a name="streammanagerclient-update-message-stream"></a>

기존 스트림의 속성을 업데이트합니다. 스트림이 생성된 후 요구 사항이 변경되면 스트림을 업데이트하는 것이 좋습니다. 예제:
+  AWS 클라우드 대상에 대한 새 [내보내기 구성을](stream-export-configurations.md) 추가합니다.
+ 스트림의 최대 크기를 늘려 데이터를 내보내거나 유지하는 방법을 변경합니다. 예를 들어 스트림 크기와 전체 설정 전략을 함께 사용하면 스트림 관리자가 데이터를 처리하기 전에 데이터가 삭제되거나 거부될 수 있습니다.
+ 예를 들어, 내보내기 작업이 오래 걸리고 업로드 데이터를 할당하려는 경우 내보내기를 일시 중지했다가 다시 시작합니다.

Lambda 함수는 다음과 같은 상위 수준 프로세스에 따라 스트림을 업데이트합니다.

1. [스트림에 대한 설명을 가져옵니다.](#streammanagerclient-describe-message-stream)

1. 해당 `MessageStreamDefinition` 및 하위 객체의 대상 속성을 업데이트합니다.

1. 업데이트된 `MessageStreamDefinition`을(를) 전달합니다. 업데이트된 스트림에 대한 전체 객체 정의를 포함해야 합니다. 정의되지 않은 속성은 기본값으로 되돌아갑니다.

   내보내기에서 시작 메시지로 사용할 메시지의 시퀀스 번호를 지정할 수 있습니다.

### 요구 사항
<a name="-streammanagerclient-update-message-streamreqs"></a>

이 작업에는 다음과 같은 요구 사항이 있습니다.
+ <a name="streammanagerclient-min-ggc-1.11.0"></a>최소 AWS IoT Greengrass 코어 버전: 1.11.0
+ <a name="streammanagerclient-min-sdk-ggc-1.11.0"></a>최소 AWS IoT Greengrass 코어 SDK 버전: Python: 1.6.0  \$1  Java: 1.5.0  \$1  Node.js: 1.7.0

### 예제
<a name="streammanagerclient-update-message-stream-examples"></a>

다음 코드 조각은 `StreamName`(이)라는 스트림을 업데이트합니다. Kinesis Data Streams로 내보내는 스트림의 여러 속성을 업데이트합니다.

------
#### [ Python ]

```
client = StreamManagerClient()
 
try:
    message_stream_info = client.describe_message_stream(STREAM_NAME)
    message_stream_info.definition.max_size=536870912
    message_stream_info.definition.stream_segment_size=33554432
    message_stream_info.definition.time_to_live_millis=3600000
    message_stream_info.definition.strategy_on_full=StrategyOnFull.RejectNewData
    message_stream_info.definition.persistence=Persistence.Memory
    message_stream_info.definition.flush_on_write=False
    message_stream_info.definition.export_definition.kinesis=
        [KinesisConfig(  
            # Updating Export definition to add a Kinesis Stream configuration.
            identifier=str(uuid.uuid4()), kinesis_stream_name=str(uuid.uuid4()))]
    client.update_message_stream(message_stream_info.definition)
except StreamManagerException:
    pass
    # Properly handle errors.
except ConnectionError or asyncio.TimeoutError:
    pass
    # Properly handle errors.
```

Python SDK 참조: [updateMessageStream](https://aws.github.io/aws-greengrass-core-sdk-python/_apidoc/greengrasssdk.stream_manager.streammanagerclient.html#greengrasssdk.stream_manager.streammanagerclient.StreamManagerClient.update_message_stream) \$1 [MessageStreamDefinition](https://aws.github.io/aws-greengrass-core-sdk-python/_apidoc/greengrasssdk.stream_manager.data.html#greengrasssdk.stream_manager.data.MessageStreamDefinition)

------
#### [ Java ]

```
try (final StreamManagerClient client = GreengrassClientBuilder.streamManagerClient().build()) {
    MessageStreamInfo messageStreamInfo = client.describeMessageStream(STREAM_NAME);
    // Update the message stream with new values.
    client.updateMessageStream(
        messageStreamInfo.getDefinition()
            .withStrategyOnFull(StrategyOnFull.RejectNewData) // Required. Updating Strategy on full to reject new data.
            // Max Size update should be greater than initial Max Size defined in Create Message Stream request
            .withMaxSize(536870912L) // Update Max Size to 512 MB.
            .withStreamSegmentSize(33554432L) // Update Segment Size to 32 MB.
            .withFlushOnWrite(true) // Update flush on write to true.
            .withPersistence(Persistence.Memory) // Update the persistence to Memory.
            .withTimeToLiveMillis(3600000L)  // Update TTL to 1 hour.
            .withExportDefinition(
                // Optional. Choose where/how the stream is exported to the AWS 클라우드.
                messageStreamInfo.getDefinition().getExportDefinition().
                    // Updating Export definition to add a Kinesis Stream configuration.
                    .withKinesis(new ArrayList<KinesisConfig>() {{
                        add(new KinesisConfig()
                            .withIdentifier(EXPORT_IDENTIFIER)
                            .withKinesisStreamName("test"));
                        }})
            );
} catch (StreamManagerException e) {
    // Properly handle exception.
}
```

Java SDK 참조: [update\$1message\$1stream](https://aws.github.io/aws-greengrass-core-sdk-java/com/amazonaws/greengrass/streammanager/client/StreamManagerClient.html#updateMessageStream-java.lang.String-) \$1 [MessageStreamDefinition](https://aws.github.io/aws-greengrass-core-sdk-java/com/amazonaws/greengrass/streammanager/model/MessageStreamDefinition.html)

------
#### [ Node.js ]

```
const client = new StreamManagerClient();
client.onConnected(async () => {
    try {
        const messageStreamInfo = await c.describeMessageStream(STREAM_NAME);
        await client.updateMessageStream(
            messageStreamInfo.definition
                // Max Size update should be greater than initial Max Size defined in Create Message Stream request
                .withMaxSize(536870912)  // Default is 256 MB. Updating Max Size to 512 MB.
                .withStreamSegmentSize(33554432)  // Default is 16 MB. Updating Segment Size to 32 MB.
                .withTimeToLiveMillis(3600000)  // By default, no TTL is enabled. Update TTL to 1 hour.
                .withStrategyOnFull(StrategyOnFull.RejectNewData)  // Required. Updating Strategy on full to reject new data.
                .withPersistence(Persistence.Memory)  // Default is File. Update the persistence to Memory
                .withFlushOnWrite(true)  // Default is false. Updating to true.
                .withExportDefinition(  
                    // Optional. Choose where/how the stream is exported to the AWS 클라우드.
                    messageStreamInfo.definition.exportDefinition
                        // Updating Export definition to add a Kinesis Stream configuration.
                        .withKinesis([new KinesisConfig().withIdentifier(uuidv4()).withKinesisStreamName(uuidv4())])
                )
        );
    } catch (e) {
        // Properly handle errors.
    }
});
client.onError((err) => {
    // Properly handle connection errors.
    // This is called only when the connection to the StreamManager server fails.
});
```

[Node.js SDK 참조: [updateMessageStream](https://aws.github.io/aws-greengrass-core-sdk-js/aws-greengrass-core-sdk.StreamManager.StreamManagerClient.html#updateMessageStream) \$1 MessageStreamDefinition](https://aws.github.io/aws-greengrass-core-sdk-js/aws-greengrass-core-sdk.StreamManager.MessageStreamDefinition.html)

------

### 스트림 업데이트에 대한 제약조건
<a name="streammanagerclient-update-constraints"></a>

스트림을 업데이트할 때는 다음 제약조건이 적용됩니다. 다음 목록에 명시되어 있지 않는 한 업데이트는 즉시 적용됩니다.
+ 스트림의 지속성을 업데이트할 수 없습니다. 이 동작을 변경하려면 [스트림을 삭제하고](#streammanagerclient-delete-message-stream) 새 지속성 정책을 정의하는 [스트림을 생성합니다.](#streammanagerclient-create-message-stream)
+ 다음과 같은 조건에서만 스트림의 최대 크기를 업데이트할 수 있습니다.
  + 최대 크기는 스트림의 현재 크기 이상이어야 합니다. <a name="messagestreaminfo-describe-stream"></a>이 정보를 찾으려면 [스트림을 설명하고](#streammanagerclient-describe-message-stream) 반환된 `MessageStreamInfo` 객체의 스토리지 상태를 확인합니다.
  + 최대 크기는 스트림의 세그먼트 크기 이상이어야 합니다.
+ 스트림 세그먼트 크기를 스트림의 최대 크기보다 작은 값으로 업데이트할 수 있습니다. 업데이트된 설정은 새 세그먼트에 적용됩니다.
+ Time to Live(TTL) 속성 업데이트는 새 추가 작업에 적용됩니다. 이 값을 줄이면 스트림 관리자가 TTL을 초과하는 기존 세그먼트도 삭제할 수 있습니다.
+ 전체 속성에 대한 전략 업데이트는 새 추가 작업에 적용됩니다. 가장 오래된 데이터를 덮어쓰도록 전략을 설정하는 경우 스트림 관리자가 새 설정에 따라 기존 세그먼트를 덮어쓸 수도 있습니다.
+ flush on write 속성 업데이트는 새 메시지에 적용됩니다.
+ 내보내기 구성 업데이트는 새 내보내기에 적용됩니다. 업데이트 요청에는 지원할 모든 내보내기 구성이 포함되어야 합니다. 그렇지 않으면 스트림 관리자가 해당 파일을 삭제합니다.
  + 내보내기 구성을 업데이트할 때 대상 내보내기 구성의 식별자를 지정합니다.
  + 내보내기 구성을 추가하려면 새 내보내기 구성의 고유 식별자를 지정합니다.
  + 내보내기 구성을 삭제하려면 내보내기 구성을 생략합니다.
+ 스트림에서 내보내기 구성의 시작 시퀀스 번호를 [업데이트](#streammanagerclient-update-message-stream)하려면 최신 시퀀스 번호보다 작은 값을 지정해야 합니다. <a name="messagestreaminfo-describe-stream"></a>이 정보를 찾으려면 [스트림을 설명하고](#streammanagerclient-describe-message-stream) 반환된 `MessageStreamInfo` 객체의 스토리지 상태를 확인합니다.

 

## 메시지 스트림 삭제
<a name="streammanagerclient-delete-message-stream"></a>

스트림을 삭제합니다. 스트림을 삭제하면 스트림에 저장된 모든 데이터가 디스크에서 삭제됩니다.

### 요구 사항
<a name="streammanagerclient-delete-message-stream-reqs"></a>

이 작업에는 다음과 같은 요구 사항이 있습니다.
+ <a name="streammanagerclient-min-ggc-1.10.0"></a>최소 AWS IoT Greengrass 코어 버전: 1.10.0
+ <a name="streammanagerclient-min-sdk-ggc-1.10.0"></a>최소 AWS IoT Greengrass 코어 SDK 버전: Python: 1.5.0  \$1  Java: 1.4.0  \$1  Node.js: 1.6.0

### 예제
<a name="streammanagerclient-delete-message-stream-examples"></a>

다음 코드 조각은 `StreamName`라는 스트림을 삭제합니다.

------
#### [ Python ]

```
client = StreamManagerClient()
 
try:
    client.delete_message_stream(stream_name="StreamName")
except StreamManagerException:
    pass
    # Properly handle errors.
except ConnectionError or asyncio.TimeoutError:
    pass
    # Properly handle errors.
```

Python SDK 참조: [deleteMessageStream](https://aws.github.io/aws-greengrass-core-sdk-python/_apidoc/greengrasssdk.stream_manager.streammanagerclient.html#greengrasssdk.stream_manager.streammanagerclient.StreamManagerClient.delete_message_stream)

------
#### [ Java ]

```
try (final StreamManagerClient client = GreengrassClientBuilder.streamManagerClient().build()) {
    client.deleteMessageStream("StreamName");
} catch (StreamManagerException e) {
    // Properly handle exception.
}
```

Java SDK 참조: [delete\$1message\$1stream](https://aws.github.io/aws-greengrass-core-sdk-java/com/amazonaws/greengrass/streammanager/client/StreamManagerClient.html#deleteMessageStream-java.lang.String-)

------
#### [ Node.js ]

```
const client = new StreamManagerClient();
client.onConnected(async () => {
    try {
        await client.deleteMessageStream("StreamName");
    } catch (e) {
        // Properly handle errors.
    }
});
client.onError((err) => {
    // Properly handle connection errors.
    // This is called only when the connection to the StreamManager server fails.
});
```

Node.js SDK 참조: [deleteMessageStream](https://aws.github.io/aws-greengrass-core-sdk-js/aws-greengrass-core-sdk.StreamManager.StreamManagerClient.html#deleteMessageStream)

------

## 다음 사항도 참조하세요.
<a name="work-with-streams-see-also"></a>
+ [AWS IoT Greengrass 코어에서 데이터 스트림 관리](stream-manager.md)
+ [AWS IoT Greengrass 스트림 관리자 구성](configure-stream-manager.md)
+ [지원되는 AWS 클라우드 대상에 대한 구성 내보내기](stream-export-configurations.md)
+ [로 데이터 스트림 내보내기 AWS 클라우드 (콘솔)](stream-manager-console.md)
+ [로 데이터 스트림 내보내기 AWS 클라우드 (CLI)](stream-manager-cli.md)
+ `StreamManagerClient` AWS IoT Greengrass 코어 SDK 참조의 :
  + [Python](https://aws.github.io/aws-greengrass-core-sdk-python/_apidoc/greengrasssdk.stream_manager.streammanagerclient.html)
  + [Java](https://aws.github.io/aws-greengrass-core-sdk-java/com/amazonaws/greengrass/streammanager/client/StreamManagerClient.html)
  + [Node.js](https://aws.github.io/aws-greengrass-core-sdk-js/aws-greengrass-core-sdk.StreamManager.StreamManagerClient.html)

# 지원되는 AWS 클라우드 대상에 대한 구성 내보내기
<a name="stream-export-configurations"></a>

사용자 정의 Lambda 함수는 AWS IoT Greengrass 코어 SDK`StreamManagerClient`에서를 사용하여 스트림 관리자와 상호 작용합니다. Lambda 함수는 [스트림을 생성하거나](work-with-streams.md#streammanagerclient-create-message-stream) [스트림을 업데이트할](work-with-streams.md#streammanagerclient-create-message-stream) 때, 내보내기 정의를 포함하여 스트림 속성을 나타내는 `MessageStreamDefinition` 객체를 전달합니다. `ExportDefinition` 객체에는 스트림에 대해 정의된 내보내기 구성이 포함됩니다. 스트림 관리자는 이러한 내보내기 구성을 사용하여 스트림을 내보내는 위치와 방법을 결정합니다.

![\[ExportDefinition 속성 유형의 객체 모델 다이어그램.\]](http://docs.aws.amazon.com/ko_kr/greengrass/v1/developerguide/images/stream-manager-exportconfigs.png)


단일 대상 유형에 대한 여러 내보내기 구성을 포함하여 스트림에 0개 이상의 내보내기 구성을 정의할 수 있습니다. 예를 들어 하나의 스트림을 2개의 AWS IoT 분석 채널과 하나의 Kinesis 데이터 스트림으로 내보낼 수 있습니다.

내보내기 시도가 실패한 경우 스트림 관리자는 최대 5분 간격으로 계속해서 데이터를 AWS 클라우드 로 다시 내보내려고 시도합니다. 재시도 횟수는 최대 한도가 없습니다.

**참고**  
<a name="streammanagerclient-http-config"></a>`StreamManagerClient`는 스트림을 HTTP 서버로 내보내는 데 사용할 수 있는 대상을 제공합니다. 이 대상은 테스트 목적으로만 사용됩니다. 이 대상은 안정적이지 않으며 프로덕션 환경에서 사용할 수 없습니다.

**Topics**
+ [AWS IoT 분석 채널](#export-to-iot-analytics)
+ [Amazon Kinesis Data Streams](#export-to-kinesis)
+ [AWS IoT SiteWise 자산 속성](#export-to-iot-sitewise)
+ [Amazon S3 객체](#export-to-s3)

이러한 AWS 클라우드 리소스를 유지 관리할 책임은 사용자에게 있습니다.

## AWS IoT 분석 채널
<a name="export-to-iot-analytics"></a>

스트림 관리자는 로 자동 내보내기를 지원합니다 AWS IoT 분석. <a name="ita-export-destination"></a>AWS IoT 분석 를 사용하면 데이터에 대한 고급 분석을 수행하여 비즈니스 결정을 내리고 기계 학습 모델을 개선할 수 있습니다. 자세한 내용은 *AWS IoT Analytics 사용 설명서*의 [What is AWS IoT Analytics?](https://docs.aws.amazon.com/iotanalytics/latest/userguide/welcome.html)를 참조하세요.

 AWS IoT Greengrass 코어 SDK에서 Lambda 함수는 `IoTAnalyticsConfig`를 사용하여이 대상 유형에 대한 내보내기 구성을 정의합니다. 자세한 내용은 대상 언어에 대한 SDK 참조를 확인하세요.
+ Python SDK의 [IoTAnalyticsConfig](https://aws.github.io/aws-greengrass-core-sdk-python/_apidoc/greengrasssdk.stream_manager.data.html#greengrasssdk.stream_manager.data.IoTAnalyticsConfig)
+ 자바 SDK의 [IoTAnalyticsConfig](https://aws.github.io/aws-greengrass-core-sdk-java/com/amazonaws/greengrass/streammanager/model/export/IoTAnalyticsConfig.html)
+ Node.js SDK의 [IoTAnalyticsConfig](https://aws.github.io/aws-greengrass-core-sdk-js/aws-greengrass-core-sdk.StreamManager.IoTAnalyticsConfig.html)

### 요구 사항
<a name="export-to-iot-analytics-reqs"></a>

이 내보내기 대상은 다음 요구 사항을 충족해야 합니다.
+ 의 대상 채널은 Greengrass 그룹과 동일한 AWS 계정 및 AWS 리전 에 AWS IoT 분석 있어야 합니다.
+ [Greengrass 그룹 역할](group-role.md)은 채널을 타겟팅할 수 있는 `iotanalytics:BatchPutMessage` 권한을 허용해야 합니다. 예제:

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "iotanalytics:BatchPutMessage"
              ],
              "Resource": [
              "arn:aws:iotanalytics:us-east-1:123456789012:channel/channel_1_name",
      "arn:aws:iotanalytics:us-east-1:123456789012:channel/channel_2_name"
              ]
          }
      ]
  }
  ```

------

  <a name="wildcards-grant-granular-conditional-access"></a>리소스에 대한 세부적 또는 조건부 액세스 권한을 부여할 수 있습니다(예: 와일드카드 `*` 이름 지정 스키마를 사용해). 자세한 내용은 *IAM 사용 설명서*의 [IAM 정책 추가 및 제거](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)를 참조하세요.

### 로 내보내기 AWS IoT 분석
<a name="export-streams-to-iot-analytics"></a>

를 내보내는 스트림을 생성하기 위해 AWS IoT 분석 Lambda 함수[는 하나 이상의 객체를 포함하는 내보내기 정의가 있는 스트림을 생성합니다](work-with-streams.md#streammanagerclient-create-message-stream). `IoTAnalyticsConfig` 이 객체는 대상 채널, 배치 크기, 배치 간격, 우선 순위와 같은 내보내기 설정을 정의합니다.

Lambda 함수는 장치로부터 데이터를 수신할 때 대상 스트림에 데이터 묶음이 포함된 [메시지를 추가](work-with-streams.md#streammanagerclient-append-message)합니다.

그런 다음 스트림 관리자는 스트림의 내보내기 구성에 정의된 배치 설정 및 우선순위에 따라 데이터를 내보냅니다.

 

## Amazon Kinesis Data Streams
<a name="export-to-kinesis"></a>

스트림 관리자는 Amazon Kinesis Data Streams로의 자동 내보내기를 지원합니다. <a name="aks-export-destination"></a>Kinesis Data Streams는 일반적으로 대용량 데이터를 종합하여 데이터 웨어하우스나 map-reduce 클러스터에 로드하는 데 사용됩니다. 자세한 내용은 *Amazon Kinesis 개발자 안내서*의 [Amazon Kinesis Data Streams이란 무엇입니까?](https://docs.aws.amazon.com/streams/latest/dev/what-is-this-service.html)를 참조하세요.

 AWS IoT Greengrass 코어 SDK에서 Lambda 함수는 `KinesisConfig`를 사용하여이 대상 유형에 대한 내보내기 구성을 정의합니다. 자세한 내용은 대상 언어에 대한 SDK 참조를 확인하세요.
+ Python SDK의 [KinesisConfig](https://aws.github.io/aws-greengrass-core-sdk-python/_apidoc/greengrasssdk.stream_manager.data.html#greengrasssdk.stream_manager.data.KinesisConfig)
+ 자바 SDK의 [KinesisConfig](https://aws.github.io/aws-greengrass-core-sdk-java/com/amazonaws/greengrass/streammanager/model/export/KinesisConfig.html)
+ Node.js SDK의 [KinesisConfig](https://aws.github.io/aws-greengrass-core-sdk-js/aws-greengrass-core-sdk.StreamManager.KinesisConfig.html)

### 요구 사항
<a name="export-to-kinesis-reqs"></a>

이 내보내기 대상은 다음 요구 사항을 충족해야 합니다.
+ Kinesis Data Streams의 대상 스트림은 Greengrass 그룹 AWS 계정 과 AWS 리전 동일한 및에 있어야 합니다.
+ [Greengrass 그룹 역할](group-role.md)은 데이터 스트림을 타겟팅할 수 있는 `kinesis:PutRecords` 권한을 허용해야 합니다. 예제:

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "kinesis:PutRecords"
              ],
              "Resource": [
              "arn:aws:kinesis:us-east-1:123456789012:stream/stream_1_name",
      "arn:aws:kinesis:us-east-1:123456789012:stream/stream_2_name"
              ]
          }
      ]
  }
  ```

------

  <a name="wildcards-grant-granular-conditional-access"></a>리소스에 대한 세부적 또는 조건부 액세스 권한을 부여할 수 있습니다(예: 와일드카드 `*` 이름 지정 스키마를 사용해). 자세한 내용은 *IAM 사용 설명서*의 [IAM 정책 추가 및 제거](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)를 참조하세요.

### Kinesis Data Streams로 내보내기
<a name="export-streams-to-kinesis"></a>

Kinesis Data Streams로 내보내는 스트림을 생성하기 위해 Lambda 함수는 하나 이상의 `KinesisConfig` 객체를 포함하는 내보내기 정의를 가진 [스트림을 생성합니다](work-with-streams.md#streammanagerclient-create-message-stream). 이 객체는 대상 데이터 스트림, 배치 크기, 배치 간격, 우선 순위와 같은 내보내기 설정을 정의합니다.

Lambda 함수는 장치로부터 데이터를 수신할 때 대상 스트림에 데이터 묶음이 포함된 [메시지를 추가합니다](work-with-streams.md#streammanagerclient-append-message). 그런 다음 스트림 관리자는 스트림의 내보내기 구성에 정의된 배치 설정 및 우선순위에 따라 데이터를 내보냅니다.

스트림 관리자는 Amazon Kinesis에 업로드된 각 레코드의 파티션 키로 고유한 임의 UUID를 생성합니다.

 

## AWS IoT SiteWise 자산 속성
<a name="export-to-iot-sitewise"></a>

스트림 관리자는 로 자동 내보내기를 지원합니다 AWS IoT SiteWise. <a name="itsw-export-destination"></a>AWS IoT SiteWise 를 사용하면 산업 장비에서 대규모로 데이터를 수집, 구성 및 분석할 수 있습니다. 자세한 내용은 *AWS IoT SiteWise 사용 설명서*의 [What is AWS IoT SiteWise?](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/what-is-sitewise.html)를 참조하세요.

 AWS IoT Greengrass 코어 SDK에서 Lambda 함수는 `IoTSiteWiseConfig`를 사용하여이 대상 유형에 대한 내보내기 구성을 정의합니다. 자세한 내용은 대상 언어에 대한 SDK 참조를 확인하세요.
+ Python SDK에서의 [IoTSiteWiseConfig](https://aws.github.io/aws-greengrass-core-sdk-python/_apidoc/greengrasssdk.stream_manager.data.html#greengrasssdk.stream_manager.data.IoTSiteWiseConfig)
+ Java SDK의 [IoTSiteWiseConfig](https://aws.github.io/aws-greengrass-core-sdk-java/com/amazonaws/greengrass/streammanager/model/export/IoTSiteWiseConfig.html)
+ Node.js SDK의 [IoTSiteWiseConfig](https://aws.github.io/aws-greengrass-core-sdk-js/aws-greengrass-core-sdk.StreamManager.IoTSiteWiseConfig.html)

**참고**  
AWS 는 OPC-UA 소스와 함께 사용할 수 있는 사전 구축된 솔루션[IoT SiteWise 커넥터](iot-sitewise-connector.md)인 도 제공합니다.

### 요구 사항
<a name="export-to-iot-sitewise-reqs"></a>

이 내보내기 대상은 다음 요구 사항을 충족해야 합니다.
+ 의 대상 자산 속성은 Greengrass 그룹과 동일한 AWS 계정 및 AWS 리전 에 있어야 AWS IoT SiteWise 합니다.
**참고**  
가 AWS IoT SiteWise 지원하는 리전 목록은 *AWS 일반* 참조의 [AWS IoT SiteWise 엔드포인트 및 할당량을 참조하세요](https://docs.aws.amazon.com/general/latest/gr/iot-sitewise.html#iot-sitewise_region).
+ [Greengrass 그룹 역할](group-role.md)은 대상 자산 속성에 `iotsitewise:BatchPutAssetPropertyValue` 권한을 허용해야 합니다. 다음 예제의 정책은 `iotsitewise:assetHierarchyPath` 조건 키를 사용하여 대상 루트 자산과 그 하위 자산에 대한 액세스 권한을 부여합니다. 정책에서 `Condition`을 제거하여 모든 AWS IoT SiteWise 자산에 대한 액세스를 허용하거나 개별 자산의 ARN을 지정할 수 있습니다.

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
               "Effect": "Allow",
               "Action": "iotsitewise:BatchPutAssetPropertyValue",
               "Resource": "*",
               "Condition": {
                   "StringLike": {
                       "iotsitewise:assetHierarchyPath": [
                           "/root node asset ID",
                           "/root node asset ID/*"
                       ]
                   }
               }
          }
      ]
  }
  ```

------

  <a name="wildcards-grant-granular-conditional-access"></a>리소스에 대한 세부적 또는 조건부 액세스 권한을 부여할 수 있습니다(예: 와일드카드 `*` 이름 지정 스키마를 사용해). 자세한 내용은 *IAM 사용 설명서*의 [IAM 정책 추가 및 제거](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)를 참조하세요.

  중요한 보안 정보는 *AWS IoT SiteWise 사용 설명서*의 [BatchPutAssetPropertyValue 권한 부여](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/security_iam_service-with-iam.html#security_iam_service-with-iam-id-based-policies-batchputassetpropertyvalue-action)를 참조하세요.

### 로 내보내기 AWS IoT SiteWise
<a name="export-streams-to-sitewise"></a>

를 내보내는 스트림을 생성하기 위해 AWS IoT SiteWise Lambda 함수[는 하나 이상의 객체를 포함하는 내보내기 정의가 있는 스트림을 생성합니다](work-with-streams.md#streammanagerclient-create-message-stream). `IoTSiteWiseConfig` 이 객체는 배치 크기, 배치 간격 및 우선 순위와 같은 내보내기 설정을 정의합니다.

Lambda 함수는 장치로부터 데이터를 수신할 때 대상 스트림에 데이터를 포함하는 메시지를 추가합니다. 메시지는 하나 이상의 자산 속성에 대한 속성 값을 포함하는 JSON 직렬화 `PutAssetPropertyValueEntry` 객체입니다. 자세한 내용은 AWS IoT SiteWise 내보내기 대상에 대한 [메시지 추가](work-with-streams.md#streammanagerclient-append-message-sitewise)를 참조하세요.

**참고**  
<a name="BatchPutAssetPropertyValue-data-reqs"></a>데이터를 전송할 때 AWS IoT SiteWise데이터는 `BatchPutAssetPropertyValue` 작업의 요구 사항을 충족해야 합니다. 자세한 내용은 *AWS IoT SiteWise API 참조*의 [BatchPutAssetPropertyValue](https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_BatchPutAssetPropertyValue.html)를 참조하세요.

그런 다음 스트림 관리자는 스트림의 내보내기 구성에 정의된 배치 설정 및 우선순위에 따라 데이터를 내보냅니다.

 

스트림 관리자 설정 및 Lambda 함수 로직을 조정하여 내보내기 전략을 설계할 수 있습니다. 예제:
+ 거의 실시간으로 내보내려면 배치 크기 및 간격을 낮게 설정하고 스트림이 수신되면 스트림에 데이터를 추가하십시오.
+ 배치 처리를 최적화하고, 대역폭 제약을 완화하거나, 비용을 최소화하기 위해 Lambda 함수는 스트림에 데이터를 추가하기 전에 단일 자산 속성에 대해 수신된 타임스탬프-품질-값(TQV) 데이터 포인트를 풀링할 수 있습니다. 한 가지 전략은 동일한 속성에 대해 둘 이상의 항목을 보내는 대신 최대 10개의 서로 다른 속성-자산 조합 또는 속성 별칭에 대한 항목을 하나의 메시지로 일괄 처리하는 것입니다. 이렇게 하면 스트림 관리자가 [AWS IoT SiteWise 할당량](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/quotas.html) 이내로 유지할 수 있습니다.

 

## Amazon S3 객체
<a name="export-to-s3"></a>

스트림 관리자는 Amazon S3로의 자동 내보내기를 지원합니다. <a name="s3-export-destination"></a>Amazon S3를 사용하여 대량의 데이터를 저장 및 검색할 수 있습니다. 자세한 내용은 *Amazon Simple Storage Service 개발자 안내서*의 [Amazon S3란 무엇인가요?](https://docs.aws.amazon.com/AmazonS3/latest/dev/Welcome.html)를 참조하세요.

 AWS IoT Greengrass 코어 SDK에서 Lambda 함수는 `S3ExportTaskExecutorConfig`를 사용하여이 대상 유형에 대한 내보내기 구성을 정의합니다. 자세한 내용은 대상 언어에 대한 SDK 참조를 확인하세요.
+ Python SDK의 [S3ExportTaskExecutorConfig](https://aws.github.io/aws-greengrass-core-sdk-python/_apidoc/greengrasssdk.stream_manager.data.html#greengrasssdk.stream_manager.data.S3ExportTaskExecutorConfig)
+ Java SDK의 [S3ExportTaskExecutorConfig](https://aws.github.io/aws-greengrass-core-sdk-java/com/amazonaws/greengrass/streammanager/model/export/S3ExportTaskExecutorConfig.html)
+ Node.js SDK의 [S3ExportTaskExecutorConfig](https://aws.github.io/aws-greengrass-core-sdk-js/aws-greengrass-core-sdk.StreamManager.S3ExportTaskExecutorConfig.html)

### 요구 사항
<a name="export-to-s3-reqs"></a>

이 내보내기 대상은 다음 요구 사항을 충족해야 합니다.
+ 대상 Amazon S3 버킷은 Greengrass 그룹 AWS 계정 과 동일한에 있어야 합니다.
+ Greengrass 그룹의 [기본 컨테이너화가](lambda-group-config.md#lambda-containerization-groupsettings) **Greengrass 컨테이너**인 경우, [STREAM\$1MANAGER\$1READ\$1ONLY\$1DIRS](configure-stream-manager.md#stream-manager-read-only-directories) 파라미터를 설정하여 `/tmp` 아래에 있거나 루트 파일 시스템에 있지 않은 입력 파일 디렉터리를 사용해야 합니다.
+ **Greengrass** 컨테이너 모드에서 실행되는 Lambda 함수가 입력 파일 디렉터리에 입력 파일을 쓰는 경우, 디렉터리에 대한 로컬 볼륨 리소스를 생성하고 쓰기 권한을 사용하여 디렉터리를 컨테이너에 마운트해야 합니다. 이렇게 하면 파일이 루트 파일 시스템에 기록되고 컨테이너 외부에서 볼 수 있습니다. 자세한 내용은 [Lambda 함수와 커넥터를 사용하여 로컬 리소스에 액세스](access-local-resources.md) 단원을 참조하십시오.
+ [Greengrass 그룹 역할](group-role.md)은 대상 버킷에 다음 권한을 허용해야 합니다. 예제:

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "s3:PutObject",
                  "s3:AbortMultipartUpload",
                  "s3:ListMultipartUploadParts"
              ],
              "Resource": [
                  "arn:aws:s3:::bucket-1-name/*",
                  "arn:aws:s3:::bucket-2-name/*"
              ]
          }
      ]
  }
  ```

------

  <a name="wildcards-grant-granular-conditional-access"></a>리소스에 대한 세부적 또는 조건부 액세스 권한을 부여할 수 있습니다(예: 와일드카드 `*` 이름 지정 스키마를 사용해). 자세한 내용은 *IAM 사용 설명서*의 [IAM 정책 추가 및 제거](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)를 참조하세요.

### Amazon S3로 내보내기
<a name="export-streams-to-s3"></a>

Amazon S3로 내보내는 스트림을 생성하기 위해, Lambda 함수는 객체를 사용하여 `S3ExportTaskExecutorConfig` 내보내기 정책을 구성합니다. 정책은 멀티파트 업로드 임계값 및 우선 순위와 같은 내보내기 설정을 정의합니다. Amazon S3 내보내기의 경우 스트림 관리자는 코어 장치의 로컬 파일에서 읽은 데이터를 업로드합니다. 업로드를 시작하기 위해 Lambda 함수는 대상 스트림에 내보내기 작업을 추가합니다. 내보내기 작업에는 입력 파일 및 대상 Amazon S3 객체에 대한 정보가 포함됩니다. 스트림 관리자는 스트림에 추가된 순서대로 작업을 실행합니다.

**참고**  
<a name="bucket-not-key-must-exist"></a>대상 버킷은에 이미 있어야 합니다 AWS 계정. 지정된 키의 객체가 존재하지 않는 경우 스트림 관리자가 대신 객체를 생성합니다.

 이러한 대략적 워크플로우는 다음 다이어그램에 나와 있습니다.

![\[Amazon S3 내보내기의 스트림 관리자 워크플로우 다이어그램.\]](http://docs.aws.amazon.com/ko_kr/greengrass/v1/developerguide/images/stream-manager-s3.png)


스트림 관리자는 멀티파트 업로드 임계값 속성, [최소 파트 크기](configure-stream-manager.md#stream-manager-minimum-part-size) 설정 및 입력 파일 크기를 사용하여 데이터 업로드 방법을 결정합니다. 멀티파트 업로드 임계값은 최소 파트 크기보다 크거나 이와 동일해야 합니다. 데이터를 병렬로 업로드하려는 경우 여러 스트림을 생성할 수 있습니다.

대상 Amazon S3 객체를 지정하는 키는 `!{timestamp:value}` 자리표시자에 유효한 [Java DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html) 문자열을 포함할 수 있습니다. 이러한 타임스탬프 자리표시자를 사용하여 입력 파일 데이터가 업로드된 시간을 기준으로 Amazon S3의 데이터를 분할할 수 있습니다. 예를 들어, 다음 키 이름은 `my-key/2020/12/31/data.txt`와 같은 값으로 해석됩니다.

```
my-key/!{timestamp:YYYY}/!{timestamp:MM}/!{timestamp:dd}/data.txt
```

**참고**  
스트림의 내보내기 상태를 모니터링하려면 먼저 상태 스트림을 만든 다음 이를 사용하도록 내보내기 스트림을 구성하세요. 자세한 내용은 [내보내기 작업 모니터링](#monitor-export-status-s3) 단원을 참조하십시오.

#### 입력 데이터 관리
<a name="manage-s3-input-data"></a>

IoT 애플리케이션이 입력 데이터의 라이프사이클을 관리하는 데 사용하는 코드를 작성할 수 있습니다. 다음 예제 워크플로는 Lambda 함수를 사용하여 이 데이터를 관리하는 방법을 보여줍니다.

1. 로컬 프로세스는 장치 또는 주변 기기로부터 데이터를 수신한 다음 코어 장치의 디렉터리에 있는 파일에 데이터를 씁니다. 스트림 관리자용 입력 파일입니다.
**참고**  
입력 파일 디렉터리에 대한 액세스를 구성해야 하는지 확인하려면 [STREAM\$1MANAGER\$1READ\$1ONLY\$1DIRS](configure-stream-manager.md#stream-manager-read-only-directories) 파라미터를 참조하십시오.  
스트림 관리자가 실행하는 프로세스는 그룹에 대한 [기본 액세스 ID](lambda-group-config.md#lambda-access-identity-groupsettings)의 모든 파일 시스템 권한을 상속합니다. 스트림 관리자는 입력 파일에 액세스할 수 있는 권한이 있어야 합니다. `chmod(1)` 명령을 사용해 필요한 경우 파일의 권한을 변경할 수 있습니다.

1. Lambda 함수는 디렉토리를 스캔하고 새 파일이 생성될 때 대상 스트림에 [내보내기 작업을 추가](work-with-streams.md#streammanagerclient-append-message-export-task)합니다. 작업은 입력 파일의 URL, 대상 Amazon S3 버킷 및 키, 선택적 사용자 메타데이터를 지정하는 JSON 직렬화 `S3ExportTaskDefinition` 객체입니다.

1. 스트림 관리자는 입력 파일을 읽고 추가된 작업의 순서대로 Amazon S3로 데이터를 내보냅니다. <a name="bucket-not-key-must-exist"></a>대상 버킷은에 이미 있어야 합니다 AWS 계정. 지정된 키의 객체가 존재하지 않는 경우 스트림 관리자가 대신 객체를 생성합니다.

1. Lambda 함수는 상태 스트림에서 [메시지를 읽어](work-with-streams.md#streammanagerclient-read-messages) 내보내기 상태를 모니터링합니다. 내보내기 작업이 완료된 후 Lambda 함수는 해당 입력 파일을 삭제할 수 있습니다. 자세한 내용은 [내보내기 작업 모니터링](#monitor-export-status-s3) 단원을 참조하십시오.

### 내보내기 작업 모니터링
<a name="monitor-export-status-s3"></a>

IoT 애플리케이션이 Amazon S3 내보내기 상태를 모니터링하는 데 사용하는 코드를 작성할 수 있습니다. Lambda 함수는 상태 스트림을 생성한 다음 상태 스트림에 상태 업데이트를 기록하도록 내보내기 스트림을 구성해야 합니다. 단일 상태 스트림은 Amazon S3로 내보내는 여러 스트림으로부터 상태 업데이트를 받을 수 있습니다.

먼저 상태 스트림으로 사용할 [스트림을 생성합니다](work-with-streams.md#streammanagerclient-create-message-stream). 스트림의 크기 및 보존 정책을 구성하여 상태 메시지의 수명을 제어할 수 있습니다. 예제:
+ 상태 메시지를 저장하지 않으려는 경우 `Persistence`를 `Memory`로 설정합니다.
+ 새 상태 메시지가 손실되지 않도록 `StrategyOnFull`을 `OverwriteOldestData`로 설정합니다.

그런 다음, 상태 스트림을 사용하도록 내보내기 스트림을 생성하거나 업데이트하세요. 특히 스트림의 `S3ExportTaskExecutorConfig` 내보내기 구성의 상태 구성 속성을 설정하십시오. 그러면 스트림 관리자에게 내보내기 작업에 대한 상태 메시지를 상태 스트림에 기록하도록 지시합니다. `StatusConfig` 객체에서 상태 스트림의 이름과 상세 수준을 지정합니다. 지원되는 다음 값의 범위는 최소 세부 정보 표시(`ERROR`)에서 최대 세부 정보 표시(`TRACE`)까지입니다. 기본값은 `INFO`입니다.
+ `ERROR`
+ `WARN`
+ `INFO`
+ `DEBUG`
+ `TRACE`

 

다음 예제 워크플로우는 Lambda 함수가 상태 스트림을 사용하여 내보내기 상태를 모니터링하는 방법을 보여줍니다.

1. 이전 워크플로우에서 설명한 것처럼 Lambda 함수는 내보내기 작업에 대한 상태 메시지를 상태 스트림에 기록하도록 구성된 스트림에 [내보내기 작업을 추가합니다](work-with-streams.md#streammanagerclient-append-message-export-task). 추가 작업은 작업 ID를 나타내는 시퀀스 번호를 반환합니다.

1. Lambda 함수는 상태 스트림에서 메시지를 순차적으로 [읽은](work-with-streams.md#streammanagerclient-read-messages) 다음 스트림 이름과 작업 ID 또는 메시지 컨텍스트의 내보내기 작업 속성을 기반으로 메시지를 필터링합니다. 예를 들어, Lambda 함수는 메시지 컨텍스트에서 `S3ExportTaskDefinition` 객체로 표시되는 내보내기 작업의 입력 파일 URL을 기준으로 필터링할 수 있습니다.

   다음 상태 코드는 내보내기 작업이 완료됨 상태에 도달했음을 나타냅니다.
   + `Success`. 업로드가 성공적으로 완료되었습니다.
   + `Failure`. 스트림 관리자에서 오류가 발생했습니다. 예를 들어, 지정된 버킷이 존재하지 않습니다. 문제를 해결한 후 내보내기 작업을 스트림에 다시 추가할 수 있습니다.
   + `Canceled`. 스트림 또는 내보내기 정의가 삭제되었거나 작업의 TTL(Time-to-Live) 기간이 만료되어 작업이 중단되었습니다.
**참고**  
작업 상태가 `InProgress` 또는 `Warning` 상태를 가질 수도 있습니다. 이벤트가 작업 실행에 영향을 주지 않는 오류를 반환하면 스트림 관리자에서 경고를 발행합니다. 예를 들어 중단된 부분 업로드를 정리하지 못하면 경고가 반환됩니다.

1. 내보내기 작업이 완료된 후 Lambda 함수는 해당 입력 파일을 삭제할 수 있습니다.

다음 예제는 Lambda 함수가 상태 메시지를 읽고 처리하는 방법을 보여줍니다.

------
#### [ Python ]

```
import time
from greengrasssdk.stream_manager import (
    ReadMessagesOptions,
    Status,
    StatusConfig,
    StatusLevel,
    StatusMessage,
    StreamManagerClient,
)
from greengrasssdk.stream_manager.util import Util

client = StreamManagerClient()
 
try:
    # Read the statuses from the export status stream
    is_file_uploaded_to_s3 = False
    while not is_file_uploaded_to_s3:
        try:
            messages_list = client.read_messages(
                "StatusStreamName", ReadMessagesOptions(min_message_count=1, read_timeout_millis=1000)
            )
            for message in messages_list:
                # Deserialize the status message first.
                status_message = Util.deserialize_json_bytes_to_obj(message.payload, StatusMessage)

                # Check the status of the status message. If the status is "Success",
                # the file was successfully uploaded to S3.
                # If the status was either "Failure" or "Cancelled", the server was unable to upload the file to S3.
                # We will print the message for why the upload to S3 failed from the status message.
                # If the status was "InProgress", the status indicates that the server has started uploading
                # the S3 task.
                if status_message.status == Status.Success:
                    logger.info("Successfully uploaded file at path " + file_url + " to S3.")
                    is_file_uploaded_to_s3 = True
                elif status_message.status == Status.Failure or status_message.status == Status.Canceled:
                    logger.info(
                        "Unable to upload file at path " + file_url + " to S3. Message: " + status_message.message
                    )
                    is_file_uploaded_to_s3 = True
            time.sleep(5)
        except StreamManagerException:
            logger.exception("Exception while running")
except StreamManagerException:
    pass
    # Properly handle errors.
except ConnectionError or asyncio.TimeoutError:
    pass
    # Properly handle errors.
```

Python SDK 참조: [read\$1messages](https://aws.github.io/aws-greengrass-core-sdk-python/_apidoc/greengrasssdk.stream_manager.streammanagerclient.html#greengrasssdk.stream_manager.streammanagerclient.StreamManagerClient.read_messages) \$1 [StatusMessage](https://aws.github.io/aws-greengrass-core-sdk-python/_apidoc/greengrasssdk.stream_manager.data.html#greengrasssdk.stream_manager.data.StatusMessage)

------
#### [ Java ]

```
import com.amazonaws.greengrass.streammanager.client.StreamManagerClient;
import com.amazonaws.greengrass.streammanager.client.utils.ValidateAndSerialize;
import com.amazonaws.greengrass.streammanager.model.ReadMessagesOptions;
import com.amazonaws.greengrass.streammanager.model.Status;
import com.amazonaws.greengrass.streammanager.model.StatusConfig;
import com.amazonaws.greengrass.streammanager.model.StatusLevel;
import com.amazonaws.greengrass.streammanager.model.StatusMessage;

try (final StreamManagerClient client = GreengrassClientBuilder.streamManagerClient().build()) {
    try {
        boolean isS3UploadComplete = false;
        while (!isS3UploadComplete) {
            try {
                // Read the statuses from the export status stream
                List<Message> messages = client.readMessages("StatusStreamName",
                    new ReadMessagesOptions().withMinMessageCount(1L).withReadTimeoutMillis(1000L));
                for (Message message : messages) {
                    // Deserialize the status message first.
                    StatusMessage statusMessage = ValidateAndSerialize.deserializeJsonBytesToObj(message.getPayload(), StatusMessage.class);
                    // Check the status of the status message. If the status is "Success", the file was successfully uploaded to S3.
                    // If the status was either "Failure" or "Canceled", the server was unable to upload the file to S3.
                    // We will print the message for why the upload to S3 failed from the status message.
                    // If the status was "InProgress", the status indicates that the server has started uploading the S3 task.
                    if (Status.Success.equals(statusMessage.getStatus())) {
                        System.out.println("Successfully uploaded file at path " + FILE_URL + " to S3.");
                        isS3UploadComplete = true;
                     } else if (Status.Failure.equals(statusMessage.getStatus()) || Status.Canceled.equals(statusMessage.getStatus())) {
                        System.out.println(String.format("Unable to upload file at path %s to S3. Message %s",
                            statusMessage.getStatusContext().getS3ExportTaskDefinition().getInputUrl(),
                            statusMessage.getMessage()));
                        sS3UploadComplete = true;
                    }
                }
            } catch (StreamManagerException ignored) {
            } finally {
                // Sleep for sometime for the S3 upload task to complete before trying to read the status message.
                Thread.sleep(5000);
            }
        } catch (e) {
        // Properly handle errors.
    }
} catch (StreamManagerException e) {
    // Properly handle exception.
}
```

Java SDK 참조: [readMessages](https://aws.github.io/aws-greengrass-core-sdk-java/com/amazonaws/greengrass/streammanager/client/StreamManagerClient.html#readMessages-java.lang.String-com.amazonaws.greengrass.streammanager.model.ReadMessagesOptions-) \$1 [StatusMessage](https://aws.github.io/aws-greengrass-core-sdk-java/com/amazonaws/greengrass/streammanager/model/StatusMessage.html)

------
#### [ Node.js ]

```
const {
    StreamManagerClient, ReadMessagesOptions,
    Status, StatusConfig, StatusLevel, StatusMessage,
    util,
} = require('aws-greengrass-core-sdk').StreamManager;

const client = new StreamManagerClient();
client.onConnected(async () => {
    try {
        let isS3UploadComplete = false;
        while (!isS3UploadComplete) {
            try {
                // Read the statuses from the export status stream
                const messages = await c.readMessages("StatusStreamName",
                    new ReadMessagesOptions()
                        .withMinMessageCount(1)
                        .withReadTimeoutMillis(1000));

                messages.forEach((message) => {
                    // Deserialize the status message first.
                    const statusMessage = util.deserializeJsonBytesToObj(message.payload, StatusMessage);
                    // Check the status of the status message. If the status is 'Success', the file was successfully uploaded to S3.
                    // If the status was either 'Failure' or 'Cancelled', the server was unable to upload the file to S3.
                    // We will print the message for why the upload to S3 failed from the status message.
                    // If the status was "InProgress", the status indicates that the server has started uploading the S3 task.
                    if (statusMessage.status === Status.Success) {
                        console.log(`Successfully uploaded file at path ${FILE_URL} to S3.`);
                        isS3UploadComplete = true;
                    } else if (statusMessage.status === Status.Failure || statusMessage.status === Status.Canceled) {
                        console.log(`Unable to upload file at path ${FILE_URL} to S3. Message: ${statusMessage.message}`);
                        isS3UploadComplete = true;
                    }
                });
                // Sleep for sometime for the S3 upload task to complete before trying to read the status message.
                await new Promise((r) => setTimeout(r, 5000));
            } catch (e) {
                // Ignored
            }
    } catch (e) {
        // Properly handle errors.
    }
});
client.onError((err) => {
    // Properly handle connection errors.
    // This is called only when the connection to the StreamManager server fails.
});
```

Node.js SDK 참조: [readMessages](https://aws.github.io/aws-greengrass-core-sdk-js/aws-greengrass-core-sdk.StreamManager.StreamManagerClient.html#readMessages) \$1 [StatusMessage](https://aws.github.io/aws-greengrass-core-sdk-js/aws-greengrass-core-sdk.StreamManager.StatusMessage.html)

------

# 로 데이터 스트림 내보내기 AWS 클라우드 (콘솔)
<a name="stream-manager-console"></a>

이 자습서에서는 AWS IoT 콘솔을 사용하여 스트림 관리자가 활성화된 AWS IoT Greengrass 그룹을 구성하고 배포하는 방법을 보여줍니다. 이 그룹에는 스트림 관리자의 스트림에 기록하는 사용자 정의 Lambda 함수가 포함되어 있으며, 이 함수는 자동으로 AWS 클라우드클라우드로 내보내집니다.

스트림 관리자를 사용하면 대용량 데이터 스트림을 보다 쉽고 안정적으로 수집, 처리 및 내보낼 수 있습니다. 이 튜토리얼에서는 IoT 데이터를 사용하는 `TransferStream` Lambda 함수를 생성합니다. Lambda 함수는 AWS IoT Greengrass 코어 SDK를 사용하여 스트림 관리자에서 스트림을 생성한 다음 읽고 씁니다. 그러면 스트림 관리자가 Kinesis Data Streams로 스트림을 내보냅니다. 다음 다이어그램은 이 워크플로를 보여 줍니다.

![\[스트림 관리 워크플로우의 다이어그램.\]](http://docs.aws.amazon.com/ko_kr/greengrass/v1/developerguide/images/stream-manager-scenario.png)


이 자습서의 핵심은 사용자 정의 Lambda 함수가 AWS IoT Greengrass 코어 SDK의 `StreamManagerClient` 객체를 사용하여 스트림 관리자와 상호 작용하는 방법을 보여주는 것입니다. 간편성을 위해 이 튜토리얼에서 생성한 Python Lambda 함수는 시뮬레이션된 장치 데이터를 생성합니다.

## 사전 조건
<a name="stream-manager-console-prerequisites"></a>

이 자습서를 완료하려면 다음이 필요합니다.<a name="stream-manager-howto-prereqs"></a>
+ Greengrass 그룹 및 Greengrass 코어(v1.10 이상). Greengrass 그룹 및 코어를 생성하는 방법에 대한 자세한 내용은 [시작하기 AWS IoT Greengrass](gg-gs.md) 섹션을 참조하세요. 시작하기 자습서에는 AWS IoT Greengrass 코어 소프트웨어 설치 단계도 포함되어 있습니다.
**참고**  <a name="stream-manager-not-supported-openwrt"></a>
<a name="stream-manager-not-supported-openwrt-para"></a>스트림 관리자는 OpenWrt 배포에서 지원되지 않습니다.
+ 코어 장치에 설치된 Java 8 런타임(JDK 8).<a name="install-java8-runtime-general"></a>
  + Debian 기반 배포판(Raspbian 포함) 또는 Ubuntu 기반 배포판의 경우 다음 명령을 실행합니다.

    ```
    sudo apt install openjdk-8-jdk
    ```
  + Red Hat 기반 배포판(Amazon Linux 포함) 의 경우 다음 명령을 실행합니다.

    ```
    sudo yum install java-1.8.0-openjdk
    ```

    자세한 내용은 OpenJDK 설명서의 [OpenJDK 패키지 다운로드 및 설치 방법](https://openjdk.java.net/install/)을 참조하십시오.
+ AWS IoT Greengrass Core SDK for Python v1.5.0 이상. AWS IoT Greengrass Core SDK for Python에서 `StreamManagerClient`를 사용하려면 다음을 수행해야 합니다.
  + Python 3.7 이상을 코어 장치에 설치합니다.
  + Lambda 함수 배포 패키지에 SDK와 그 종속성을 포함시킵니다. 지침은 이 튜토리얼에 나와 있습니다.
**작은 정보**  
Java 또는 NodeJS로 `StreamManagerClient`를 사용할 수 있습니다. 예제 코드는 [AWS IoT Greengrass Core SDK for Java](https://github.com/aws/aws-greengrass-core-sdk-java/blob/master/samples/StreamManagerKinesis/src/main/java/com/amazonaws/greengrass/examples/StreamManagerKinesis.java) 및 [AWS IoT Greengrass Core SDK for Node.js](https://github.com/aws/aws-greengrass-core-sdk-js/blob/master/greengrassExamples/StreamManagerKinesis/index.js)를 참조하십시오.
+ Greengrass 그룹 AWS 리전 과 동일한의 Amazon Kinesis Data Streams에서 **MyKinesisStream** 생성된 라는 대상 스트림입니다. 자세한 내용은 *Amazon Kinesis Data Streams 개발자 안내서*에서 [스트림 생성](https://docs.aws.amazon.com/streams/latest/dev/fundamental-stream.html#create-stream)을 참조하십시오.
**참고**  
이 튜토리얼에서는 스트림 관리자가 데이터를 Kinesis Data Streams로 내보내고 이로 인해 AWS 계정에 요금이 청구됩니다. 요금 정보는 [Kinesis Data Streams 요금](https://aws.amazon.com/kinesis/data-streams/pricing/)을 참조하십시오.  
요금이 부과되지 않도록 하기 위해 Kinesis 데이터 스트림을 생성하지 않고 이 자습서를 실행할 수 있습니다. 이 경우 로그를 확인하여 스트림 관리자가 스트림을 Kinesis Data Streams로 내보내려고 시도했는지 확인합니다.
+ 다음 예제에 나오는 것처럼 대상 전송 스트립에 대한 `kinesis:PutRecords` 작업을 허용하는 [Greengrass 그룹 역할](group-role.md)에 추가된 IAM 정책입니다.

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "kinesis:PutRecords"
              ],
              "Resource": [
              "arn:aws:kinesis:us-east-1:123456789012:stream/MyKinesisStream"
              ]
          }
      ]
  }
  ```

------

자습서에는 다음과 같은 상위 수준 단계가 포함됩니다.

1. [Lambda 함수 배포 패키지 생성](#stream-manager-console-create-deployment-package)

1. [Lambda 함수 생성](#stream-manager-console-create-function)

1. [그룹에 함수 추가](#stream-manager-console-create-gg-function)

1. [스트림 관리자 활성화](#stream-manager-console-enable-stream-manager)

1. [로컬 로깅 구성](#stream-manager-console-configure-logging)

1. [그룹 배포](#stream-manager-console-create-deployment)

1. [애플리케이션 테스트](#stream-manager-console-test-application)

이 자습서를 완료하는 데 약 20분 정도 걸립니다.

## 1단계: Lambda 함수 배포 패키지 생성
<a name="stream-manager-console-create-deployment-package"></a>

이 단계에서는 Python 함수 코드와 종속성이 포함된 Lambda 함수 배포 패키지를 생성합니다. 나중에 AWS Lambda에서 Lambda 함수를 생성할 때 이 패키지를 업로드합니다. Lambda 함수는 AWS IoT Greengrass 코어 SDK를 사용하여 로컬 스트림을 생성하고 상호 작용합니다.

**참고**  
 사용자 정의 Lambda 함수는 [AWS IoT Greengrass Core SDK](lambda-functions.md#lambda-sdks-core)를 사용하여 스트림 관리자와 상호 작용해야 합니다. Greengrass 스트림 관리자의 요구 사항에 대한 자세한 내용은 [Greengrass 스트림 관리자 요구 사항](stream-manager.md#stream-manager-requirements)을 참조하십시오.

1.  [AWS IoT Greengrass Core SDK for Python](lambda-functions.md#lambda-sdks-core) v1.5.0 이상을 다운로드하십시오.

1. <a name="unzip-ggc-sdk"></a>다운로드한 패키지의 압축을 풀어 SDK를 가져옵니다. SDK는 `greengrasssdk` 폴더입니다.

1. <a name="install-python-sdk-dependencies-stream-manager"></a>Lambda 함수 배포 패키지에 SDK와 함께 포함시킬 패키지 종속성을 설치합니다.<a name="python-sdk-dependencies-stream-manager"></a>

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

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

      ```
      pip install --target . -r requirements.txt
      ```

1. `transfer_stream.py`이라는 로컬 파일에 다음과 같은 Python 코드 함수를 저장합니다.
**작은 정보**  
 Java 및 NodeJS를 사용하는 예제 코드는 GitHub의 [AWS IoT Greengrass Core SDK for Java](https://github.com/aws/aws-greengrass-core-sdk-java/blob/master/samples/StreamManagerKinesis/src/main/java/com/amazonaws/greengrass/examples/StreamManagerKinesis.java) 및 [AWS IoT Greengrass Core SDK for Node.js](https://github.com/aws/aws-greengrass-core-sdk-js/blob/master/greengrassExamples/StreamManagerKinesis/index.js)를 참조하십시오.

   ```
   import asyncio
   import logging
   import random
   import time
   
   from greengrasssdk.stream_manager import (
       ExportDefinition,
       KinesisConfig,
       MessageStreamDefinition,
       ReadMessagesOptions,
       ResourceNotFoundException,
       StrategyOnFull,
       StreamManagerClient,
   )
   
   
   # This example creates a local stream named "SomeStream".
   # It starts writing data into that stream and then stream manager automatically exports  
   # the data to a customer-created Kinesis data stream named "MyKinesisStream". 
   # This example runs forever until the program is stopped.
   
   # The size of the local stream on disk will not exceed the default (which is 256 MB).
   # Any data appended after the stream reaches the size limit continues to be appended, and
   # stream manager deletes the oldest data until the total stream size is back under 256 MB.
   # The Kinesis data stream in the cloud has no such bound, so all the data from this script is
   # uploaded to Kinesis and you will be charged for that usage.
   
   
   def main(logger):
       try:
           stream_name = "SomeStream"
           kinesis_stream_name = "MyKinesisStream"
   
           # Create a client for the StreamManager
           client = StreamManagerClient()
   
           # Try deleting the stream (if it exists) so that we have a fresh start
           try:
               client.delete_message_stream(stream_name=stream_name)
           except ResourceNotFoundException:
               pass
   
           exports = ExportDefinition(
               kinesis=[KinesisConfig(identifier="KinesisExport" + stream_name, kinesis_stream_name=kinesis_stream_name)]
           )
           client.create_message_stream(
               MessageStreamDefinition(
                   name=stream_name, strategy_on_full=StrategyOnFull.OverwriteOldestData, export_definition=exports
               )
           )
   
           # Append two messages and print their sequence numbers
           logger.info(
               "Successfully appended message to stream with sequence number %d",
               client.append_message(stream_name, "ABCDEFGHIJKLMNO".encode("utf-8")),
           )
           logger.info(
               "Successfully appended message to stream with sequence number %d",
               client.append_message(stream_name, "PQRSTUVWXYZ".encode("utf-8")),
           )
   
           # Try reading the two messages we just appended and print them out
           logger.info(
               "Successfully read 2 messages: %s",
               client.read_messages(stream_name, ReadMessagesOptions(min_message_count=2, read_timeout_millis=1000)),
           )
   
           logger.info("Now going to start writing random integers between 0 and 1000 to the stream")
           # Now start putting in random data between 0 and 1000 to emulate device sensor input
           while True:
               logger.debug("Appending new random integer to stream")
               client.append_message(stream_name, random.randint(0, 1000).to_bytes(length=4, signed=True, byteorder="big"))
               time.sleep(1)
   
       except asyncio.TimeoutError:
           logger.exception("Timed out while executing")
       except Exception:
           logger.exception("Exception while running")
   
   
   def function_handler(event, context):
       return
   
   
   logging.basicConfig(level=logging.INFO)
   # Start up this sample code
   main(logger=logging.getLogger())
   ```

1. 다음 항목을 `transfer_stream_python.zip`라는 파일로 압축합니다. 이것이 Lambda 함수 배포 패키지입니다.
   + **transfer\$1stream.py**. 앱 로직.
   + **greengrasssdk**. MQTT 메시지를 게시하는 Python Greengrass Lambda 함수에 대한 필수 라이브러리입니다.

     [스트림 관리자 작업은](work-with-streams.md) Python용 AWS IoT Greengrass 코어 SDK 버전 1.5.0 이상에서 사용할 수 있습니다.
   +  AWS IoT Greengrass Core SDK for Python에 대해 설치한 종속성(예: `cbor2` 디렉터리).

   `zip` 파일을 생성할 때 이러한 항목만 포함시키고 포함 폴더는 포함시키지 않습니다.

## 2단계: Lambda 함수 생성
<a name="stream-manager-console-create-function"></a>

이 단계에서는 AWS Lambda 콘솔을 사용하여 Lambda 함수를 생성하고 배포 패키지를 사용하도록 구성합니다. 그런 다음 함수 버전을 게시하고 별칭을 생성합니다.

1. 먼저, Lambda 함수를 생성합니다.

   1. <a name="lambda-console-open"></a>에서 AWS Management Console**서비스를** 선택하고 AWS Lambda 콘솔을 엽니다.

   1. <a name="lambda-console-create-function"></a>**함수 생성**을 선택한 다음 **새로 작성**을 선택합니다.

   1. **기본 정보** 섹션에서 다음 값을 사용합니다.
      + [**함수 이름**]에 **TransferStream**을 입력합니다.
      + **실행 시간**에서 **Python 3.7**을 선택합니다.
      + **권한**의 경우, 기본 설정을 유지합니다. 이를 통해 기본 Lambda 권한을 부여하는 실행 역할을 생성합니다. 이 역할은에서 사용되지 않습니다 AWS IoT Greengrass.

   1. <a name="lambda-console-save-function"></a>페이지 하단에서 **함수 생성**을 선택합니다.

1. 이제 핸들러를 등록하고 Lambda 함수 배포 패키지를 업로드합니다.

   1. <a name="lambda-console-upload"></a>**코드** 탭의 **코드 소스**에서 **다음에서 업로드**를 선택합니다. 드롭다운에서 **.zip 파일**을 선택합니다.  
![\[.zip 파일이 강조 표시된 드롭다운의 업로드.\]](http://docs.aws.amazon.com/ko_kr/greengrass/v1/developerguide/images/lra-console/upload-deployment-package.png)

   1. **업로드**를 선택한 다음 `transfer_stream_python.zip` 배포 패키지를 선택합니다. 그런 다음 **저장**을 선택합니다.

   1. <a name="lambda-console-runtime-settings-para"></a>함수의 **코드** 탭에 있는 **런타임 설정**에서 **편집**을 선택하고 다음 값을 입력합니다.
      + **실행 시간**에서 **Python 3.7**을 선택합니다.
      + **핸들러**에 **transfer\$1stream.function\$1handler**를 입력합니다.

   1. <a name="lambda-console-save-config"></a>**저장**을 선택합니다.
**참고**  
 AWS Lambda 콘솔의 **테스트** 버튼은이 함수에서 작동하지 않습니다. AWS IoT Greengrass 코어 SDK에는 AWS Lambda 콘솔에서 Greengrass Lambda 함수를 독립적으로 실행하는 데 필요한 모듈이 포함되어 있지 않습니다. 이러한 모듈(예: `greengrass_common`)은 Greengrass 코어에 배포된 후 함수에 제공됩니다.

1. 이제 Lambda 함수의 첫 번째 버전을 게시하고 [버전의 별칭](https://docs.aws.amazon.com/lambda/latest/dg/versioning-aliases.html)을 생성합니다.
**참고**  
Greengrass 그룹은 별칭(권장) 또는 버전을 기준으로 Lambda 함수를 참조할 수 있습니다. 별칭을 사용하면 함수 코드를 업데이트할 때 구독 테이블이나 그룹 정의를 변경할 필요가 없으므로 코드 업데이트를 더 쉽게 관리할 수 있습니다. 그 대신 새 함수 버전에 대한 별칭을 가리킵니다.

   1. <a name="shared-publish-function-version"></a>[**Actions**] 메뉴에서 [**Publish new revision**]을 선택합니다.

   1. <a name="shared-publish-function-version-description"></a>**버전 설명**에 **First version**을 입력한 후 **게시**를 선택합니다.

   1. **TransferStream: 1** 구성 페이지의 **작업** 메뉴에서 **별칭 생성**을 선택합니다.

   1. [**Create a new alias**] 페이지에서 다음 값을 사용합니다.
      + **이름**에 **GG\$1TransferStream**을 입력합니다.
      + **버전**에서 **1**을 선택합니다.
**참고**  
AWS IoT Greengrass 는 **\$1LATEST** 버전에 대해 Lambda 별칭을 지원하지 않습니다.

   1. **생성(Create)**을 선택합니다.

이제 Greengrass 그룹에 Lambda 함수를 추가할 준비가 되었습니다.

## 3단계: Greengrass 그룹에 Lambda 함수 추가
<a name="stream-manager-console-create-gg-function"></a>

이 단계에서 그룹에 Lambda 함수를 추가한 다음 수명 주기와 환경 변수를 구성합니다. 자세한 내용은 [그룹별 구성을 사용한 Lambda 함수 실행 제어](lambda-group-config.md) 단원을 참조하십시오.

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

1. <a name="group-choose-target-group"></a>대상 그룹을 선택합니다.

1. <a name="choose-add-lambda"></a>그룹 구성 페이지에서 **Lambda 함수** 탭을 선택합니다.

1. **내 Lambda 함수**에서 **추가**를 선택합니다.

1. **Lambda 함수 추가** 페이지에서 Lambda 함수에 대한 **Lambda 함수**를 선택합니다.

1. **Lambda 버전**의 경우 **Alias:GG\$1TransferStream**을 선택합니다.

   이제 Greengrass 그룹에서 Lambda 함수의 동작을 결정하는 속성을 구성합니다.

1. **Lambda 함수 구성** 섹션에서 다음과 같이 변경합니다.
   + **메모리 제한**을 32MB로 설정합니다.
   + **고정된** 경우 **True**를 선택합니다.
**참고**  
<a name="long-lived-lambda"></a>*수명이 긴*(또는 *고정된*) Lambda 함수는가 시작된 후 자동으로 AWS IoT Greengrass 시작되고 자체 컨테이너에서 계속 실행됩니다. 이는 간접 호출되면 시작되고 실행할 작업이 남아 있지 않으면 중지되는 *온디맨드* Lambda 함수와 상반됩니다. 자세한 내용은 [Greengrass Lambda 함수의 라이프사이클 구성](lambda-functions.md#lambda-lifecycle) 단원을 참조하십시오.

1. **Lambda 함수 추가**를 선택합니다.

## 4단계: 스트림 관리자 활성화
<a name="stream-manager-console-enable-stream-manager"></a>

이 단계에서는 스트림 관리자가 활성화되어 있는지 확인합니다.

1. 그룹 구성 페이지에서 **Lambda 함수** 탭을 선택합니다.

1. **시스템 Lambda 함수**에서 **스트림 관리자**를 선택하고 상태를 확인합니다. 비활성화된 경우 **편집**을 선택합니다. 그런 다음 **활성화** 및 **저장**을 선택합니다. 이 튜토리얼의 기본 파라미터 설정을 사용할 수 있습니다. 자세한 내용은 [AWS IoT Greengrass 스트림 관리자 구성](configure-stream-manager.md) 단원을 참조하십시오.

**참고**  <a name="ggstreammanager-function-config-console"></a>
콘솔을 사용하여 스트림 관리자를 활성화하고 그룹을 배포하는 경우 스트림 관리자의 메모리 크기가 기본 4GB로 설정됩니다. 메모리 크기를 최소 128,000KB로 설정하는 것이 좋습니다.

## 5단계: 로컬 로깅 구성
<a name="stream-manager-console-configure-logging"></a>

이 단계에서는 코어 디바이스의 파일 시스템에 로그를 기록하도록 그룹의 AWS IoT Greengrass 시스템 구성 요소, 사용자 정의 Lambda 함수 및 커넥터를 구성합니다. 로그를 사용하여 발생할 수 있는 문제를 해결할 수 있습니다. 자세한 내용은 [AWS IoT Greengrass 로그를 사용한 모니터링](greengrass-logs-overview.md) 단원을 참조하십시오.

1. <a name="shared-group-settings-local-logs-configuration"></a>**로컬 로그 구성**에서 로컬 로깅이 구성되어 있는지 확인합니다.

1. <a name="shared-group-settings-local-logs-edit"></a>Greengrass 시스템 구성 요소 또는 사용자 정의 Lambda 함수에 대해 로그가 구성되지 않은 경우에는 **편집**을 선택합니다.

1. <a name="shared-group-settings-local-logs-event-source"></a>**사용자 Lambda 함수 로그 수준** 및 **Greengrass 시스템 로그 수준**을 선택합니다.

1. <a name="shared-group-settings-local-logs-save"></a>로깅 수준 및 디스크 공간 제한을 기본값으로 유지한 후 **저장**을 선택합니다.

## 6단계: Greengrass 그룹 배포
<a name="stream-manager-console-create-deployment"></a>

코어 장치에 그룹을 배포합니다.

1. <a name="shared-deploy-group-checkggc"></a> AWS IoT Greengrass 코어가 실행 중인지 확인합니다. 필요한 경우 Raspberry Pi 터미널에서 다음 명령을 실행합니다.

   1. 대몬(daemon)이 실행 중인지 확인하려면:

      ```
      ps aux | grep -E 'greengrass.*daemon'
      ```

      출력에 `root`에 대한 `/greengrass/ggc/packages/ggc-version/bin/daemon` 입력이 포함되어 있는 경우에는 대몬(daemon)이 실행 중인 것입니다.
**참고**  
경로의 버전은 AWS IoT Greengrass 코어 디바이스에 설치된 코어 소프트웨어 버전에 따라 다릅니다.

   1. 대몬(daemon)을 시작하려면:

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

1. <a name="shared-deploy-group-deploy"></a>그룹 구성 페이지에서 **배포**를 선택합니다.

1. <a name="shared-deploy-group-ipconfig"></a>

   1. **Lambda 함수** 탭의 **시스템 Lambda 함수** 섹션에서 **IP 감지기**를 선택하고 **편집**을 선택합니다.

   1. **IP 감지기 설정 편집** 대화 상자에서 **MQTT 브로커 엔드포인트 자동 탐지 및 재정의**를 선택합니다.

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

      이렇게 하면 장치가 IP 주소, DNS, 포트 번호 등 코어의 연결 정보를 자동으로 획득할 수 있습니다. 자동 감지가 권장되지만 수동으로 지정된 엔드포인트 AWS IoT Greengrass 도 지원합니다. 그룹이 처음 배포될 때만 검색 방법 메시지가 표시됩니다.
**참고**  
메시지가 표시되면 [Greengrass 서비스 역할을](service-role.md) 생성하고 이를 현재의와 연결할 AWS 계정 수 있는 권한을 부여합니다 AWS 리전. 이 역할을 통해 AWS IoT Greengrass 는 AWS 서비스의 리소스에 액세스할 수 있습니다.

      **배포** 페이지에 배포 타임스탬프, 버전 ID, 상태가 표시됩니다. 완료되면 배포에 대해 **성공적으로 완료했습니다** 상태가 표시되어야 합니다.

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

## 7단계: 애플리케이션 테스트
<a name="stream-manager-console-test-application"></a>

이 `TransferStream` Lambda 함수는 시뮬레이션된 장치 데이터를 생성합니다. 스트림 관리자가 대상 Kinesis 데이터 스트림으로 내보내는 스트림에 데이터를 기록합니다.

1. <a name="stream-manager-howto-test-open-kinesis-console"></a>Amazon Kinesis 콘솔의 **Kinesis Data Streams**에서 **MyKinesisStream**을 선택합니다.
**참고**  
대상 Kinesis 데이터 스트림 없이 튜토리얼을 실행한 경우 스트림 관리자(`GGStreamManager`)의 [로그 파일을 확인하십시오](stream-manager-cli.md#stream-manager-cli-logs). 오류 메시지에 `export stream MyKinesisStream doesn't exist`이 포함되어 있으면 테스트가 성공적입니다. 이 오류는 서비스가 스트림으로의 내보내기를 시도했지만 스트림이 존재하지 않는다는 것을 의미합니다.

1. <a name="stream-manager-howto-view-put-records"></a>**MyKinesisStream** 페이지에서 **모니터링**을 선택합니다. 테스트가 성공적이면 **Put Records(레코드 넣기)** 차트에 데이터가 표시되어야 합니다. 연결에 따라 데이터가 표시되기까지 1분 정도 걸릴 수 있습니다.
**중요**  
테스트를 마쳤을 때 추가 요금이 발생하지 않도록 Kinesis 데이터 스트림을 삭제합니다.  
또는 다음 명령을 실행해 Greengrass 대몬(daemon)을 중단합니다. 이렇게 하면 테스트를 계속할 준비가 될 때까지 코어가 메시지를 보내지 못하게 됩니다.  

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

1. 코어에서 **TransferStream** Lambda 함수를 제거합니다.

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

   1. **Greengrass 그룹**에서 사용자 그룹을 선택합니다.

   1. **Lambdas** 페이지에서 **TransferStream** 함수에 줄임표(**...**)를 선택한 다음 **함수 제거**를 선택합니다.

   1. **작업**에서 **배포**를 선택합니다.

로깅 정보를 보거나 스트림 문제를 해결하려면 로그에서 `TransferStream` 및 `GGStreamManager` 함수를 확인합니다. 파일 시스템에서 AWS IoT Greengrass 로그를 읽을 수 있는 `root` 권한이 있어야 합니다.
+ `TransferStream`은 `greengrass-root/ggc/var/log/user/region/account-id/TransferStream.log`에 로그 항목을 기록합니다.
+ `GGStreamManager`은 `greengrass-root/ggc/var/log/system/GGStreamManager.log`에 로그 항목을 기록합니다.

추가 문제 해결 정보가 필요한 경우 **사용자 Lambda로그**의 [로깅 수준을 **디버그 로그**로 설정한](#stream-manager-console-configure-logging) 다음 그룹을 다시 배포할 수 있습니다.

## 다음 사항도 참조하세요.
<a name="stream-manager-console-see-also"></a>
+ [AWS IoT Greengrass 코어에서 데이터 스트림 관리](stream-manager.md)
+ [AWS IoT Greengrass 스트림 관리자 구성](configure-stream-manager.md)
+ [StreamManagerClient를 사용하여 스트림 작업](work-with-streams.md)
+ [지원되는 AWS 클라우드 대상에 대한 구성 내보내기](stream-export-configurations.md)
+ [로 데이터 스트림 내보내기 AWS 클라우드 (CLI)](stream-manager-cli.md)

# 로 데이터 스트림 내보내기 AWS 클라우드 (CLI)
<a name="stream-manager-cli"></a>

이 자습서에서는를 사용하여 스트림 관리자가 활성화된 AWS IoT Greengrass 그룹을 AWS CLI 구성하고 배포하는 방법을 보여줍니다. 이 그룹에는 스트림 관리자의 스트림에 기록하는 사용자 정의 Lambda 함수가 포함되어 있으며, 이 함수는 자동으로 AWS 클라우드클라우드로 내보내집니다.

스트림 관리자를 사용하면 대용량 데이터 스트림을 보다 쉽고 안정적으로 수집, 처리 및 내보낼 수 있습니다. 이 튜토리얼에서는 IoT 데이터를 사용하는 `TransferStream` Lambda 함수를 생성합니다. Lambda 함수는 AWS IoT Greengrass 코어 SDK를 사용하여 스트림 관리자에서 스트림을 생성한 다음 해당 스트림을 읽고 씁니다. 그러면 스트림 관리자가 Kinesis Data Streams로 스트림을 내보냅니다. 다음 다이어그램은 이 워크플로를 보여 줍니다.

![\[스트림 관리 워크플로우의 다이어그램.\]](http://docs.aws.amazon.com/ko_kr/greengrass/v1/developerguide/images/stream-manager-scenario.png)


이 자습서의 핵심은 사용자 정의 Lambda 함수가 AWS IoT Greengrass 코어 SDK의 `StreamManagerClient` 객체를 사용하여 스트림 관리자와 상호 작용하는 방법을 보여주는 것입니다. 간편성을 위해 이 튜토리얼에서 생성한 Python Lambda 함수는 시뮬레이션된 장치 데이터를 생성합니다.

에 Greengrass 명령이 포함된 AWS IoT Greengrass API를 사용하여 그룹을 AWS CLI생성하면 스트림 관리자가 기본적으로 비활성화됩니다. 코어에서 스트림 관리자를 활성화하려면 시스템 `GGStreamManager` Lambda 함수를 포함하는 [함수 정의 버전과 새 함수 정의 버전을 참조하는 그룹 버전을 생성합니다](#stream-manager-cli-create-function-definition). 그런 다음 그룹을 배포합니다.

## 사전 조건
<a name="stream-manager-cli-prerequisites"></a>

이 자습서를 완료하려면 다음이 필요합니다.<a name="stream-manager-howto-prereqs"></a>
+ Greengrass 그룹 및 Greengrass 코어(v1.10 이상). Greengrass 그룹 및 코어를 생성하는 방법에 대한 자세한 내용은 [시작하기 AWS IoT Greengrass](gg-gs.md) 섹션을 참조하세요. 시작하기 자습서에는 AWS IoT Greengrass 코어 소프트웨어 설치 단계도 포함되어 있습니다.
**참고**  <a name="stream-manager-not-supported-openwrt"></a>
<a name="stream-manager-not-supported-openwrt-para"></a>스트림 관리자는 OpenWrt 배포에서 지원되지 않습니다.
+ 코어 장치에 설치된 Java 8 런타임(JDK 8).<a name="install-java8-runtime-general"></a>
  + Debian 기반 배포판(Raspbian 포함) 또는 Ubuntu 기반 배포판의 경우 다음 명령을 실행합니다.

    ```
    sudo apt install openjdk-8-jdk
    ```
  + Red Hat 기반 배포판(Amazon Linux 포함) 의 경우 다음 명령을 실행합니다.

    ```
    sudo yum install java-1.8.0-openjdk
    ```

    자세한 내용은 OpenJDK 설명서의 [OpenJDK 패키지 다운로드 및 설치 방법](https://openjdk.java.net/install/)을 참조하십시오.
+ AWS IoT Greengrass Core SDK for Python v1.5.0 이상. AWS IoT Greengrass Core SDK for Python에서 `StreamManagerClient`를 사용하려면 다음을 수행해야 합니다.
  + Python 3.7 이상을 코어 장치에 설치합니다.
  + Lambda 함수 배포 패키지에 SDK와 그 종속성을 포함시킵니다. 지침은 이 튜토리얼에 나와 있습니다.
**작은 정보**  
Java 또는 NodeJS로 `StreamManagerClient`를 사용할 수 있습니다. 예제 코드는 [AWS IoT Greengrass Core SDK for Java](https://github.com/aws/aws-greengrass-core-sdk-java/blob/master/samples/StreamManagerKinesis/src/main/java/com/amazonaws/greengrass/examples/StreamManagerKinesis.java) 및 [AWS IoT Greengrass Core SDK for Node.js](https://github.com/aws/aws-greengrass-core-sdk-js/blob/master/greengrassExamples/StreamManagerKinesis/index.js)를 참조하십시오.
+ Greengrass 그룹 AWS 리전 과 동일한의 Amazon Kinesis Data Streams에서 **MyKinesisStream** 생성된 이라는 대상 스트림입니다. 자세한 내용은 *Amazon Kinesis Data Streams 개발자 안내서*에서 [스트림 생성](https://docs.aws.amazon.com/streams/latest/dev/fundamental-stream.html#create-stream)을 참조하십시오.
**참고**  
이 튜토리얼에서는 스트림 관리자가 데이터를 Kinesis Data Streams로 내보내고 이로 인해 AWS 계정에 요금이 청구됩니다. 요금 정보는 [Kinesis Data Streams 요금](https://aws.amazon.com/kinesis/data-streams/pricing/)을 참조하십시오.  
요금이 부과되지 않도록 하기 위해 Kinesis 데이터 스트림을 생성하지 않고 이 자습서를 실행할 수 있습니다. 이 경우 로그를 확인하여 스트림 관리자가 스트림을 Kinesis Data Streams로 내보내려고 시도했는지 확인합니다.
+ 다음 예제에 나오는 것처럼 대상 전송 스트립에 대한 `kinesis:PutRecords` 작업을 허용하는 [Greengrass 그룹 역할](group-role.md)에 추가된 IAM 정책입니다.

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "kinesis:PutRecords"
              ],
              "Resource": [
              "arn:aws:kinesis:us-east-1:123456789012:stream/MyKinesisStream"
              ]
          }
      ]
  }
  ```

------<a name="aws-cli-howto-prereqs"></a>
+ 컴퓨터에 AWS CLI 설치 및 구성된 . 자세한 내용은 *AWS Command Line Interface 사용 설명서*의 [AWS Command Line Interface설치](https://docs.aws.amazon.com/cli/latest/userguide/installing.html) 및 [AWS CLI구성](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)을 참조하세요.

   

  이 튜토리얼의 예제 명령은 Linux 및 기타 Linux 기반 시스템을 위해 작성된 것입니다. Windows를 사용하는 경우 구문 차이[에 대한 자세한 내용은 AWS 명령줄 인터페이스의 파라미터 값 지정](https://docs.aws.amazon.com/cli/latest/userguide/cli-using-param.html)을 참조하세요.

  명령에 JSON 문자열이 포함되어 있는 경우 이 자습서에서는 한 행에 JSON이 포함된 예제를 제공합니다. 일부 시스템에서는 이 형식을 사용해 보다 쉽게 명령을 편집 및 실행할 수 있습니다.

 

자습서에는 다음과 같은 상위 수준 단계가 포함됩니다.

1. [Lambda 함수 배포 패키지 생성](#stream-manager-cli-create-deployment-package)

1. [Lambda 함수 생성](#stream-manager-cli-create-function)

1. [함수 정의 및 버전 생성](#stream-manager-cli-create-function-definition)

1. [로거 정의 및 버전 생성](#stream-manager-cli-create-logger-definition)

1. [코어 정의 버전의 ARN 가져오기](#stream-manager-cli-get-core-definition-version-arn)

1. [그룹 버전 생성](#stream-manager-cli-create-group-version)

1. [ 배포를 생성합니다.](#stream-manager-cli-create-deployment)

1. [애플리케이션 테스트](#stream-manager-cli-test-application)

이 자습서를 완료하는 데 약 30분 정도 걸립니다.

## 1단계: Lambda 함수 배포 패키지 생성
<a name="stream-manager-cli-create-deployment-package"></a>

이 단계에서는 Python 함수 코드와 종속성이 포함된 Lambda 함수 배포 패키지를 생성합니다. 나중에 AWS Lambda에서 Lambda 함수를 생성할 때 이 패키지를 업로드합니다. Lambda 함수는 AWS IoT Greengrass 코어 SDK를 사용하여 로컬 스트림을 생성하고 상호 작용합니다.

**참고**  
 사용자 정의 Lambda 함수는 [AWS IoT Greengrass Core SDK](lambda-functions.md#lambda-sdks-core)를 사용하여 스트림 관리자와 상호 작용해야 합니다. Greengrass 스트림 관리자의 요구 사항에 대한 자세한 내용은 [Greengrass 스트림 관리자 요구 사항](stream-manager.md#stream-manager-requirements)을 참조하십시오.

1.  [AWS IoT Greengrass Core SDK for Python](lambda-functions.md#lambda-sdks-core) v1.5.0 이상을 다운로드하십시오.

1. <a name="unzip-ggc-sdk"></a>다운로드한 패키지의 압축을 풀어 SDK를 가져옵니다. SDK는 `greengrasssdk` 폴더입니다.

1. <a name="install-python-sdk-dependencies-stream-manager"></a>Lambda 함수 배포 패키지에 SDK와 함께 포함시킬 패키지 종속성을 설치합니다.<a name="python-sdk-dependencies-stream-manager"></a>

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

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

      ```
      pip install --target . -r requirements.txt
      ```

1. `transfer_stream.py`이라는 로컬 파일에 다음과 같은 Python 코드 함수를 저장합니다.
**작은 정보**  
 Java 및 NodeJS를 사용하는 예제 코드는 GitHub의 [AWS IoT Greengrass Core SDK for Java](https://github.com/aws/aws-greengrass-core-sdk-java/blob/master/samples/StreamManagerKinesis/src/main/java/com/amazonaws/greengrass/examples/StreamManagerKinesis.java) 및 [AWS IoT Greengrass Core SDK for Node.js](https://github.com/aws/aws-greengrass-core-sdk-js/blob/master/greengrassExamples/StreamManagerKinesis/index.js)를 참조하십시오.

   ```
   import asyncio
   import logging
   import random
   import time
   
   from greengrasssdk.stream_manager import (
       ExportDefinition,
       KinesisConfig,
       MessageStreamDefinition,
       ReadMessagesOptions,
       ResourceNotFoundException,
       StrategyOnFull,
       StreamManagerClient,
   )
   
   
   # This example creates a local stream named "SomeStream".
   # It starts writing data into that stream and then stream manager automatically exports  
   # the data to a customer-created Kinesis data stream named "MyKinesisStream". 
   # This example runs forever until the program is stopped.
   
   # The size of the local stream on disk will not exceed the default (which is 256 MB).
   # Any data appended after the stream reaches the size limit continues to be appended, and
   # stream manager deletes the oldest data until the total stream size is back under 256 MB.
   # The Kinesis data stream in the cloud has no such bound, so all the data from this script is
   # uploaded to Kinesis and you will be charged for that usage.
   
   
   def main(logger):
       try:
           stream_name = "SomeStream"
           kinesis_stream_name = "MyKinesisStream"
   
           # Create a client for the StreamManager
           client = StreamManagerClient()
   
           # Try deleting the stream (if it exists) so that we have a fresh start
           try:
               client.delete_message_stream(stream_name=stream_name)
           except ResourceNotFoundException:
               pass
   
           exports = ExportDefinition(
               kinesis=[KinesisConfig(identifier="KinesisExport" + stream_name, kinesis_stream_name=kinesis_stream_name)]
           )
           client.create_message_stream(
               MessageStreamDefinition(
                   name=stream_name, strategy_on_full=StrategyOnFull.OverwriteOldestData, export_definition=exports
               )
           )
   
           # Append two messages and print their sequence numbers
           logger.info(
               "Successfully appended message to stream with sequence number %d",
               client.append_message(stream_name, "ABCDEFGHIJKLMNO".encode("utf-8")),
           )
           logger.info(
               "Successfully appended message to stream with sequence number %d",
               client.append_message(stream_name, "PQRSTUVWXYZ".encode("utf-8")),
           )
   
           # Try reading the two messages we just appended and print them out
           logger.info(
               "Successfully read 2 messages: %s",
               client.read_messages(stream_name, ReadMessagesOptions(min_message_count=2, read_timeout_millis=1000)),
           )
   
           logger.info("Now going to start writing random integers between 0 and 1000 to the stream")
           # Now start putting in random data between 0 and 1000 to emulate device sensor input
           while True:
               logger.debug("Appending new random integer to stream")
               client.append_message(stream_name, random.randint(0, 1000).to_bytes(length=4, signed=True, byteorder="big"))
               time.sleep(1)
   
       except asyncio.TimeoutError:
           logger.exception("Timed out while executing")
       except Exception:
           logger.exception("Exception while running")
   
   
   def function_handler(event, context):
       return
   
   
   logging.basicConfig(level=logging.INFO)
   # Start up this sample code
   main(logger=logging.getLogger())
   ```

1. 다음 항목을 `transfer_stream_python.zip`라는 파일로 압축합니다. 이것이 Lambda 함수 배포 패키지입니다.
   + **transfer\$1stream.py**. 앱 로직.
   + **greengrasssdk**. MQTT 메시지를 게시하는 Python Greengrass Lambda 함수에 대한 필수 라이브러리입니다.

     [스트림 관리자 작업은](work-with-streams.md) Python용 AWS IoT Greengrass 코어 SDK 버전 1.5.0 이상에서 사용할 수 있습니다.
   +  AWS IoT Greengrass Core SDK for Python에 대해 설치한 종속성(예: `cbor2` 디렉터리).

   `zip` 파일을 생성할 때 이러한 항목만 포함시키고 포함 폴더는 포함시키지 않습니다.

## 2단계: Lambda 함수 생성
<a name="stream-manager-cli-create-function"></a>

1. <a name="cli-create-empty-lambda-role"></a>함수 생성 시 역할 ARN에서 전달할 수 있도록 IAM 역할을 생성합니다.

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

   ```
   aws iam create-role --role-name Lambda_empty --assume-role-policy '{
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "Service": "lambda.amazonaws.com"
               },
              "Action": "sts:AssumeRole"
           }
       ]
   }'
   ```

------
#### [ JSON Single-line ]

   ```
   aws iam create-role --role-name Lambda_empty --assume-role-policy '{"Version": "2012-10-17",		 	 	  "Statement": [{"Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"},"Action": "sts:AssumeRole"}]}'
   ```

------
**참고**  
AWS IoT Greengrass Greengrass 그룹 역할에 Greengrass Lambda 함수에 대한 권한이 지정되어 있으므로는이 역할을 사용하지 않습니다. 이 튜토리얼에서는 빈 역할을 생성합니다.

1. <a name="cli-copy-lambda-role-arn"></a>출력에서 `Arn`을 복사합니다.

1.  AWS Lambda API를 사용하여 `TransferStream` 함수를 생성합니다. 다음 명령은 zip 파일이 현재 디렉터리에 있다고 가정합니다.
   + *role-arn*을 복사한 `Arn`으로 바꿉니다.

   ```
   aws lambda create-function \
   --function-name TransferStream \
   --zip-file fileb://transfer_stream_python.zip \
   --role role-arn \
   --handler transfer_stream.function_handler \
   --runtime python3.7
   ```

1. 이 함수의 버전을 게시합니다.

   ```
   aws lambda publish-version --function-name TransferStream --description 'First version'
   ```

1. 게시된 버전에 대한 별칭을 생성합니다.

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

   ```
   aws lambda create-alias --function-name TransferStream --name GG_TransferStream --function-version 1
   ```
**참고**  
AWS IoT Greengrass 는 **\$1LATEST** 버전에 대한 Lambda 별칭을 지원하지 않습니다.

1. 출력에서 `AliasArn`을 복사합니다. 함수를 구성할 때이 값을 사용합니다 AWS IoT Greengrass.

이제 함수를 구성할 준비가 되었습니다 AWS IoT Greengrass.

## 3단계: 함수 정의 및 버전 생성
<a name="stream-manager-cli-create-function-definition"></a>

이 단계는 시스템 `GGStreamManager` Lambda 함수와 사용자 정의 `TransferStream` Lambda 함수를 참조하는 함수 정의 버전을 생성합니다. AWS IoT Greengrass API를 사용할 때 스트림 관리자를 활성화하려면 함수 정의 버전에 `GGStreamManager` 함수가 포함되어야 합니다.

1. 시스템 및 사용자 정의 Lambda 함수를 포함하는 초기 버전이 포함된 함수 정의를 생성합니다.

   다음 정의 버전은 기본 [파라미터 설정](configure-stream-manager.md)으로 스트림 관리자를 활성화합니다. 사용자 지정 설정을 구성하려면 해당 스트림 관리자가 파라미터에 대한 환경 변수를 정의합니다. 예를 들어 생략된 파라미터에 대한 [스트림 관리자를 활성화, 비활성화 또는 구성하려면(CLI)](configure-stream-manager.md#enable-stream-manager-cli). AWS IoT Greengrass uses 기본 설정을 참조하세요.는 이상이어야 `MemorySize` 합니다`128000`.는 로 설정해야 `Pinned` 합니다`true`.
**참고**  
<a name="long-lived-lambda"></a>*수명이 긴*(또는 *고정된*) Lambda 함수는가 시작된 후 자동으로 AWS IoT Greengrass 시작되고 자체 컨테이너에서 계속 실행됩니다. 이는 간접 호출되면 시작되고 실행할 작업이 남아 있지 않으면 중지되는 *온디맨드* Lambda 함수와 상반됩니다. 자세한 내용은 [Greengrass Lambda 함수의 라이프사이클 구성](lambda-functions.md#lambda-lifecycle) 단원을 참조하십시오.
   + *arbitrary-function-id*를 **stream-manager** 같은 함수에 대한 이름으로 바꿉니다.
   + *alias-arn*을 `TransferStream` Lambda 함수에 대한 별칭을 생성했을 때 복사한 `AliasArn`으로 바꿉니다.

    

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

   ```
   aws greengrass create-function-definition --name MyGreengrassFunctions --initial-version '{
       "Functions": [
           {
               "Id": "arbitrary-function-id",
               "FunctionArn": "arn:aws:lambda:::function:GGStreamManager:1", 
               "FunctionConfiguration": {
                   "MemorySize": 128000,
                   "Pinned": true,
                   "Timeout": 3
               }
           },
           {
               "Id": "TransferStreamFunction",
               "FunctionArn": "alias-arn",
               "FunctionConfiguration": {
                   "Executable": "transfer_stream.function_handler",
                   "MemorySize": 16000,
                   "Pinned": true,
                   "Timeout": 5
               }
           }
       ]
   }'
   ```

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

   ```
   aws greengrass create-function-definition \
   --name MyGreengrassFunctions \
   --initial-version '{"Functions": [{"Id": "arbitrary-function-id","FunctionArn": "arn:aws:lambda:::function:GGStreamManager:1", "FunctionConfiguration": {"Environment": {"Variables":{"STREAM_MANAGER_STORE_ROOT_DIR": "/data","STREAM_MANAGER_SERVER_PORT": "1234","STREAM_MANAGER_EXPORTER_MAX_BANDWIDTH": "20000"}},"MemorySize": 128000,"Pinned": true,"Timeout": 3}},{"Id": "TransferStreamFunction", "FunctionArn": "alias-arn", "FunctionConfiguration": {"Executable": "transfer_stream.function_handler", "MemorySize": 16000,"Pinned": true,"Timeout": 5}}]}'
   ```

------
**참고**  
`Timeout`은 함수 정의 버전에서 필요하지만, `GGStreamManager`에서는 이를 사용하지 않습니다. `Timeout` 및 기타 그룹 수준 설정에 대한 자세한 내용은 [그룹별 구성을 사용한 Lambda 함수 실행 제어](lambda-group-config.md)을 참조하십시오.

1. 출력에서 `LatestVersionArn`을 복사합니다. 이 값을 사용하여 코어에 배포할 그룹 버전에 함수 정의 버전을 추가합니다.

## 4단계: 로거 정의 및 버전 생성
<a name="stream-manager-cli-create-logger-definition"></a>

그룹의 로깅 설정을 구성합니다. 이 자습서에서는 코어 디바이스의 파일 시스템에 로그를 기록하도록 AWS IoT Greengrass 시스템 구성 요소, 사용자 정의 Lambda 함수 및 커넥터를 구성합니다. 로그를 사용하여 발생할 수 있는 문제를 해결할 수 있습니다. 자세한 내용은 [AWS IoT Greengrass 로그를 사용한 모니터링](greengrass-logs-overview.md) 단원을 참조하십시오.

1. <a name="create-logger-definition"></a>최초 버전이 포함된 로거 정의를 생성합니다.

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

   ```
   aws greengrass create-logger-definition --name "LoggingConfigs" --initial-version '{
       "Loggers": [
           {
               "Id": "1",
               "Component": "GreengrassSystem",
               "Level": "INFO",
               "Space": 10240,
               "Type": "FileSystem"
           },
           {
               "Id": "2",
               "Component": "Lambda",
               "Level": "INFO",
               "Space": 10240,
               "Type": "FileSystem"
           }
       ]
   }'
   ```

------
#### [ JSON Single-line ]

   ```
   aws greengrass create-logger-definition \
       --name "LoggingConfigs" \
       --initial-version '{"Loggers":[{"Id":"1","Component":"GreengrassSystem","Level":"INFO","Space":10240,"Type":"FileSystem"},{"Id":"2","Component":"Lambda","Level":"INFO","Space":10240,"Type":"FileSystem"}]}'
   ```

------

1. <a name="copy-logger-definition-version-id"></a>출력에서 로거 정의의 `LatestVersionArn`을 복사합니다. 이 값을 사용하여 코어에 배포할 그룹 버전에 로거 정의 버전을 추가합니다.

## 5단계: 코어 정의 버전의 ARN 가져오기
<a name="stream-manager-cli-get-core-definition-version-arn"></a>

새 그룹 버전에 추가할 코어 정의 버전의 ARN을 가져옵니다. 그룹 버전을 배포하려면 정확히 하나의 코어를 포함하는 코어 정의 버전을 참조해야 합니다.

1. <a name="get-group-id-latestversion"></a>대상 Greengrass 그룹 및 그룹 버전의 ID를 확인합니다. 이 절차에서는 이것이 최신 그룹 및 그룹 버전이라고 가정합니다. 다음 쿼리는 가장 최근에 생성된 그룹을 반환합니다.

   ```
   aws greengrass list-groups --query "reverse(sort_by(Groups, &CreationTimestamp))[0]"
   ```

   또는 이름으로 쿼리할 수도 있습니다. 그룹 이름은 고유한 이름이 아니어도 되므로 여러 그룹을 반환할 수도 있습니다.

   ```
   aws greengrass list-groups --query "Groups[?Name=='MyGroup']"
   ```
**참고**  
<a name="find-group-ids-console"></a> AWS IoT 콘솔에서 이러한 값을 찾을 수도 있습니다. 그룹 ID는 그룹의 **설정** 페이지에 표시됩니다. 그룹 버전 ID는 그룹의 **배포** 탭에 표시됩니다.

1. <a name="copy-target-group-id"></a>출력에서 대상 그룹의 `Id`을 복사합니다. 이 값을 사용하여 그룹을 배포할 때 코어 정의 버전을 가져옵니다.

1. <a name="copy-latest-group-version-id"></a>그룹에 추가된 최신 버전의 ID가 되도록 출력에서 `LatestVersion`을 복사합니다. 이 값을 사용하여 코어 정의 버전을 가져옵니다.

1. 코어 정의 버전의 ARN 가져오기:

   1. 그룹 버전을 가져옵니다.
      + *group-id*를 해당 그룹에서 복사한 `Id`로 바꿉니다.
      + *group-version-id*를 해당 그룹에서 복사한 `LatestVersion`으로 바꿉니다.

      ```
      aws greengrass get-group-version \
      --group-id group-id \
      --group-version-id group-version-id
      ```

   1. 출력에서 `CoreDefinitionVersionArn`을 복사합니다. 이 값을 사용하여 코어에 배포할 그룹 버전에 코어 정의 버전을 추가합니다.

## 6단계: 그룹 버전 생성
<a name="stream-manager-cli-create-group-version"></a>

이제, 배포하고 싶은 모든 항목이 포함된 그룹 버전을 생성할 준비가 되었습니다. 이렇게 하려면 이 각 구성 요소 유형의 대상 버전을 참조하는 그룹 버전을 생성합니다. 이 튜토리얼에서는 코어 정의 버전, 함수 정의 버전 및 로거 정의 버전을 포함합니다.

1. 그룹 버전을 만듭니다.
   + *group-id*를 해당 그룹에서 복사한 `Id`로 바꿉니다.
   + *core-definition-version-arn*을 새 함수 정의 버전에서 복사한 `CoreDefinitionVersionArn`으로 바꿉니다.
   + *function-definition-version-arn*을 새 함수 정의 버전에서 복사한 `LatestVersionArn`로 바꿉니다.
   + *logger-definition-version-arn*을 새 로거 정의 버전에서 복사한 `LatestVersionArn`로 바꿉니다.

   ```
   aws greengrass create-group-version \
   --group-id group-id \
   --core-definition-version-arn core-definition-version-arn \
   --function-definition-version-arn function-definition-version-arn \
   --logger-definition-version-arn logger-definition-version-arn
   ```

1. <a name="copy-group-version-id"></a>출력에서 `Version`을 복사합니다. 새 그룹 버전의 ID가 이 값이 됩니다.

## 7단계: 배포 생성
<a name="stream-manager-cli-create-deployment"></a>

코어 장치에 그룹을 배포합니다.

1. <a name="shared-deploy-group-checkggc"></a> AWS IoT Greengrass 코어가 실행 중인지 확인합니다. 필요한 경우 Raspberry Pi 터미널에서 다음 명령을 실행합니다.

   1. 대몬(daemon)이 실행 중인지 확인하려면:

      ```
      ps aux | grep -E 'greengrass.*daemon'
      ```

      출력에 `root`에 대한 `/greengrass/ggc/packages/ggc-version/bin/daemon` 입력이 포함되어 있는 경우에는 대몬(daemon)이 실행 중인 것입니다.
**참고**  
경로의 버전은 AWS IoT Greengrass 코어 디바이스에 설치된 코어 소프트웨어 버전에 따라 다릅니다.

   1. 대몬(daemon)을 시작하려면:

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

1. <a name="create-deployment"></a>배포를 생성합니다.
   + *group-id*를 해당 그룹에서 복사한 `Id`로 바꿉니다.
   + *group-version-id*를 새 그룹 버전에서 복사한 `Version`으로 바꿉니다.

   ```
   aws greengrass create-deployment \
   --deployment-type NewDeployment \
   --group-id group-id \
   --group-version-id group-version-id
   ```

1. <a name="copy-deployment-id"></a>출력에서 `DeploymentId`을 복사합니다.

1. <a name="get-deployment-status"></a>배포 상태를 가져옵니다.
   + *group-id*를 해당 그룹에서 복사한 `Id`로 바꿉니다.
   + *deployment-id*를 배포를 위해 복사한 `DeploymentId`로 바꿉니다.

   ```
   aws greengrass get-deployment-status \
   --group-id group-id \
   --deployment-id deployment-id
   ```

   상태가 `Success`이면 배포에 성공한 것입니다. 문제 해결에 대한 도움말은 [문제 해결 AWS IoT Greengrass](gg-troubleshooting.md) 섹션을 참조하세요.

## 8단계: 애플리케이션 테스트
<a name="stream-manager-cli-test-application"></a>

이 `TransferStream` Lambda 함수는 시뮬레이션된 장치 데이터를 생성합니다. 스트림 관리자가 대상 Kinesis 데이터 스트림으로 내보내는 스트림에 데이터를 기록합니다.

1. <a name="stream-manager-howto-test-open-kinesis-console"></a>Amazon Kinesis 콘솔의 **Kinesis Data Streams**에서 **MyKinesisStream**을 선택합니다.
**참고**  
대상 Kinesis 데이터 스트림 없이 튜토리얼을 실행한 경우 스트림 관리자(`GGStreamManager`)의 [로그 파일을 확인하십시오](#stream-manager-cli-logs). 오류 메시지에 `export stream MyKinesisStream doesn't exist`이 포함되어 있으면 테스트가 성공적입니다. 이 오류는 서비스가 스트림으로의 내보내기를 시도했지만 스트림이 존재하지 않는다는 것을 의미합니다.

1. <a name="stream-manager-howto-view-put-records"></a>**MyKinesisStream** 페이지에서 **모니터링**을 선택합니다. 테스트가 성공적이면 **Put Records(레코드 넣기)** 차트에 데이터가 표시되어야 합니다. 연결에 따라 데이터가 표시되기까지 1분 정도 걸릴 수 있습니다.
**중요**  
테스트를 마쳤을 때 추가 요금이 발생하지 않도록 Kinesis 데이터 스트림을 삭제합니다.  
또는 다음 명령을 실행해 Greengrass 대몬(daemon)을 중단합니다. 이렇게 하면 테스트를 계속할 준비가 될 때까지 코어가 메시지를 보내지 못하게 됩니다.  

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

1. 코어에서 **TransferStream** Lambda 함수를 제거합니다.

   1. [6단계: 그룹 버전 생성](#stream-manager-cli-create-group-version)에 따라 새 그룹 버전을 생성하되, `create-group-version` 명령에서 `--function-definition-version-arn` 옵션을 제거합니다. 아니면 **TransferStream** Lambda 함수를 포함하지 않는 함수 정의 버전을 생성합니다.
**참고**  
배포된 그룹 버전에서 시스템 `GGStreamManager` Lambda 함수를 생략하면 코어에서 스트림 관리를 비활성화할 수 있습니다.

   1. [7단계: 배포 생성](#stream-manager-cli-create-deployment)에 따라 새 그룹 버전을 배포합니다.

로깅 정보를 보거나 스트림 문제를 해결하려면 로그에서 `TransferStream` 및 `GGStreamManager` 함수를 확인합니다. 파일 시스템에서 AWS IoT Greengrass 로그를 읽을 수 있는 `root` 권한이 있어야 합니다.
+ `TransferStream`은 `greengrass-root/ggc/var/log/user/region/account-id/TransferStream.log`에 로그 항목을 기록합니다.
+ `GGStreamManager`은 `greengrass-root/ggc/var/log/system/GGStreamManager.log`에 로그 항목을 기록합니다.

추가적인 문제 해결 정보가 필요한 경우 `DEBUG`로 `Lambda` 로깅 수준을 설정하고 새 그룹 버전을 생성 및 배포합니다.

## 다음 사항도 참조하세요.
<a name="stream-manager-cli-see-also"></a>
+ [AWS IoT Greengrass 코어에서 데이터 스트림 관리](stream-manager.md)
+ [StreamManagerClient를 사용하여 스트림 작업](work-with-streams.md)
+ [지원되는 AWS 클라우드 대상에 대한 구성 내보내기](stream-export-configurations.md)
+ [AWS IoT Greengrass 스트림 관리자 구성](configure-stream-manager.md)
+ [로 데이터 스트림 내보내기 AWS 클라우드 (콘솔)](stream-manager-console.md)
+ <a name="see-also-iam-cli"></a>명령 참조의 [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/cli/latest/reference/iam) 명령 *AWS CLI *
+ <a name="see-also-lambda-cli"></a>[AWS Lambda 명령](https://docs.aws.amazon.com/cli/latest/reference/lambda) *AWS CLI 참조의 명령*
+ <a name="see-also-gg-cli"></a>[AWS IoT Greengrass 명령](https://docs.aws.amazon.com/cli/latest/reference/greengrass/index.html) *AWS CLI 참조의 명령*