

지원 종료 공지: 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 클라우드 (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 참조의 명령*