

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

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

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

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

이 주제의 코드 조각은 클라이언트가 스트림 작업을 위해 `StreamManagerClient` 메서드를 직접적으로 호출하여 사용하는 방법을 보여줍니다. 메서드 및 해당 인수에 대한 구현 세부 정보를 보려면 각 코드 조각 다음에 나열된 SDK 참조에 대한 링크를 사용합니다.

Lambda 함수에서 스트림 관리자를 사용하는 경우 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>

스트림을 생성하기 위해 사용자 정의 Greengrass 구성 요소가 생성 메서드를 직접적으로 호출하고 `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-greengrass.github.io/aws-greengrass-stream-manager-sdk-java/com/amazonaws/greengrass/streammanager/model/MessageStreamDefinition.html)
+ Node.js SDK의 [MessageStreamDefinition](https://aws-greengrass.github.io/aws-greengrass-stream-manager-sdk-js/aws-greengrass-core-sdk.StreamManager.MessageStreamDefinition.html)
+ Python SDK의 [MessageStreamDefinition](https://aws-greengrass.github.io/aws-greengrass-stream-manager-sdk-python/_apidoc/stream_manager.data.html#stream_manager.data.MessageStreamDefinition)

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

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

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

이 작업에는 다음과 같은 요구 사항이 있습니다.
+ <a name="streammanagerclient-min-sm-sdk"></a>최소 스트림 관리자 SDK 버전: Python: 1.1.0  \$1  Java: 1.1.0  \$1  Node.js: 1.1.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-greengrass.github.io/aws-greengrass-stream-manager-sdk-python/_apidoc/stream_manager.streammanagerclient.html#stream_manager.streammanagerclient.StreamManagerClient.create_message_stream) \$1 [MessageStreamDefinition](https://aws-greengrass.github.io/aws-greengrass-stream-manager-sdk-python/_apidoc/stream_manager.data.html#stream_manager.data.MessageStreamDefinition)

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

```
try (final StreamManagerClient client = StreamManagerClientFactory.standard().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)
                                    .withS3(null)
                    )
 
    );
} catch (StreamManagerException e) {
    // Properly handle exception.
}
```

Java SDK 참조: [createMessageStream](https://aws-greengrass.github.io/aws-greengrass-stream-manager-sdk-java/com/amazonaws/greengrass/streammanager/client/StreamManagerClient.html#createMessageStream-com.amazonaws.greengrass.streammanager.model.MessageStreamDefinition-) \$1 [MessageStreamDefinition](https://aws-greengrass.github.io/aws-greengrass-stream-manager-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)
            .withS3(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-greengrass.github.io/aws-greengrass-stream-manager-sdk-js/aws-greengrass-core-sdk.StreamManager.StreamManagerClient.html#createMessageStream) \$1 [MessageStreamDefinition](https://aws-greengrass.github.io/aws-greengrass-stream-manager-sdk-js/aws-greengrass-core-sdk.StreamManager.MessageStreamDefinition.html)

------

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

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

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

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

이 작업에는 다음과 같은 요구 사항이 있습니다.
+ <a name="streammanagerclient-min-sm-sdk"></a>최소 스트림 관리자 SDK 버전: Python: 1.1.0  \$1  Java: 1.1.0  \$1  Node.js: 1.1.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 대상의 경우 Greengrass 구성 요소는 데이터 블롭을 추가합니다.

이 코드 조각에는 다음과 같은 요구 사항이 있습니다.
+ <a name="streammanagerclient-min-sm-sdk"></a>최소 스트림 관리자 SDK 버전: Python: 1.1.0  \$1  Java: 1.1.0  \$1  Node.js: 1.1.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-greengrass.github.io/aws-greengrass-stream-manager-sdk-python/_apidoc/stream_manager.streammanagerclient.html#stream_manager.streammanagerclient.StreamManagerClient.append_message)

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

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

Java SDK 참조: [appendMessage](https://aws-greengrass.github.io/aws-greengrass-stream-manager-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-greengrass.github.io/aws-greengrass-stream-manager-sdk-js/aws-greengrass-core-sdk.StreamManager.StreamManagerClient.html#appendMessage)

------

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

다음 코드 조각은 `StreamName`이라는 스트림에 메시지를 추가합니다. AWS IoT SiteWise 대상의 경우 Greengrass 구성 요소는 직렬화된 `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-sm-sdk"></a>최소 스트림 관리자 SDK 버전: Python: 1.1.0  \$1  Java: 1.1.0  \$1  Node.js: 1.1.0

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

```
client = StreamManagerClient()
 
try:
    # SiteWise requires unique timestamps in all messages and also needs timestamps not earlier
    # than 10 minutes in the past. 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", 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-greengrass.github.io/aws-greengrass-stream-manager-sdk-python/_apidoc/stream_manager.streammanagerclient.html#stream_manager.streammanagerclient.StreamManagerClient.append_message) \$1 [PutAssetPropertyValueEntry](https://aws-greengrass.github.io/aws-greengrass-stream-manager-sdk-python/_apidoc/stream_manager.data.html#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 and also needs timestamps not earlier
    // than 10 minutes in the past. 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-greengrass.github.io/aws-greengrass-stream-manager-sdk-java/com/amazonaws/greengrass/streammanager/client/StreamManagerClient.html#appendMessage-java.lang.String-byte:A-) \$1 [PutAssetPropertyValueEntry](https://aws-greengrass.github.io/aws-greengrass-stream-manager-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-greengrass.github.io/aws-greengrass-stream-manager-sdk-js/aws-greengrass-core-sdk.StreamManager.StreamManagerClient.html#appendMessage) \$1 [PutAssetPropertyValueEntry](https://aws-greengrass.github.io/aws-greengrass-stream-manager-sdk-js/aws-greengrass-core-sdk.StreamManager.PutAssetPropertyValueEntry.html)

------

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

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

이 코드 조각에는 다음과 같은 요구 사항이 있습니다.
+ <a name="streammanagerclient-min-sm-sdk"></a>최소 스트림 관리자 SDK 버전: Python: 1.1.0  \$1  Java: 1.1.0  \$1  Node.js: 1.1.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", 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-greengrass.github.io/aws-greengrass-stream-manager-sdk-python/_apidoc/stream_manager.streammanagerclient.html#stream_manager.streammanagerclient.StreamManagerClient.append_message) \$1 [S3ExportTaskDefinition](https://aws-greengrass.github.io/aws-greengrass-stream-manager-sdk-python/_apidoc/stream_manager.data.html#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-greengrass.github.io/aws-greengrass-stream-manager-sdk-java/com/amazonaws/greengrass/streammanager/client/StreamManagerClient.html#appendMessage-java.lang.String-byte:A-) \$1 [S3ExportTaskDefinition](https://aws-greengrass.github.io/aws-greengrass-stream-manager-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-greengrass.github.io/aws-greengrass-stream-manager-sdk-js/aws-greengrass-core-sdk.StreamManager.StreamManagerClient.html#appendMessage) \$1 [S3ExportTaskDefinition](https://aws-greengrass.github.io/aws-greengrass-stream-manager-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-sm-sdk"></a>최소 스트림 관리자 SDK 버전: Python: 1.1.0  \$1  Java: 1.1.0  \$1  Node.js: 1.1.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-greengrass.github.io/aws-greengrass-stream-manager-sdk-python/_apidoc/stream_manager.streammanagerclient.html#stream_manager.streammanagerclient.StreamManagerClient.read_messages) \$1 [ReadMessagesOptions](https://aws-greengrass.github.io/aws-greengrass-stream-manager-sdk-python/_apidoc/stream_manager.data.html#stream_manager.data.ReadMessagesOptions)

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

```
try (final StreamManagerClient client = StreamManagerClientFactory.standard().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-greengrass.github.io/aws-greengrass-stream-manager-sdk-java/com/amazonaws/greengrass/streammanager/client/StreamManagerClient.html#readMessages-java.lang.String-com.amazonaws.greengrass.streammanager.model.ReadMessagesOptions-) \$1 [ReadMessagesOptions](https://aws-greengrass.github.io/aws-greengrass-stream-manager-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-greengrass.github.io/aws-greengrass-stream-manager-sdk-js/aws-greengrass-core-sdk.StreamManager.StreamManagerClient.html#readMessages) \$1 [ReadMessagesOptions](https://aws-greengrass.github.io/aws-greengrass-stream-manager-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-sm-sdk"></a>최소 스트림 관리자 SDK 버전: Python: 1.1.0  \$1  Java: 1.1.0  \$1  Node.js: 1.1.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-greengrass.github.io/aws-greengrass-stream-manager-sdk-python/_apidoc/stream_manager.streammanagerclient.html#stream_manager.streammanagerclient.StreamManagerClient.list_streams)

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

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

Java SDK 참조: [listStreams](https://aws-greengrass.github.io/aws-greengrass-stream-manager-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-greengrass.github.io/aws-greengrass-stream-manager-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-sm-sdk"></a>최소 스트림 관리자 SDK 버전: Python: 1.1.0  \$1  Java: 1.1.0  \$1  Node.js: 1.1.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-greengrass.github.io/aws-greengrass-stream-manager-sdk-python/_apidoc/stream_manager.streammanagerclient.html#stream_manager.streammanagerclient.StreamManagerClient.describe_message_stream)

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

```
try (final StreamManagerClient client = StreamManagerClientFactory.standard().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-greengrass.github.io/aws-greengrass-stream-manager-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-greengrass.github.io/aws-greengrass-stream-manager-sdk-js/aws-greengrass-core-sdk.StreamManager.StreamManagerClient.html#describeMessageStream)

------

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

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

Greengrass 구성 요소는 다음과 같은 간략한 프로세스를 따라 스트림을 업데이트합니다.

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

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

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

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

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

이 작업에는 다음과 같은 요구 사항이 있습니다.
+ <a name="streammanagerclient-min-sm-sdk"></a>최소 스트림 관리자 SDK 버전: Python: 1.1.0  \$1  Java: 1.1.0  \$1  Node.js: 1.1.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-greengrass.github.io/aws-greengrass-stream-manager-sdk-python/_apidoc/stream_manager.streammanagerclient.html#stream_manager.streammanagerclient.StreamManagerClient.update_message_stream) \$1 [MessageStreamDefinition](https://aws-greengrass.github.io/aws-greengrass-stream-manager-sdk-python/_apidoc/stream_manager.data.html#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-greengrass.github.io/aws-greengrass-stream-manager-sdk-java/com/amazonaws/greengrass/streammanager/client/StreamManagerClient.html#updateMessageStream-java.lang.String-) \$1 [MessageStreamDefinition](https://aws-greengrass.github.io/aws-greengrass-stream-manager-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-greengrass.github.io/aws-greengrass-stream-manager-sdk-js/aws-greengrass-core-sdk.StreamManager.StreamManagerClient.html#updateMessageStream) \$1 MessageStreamDefinition](https://aws-greengrass.github.io/aws-greengrass-stream-manager-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-sm-sdk"></a>최소 스트림 관리자 SDK 버전: Python: 1.1.0  \$1  Java: 1.1.0  \$1  Node.js: 1.1.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-greengrass.github.io/aws-greengrass-stream-manager-sdk-python/_apidoc/stream_manager.streammanagerclient.html#stream_manager.streammanagerclient.StreamManagerClient.delete_message_stream)

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

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

Java SDK 참조: [delete\$1message\$1stream](https://aws-greengrass.github.io/aws-greengrass-stream-manager-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-greengrass.github.io/aws-greengrass-stream-manager-sdk-js/aws-greengrass-core-sdk.StreamManager.StreamManagerClient.html#deleteMessageStream)

------

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

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

사용자 정의 Greengrass 구성 요소는 스트림 관리자 SDK의 `StreamManagerClient`를 사용하여 스트림 관리자와 상호 작용합니다. 구성 요소는 [스트림을 생성](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/v2/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)를 참조하세요.

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

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

이 내보내기 대상은 다음 요구 사항을 충족해야 합니다.
+ 의 대상 채널은 Greengrass 코어 디바이스 AWS 리전 와 동일한 AWS 계정 및에 AWS IoT 분석 있어야 합니다.
+ [코어 디바이스가 AWS 서비스와 상호 작용할 수 있도록 권한 부여](device-service-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 분석 Greengrass 구성 요소는 하나 이상의 `IoTAnalyticsConfig` 객체를 포함하는 내보내기 정의가 있는 [스트림을 생성합니다](work-with-streams.md#streammanagerclient-create-message-stream). 이 객체는 대상 채널, 배치 크기, 배치 간격, 우선 순위와 같은 내보내기 설정을 정의합니다.

Greengrass 구성 요소는 디바이스로부터 데이터를 수신할 때 대상 스트림에 데이터 블롭을 포함하는 [메시지를 추가](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는 일반적으로 대용량 데이터를 종합하여 데이터 웨어하우스나 MapReduce 클러스터에 로드하는 데 사용됩니다. 자세한 내용은 *Amazon Kinesis 개발자 안내서*의 [Amazon Kinesis Data Streams이란 무엇입니까?](https://docs.aws.amazon.com/streams/latest/dev/what-is-this-service.html)를 참조하세요.

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

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

이 내보내기 대상은 다음 요구 사항을 충족해야 합니다.
+ Kinesis Data Streams의 대상 스트림은 AWS 리전 Greengrass 코어 디바이스 AWS 계정 와 동일한 및에 있어야 합니다.
+ (권장) 스트림 관리자 버전 2.2.1은 스트림을 Kinesis Data Streams 대상으로 내보내는 성능을 향상합니다. 최신 버전의 개선 사항을 사용하려면 [스트림 관리자 구성 요소](stream-manager-component.md)를 v2.2.1로 업그레이드하고 [Greengrass 토큰 교환 역할](device-service-role.md)에서 `kinesis:ListShards` 정책을 사용합니다.
+ [코어 디바이스가 AWS 서비스와 상호 작용할 수 있도록 권한 부여](device-service-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로 내보내는 스트림을 생성하려면 Greengrass 구성 요소가 하나 이상의 `KinesisConfig` 객체를 포함하는 내보내기 정의가 있는 [스트림을 생성](work-with-streams.md#streammanagerclient-create-message-stream)합니다. 이 객체는 대상 데이터 스트림, 배치 크기, 배치 간격, 우선 순위와 같은 내보내기 설정을 정의합니다.

Greengrass 구성 요소는 디바이스로부터 데이터를 수신할 때 대상 스트림에 데이터 블롭을 포함하는 [메시지를 추가](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)를 참조하세요.

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

**참고**  
AWS 는 OPC-UA 소스에서 데이터를 스트리밍하는 데 사용할 수 있는 사전 구축된 솔루션을 제공하는 AWS IoT SiteWise 구성 요소도 제공합니다. 자세한 내용은 [IoT SiteWise OPC UA 수집기](iotsitewise-opcua-collector-component.md) 단원을 참조하십시오.

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

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

------
#### [ 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 Greengrass 구성 요소는 하나 이상의 `IoTSiteWiseConfig` 객체를 포함하는 내보내기 정의가 있는 [스트림을 생성합니다](work-with-streams.md#streammanagerclient-create-message-stream). 이 객체는 배치 크기, 배치 간격 및 우선 순위와 같은 내보내기 설정을 정의합니다.

Greengrass 구성 요소는 디바이스로부터 자산 속성을 수신할 때 대상 스트림에 데이터를 포함하는 메시지를 추가합니다. 메시지는 하나 이상의 자산 속성에 대한 속성 값을 포함하는 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)를 참조하세요.

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

스트림 관리자 설정과 Greengrass 구성 요소 논리를 조정하여 내보내기 전략을 설계할 수 있습니다. 예제:
+ 거의 실시간으로 내보내려면 배치 크기 및 간격을 낮게 설정하고 스트림이 수신되면 스트림에 데이터를 추가하세요.
+ 배치 처리를 최적화하고 대역폭 제약을 완화하거나 비용을 최소화하기 위해 Greengrass 구성 요소는 스트림에 데이터를 추가하기 전에 단일 자산 속성에 대해 수신한 타임스탬프-품질-값(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)를 참조하세요.

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

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

이 내보내기 대상은 다음 요구 사항을 충족해야 합니다.
+ 대상 Amazon S3 버킷은 Greengrass 코어 디바이스 AWS 계정 와 동일한에 있어야 합니다.
+ **Greengrass 컨테이너 모드**에서 실행되는 Lambda 함수가 입력 파일 디렉터리에 입력 파일을 쓰는 경우 해당 디렉터리를 쓰기 권한이 있는 컨테이너의 볼륨으로 탑재해야 합니다. 이렇게 하면 파일이 루트 파일 시스템에 기록되고 컨테이너 외부에서 실행되는 스트림 관리자 구성 요소에 표시됩니다.
+ Docker 컨테이너 구성 요소가 입력 파일 디렉터리에 입력 파일을 쓰는 경우 해당 디렉터리를 쓰기 권한이 있는 컨테이너의 볼륨으로 탑재해야 합니다. 이렇게 하면 파일이 루트 파일 시스템에 기록되고 컨테이너 외부에서 실행되는 스트림 관리자 구성 요소에 표시됩니다.
+ [코어 디바이스가 AWS 서비스와 상호 작용할 수 있도록 권한 부여](device-service-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로 내보내는 스트림을 생성하려면 Greengrass 구성 요소에서 `S3ExportTaskExecutorConfig` 객체를 사용하여 내보내기 정책을 구성합니다. 정책은 멀티파트 업로드 임계값 및 우선 순위와 같은 내보내기 설정을 정의합니다. Amazon S3 내보내기의 경우 스트림 관리자는 코어 장치의 로컬 파일에서 읽은 데이터를 업로드합니다. 업로드를 시작하려면 Greengrass 구성 요소가 대상 스트림에 내보내기 태스크를 추가합니다. 내보내기 작업에는 입력 파일 및 대상 Amazon S3 객체에 대한 정보가 포함됩니다. 스트림 관리자는 스트림에 추가된 순서대로 태스크를 실행합니다.

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

스트림 관리자는 멀티파트 업로드 임계값 속성, [최소 파트 크기](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 애플리케이션이 입력 데이터의 라이프사이클을 관리하는 데 사용하는 코드를 작성할 수 있습니다. 다음 예제 워크플로는 Greengrass 구성 요소를 사용하여 이 데이터를 관리하는 방법을 보여줍니다.

1. 로컬 프로세스는 장치 또는 주변 기기로부터 데이터를 수신한 다음 코어 장치의 디렉터리에 있는 파일에 데이터를 씁니다. 스트림 관리자용 입력 파일입니다.

1. Greengrass 구성 요소는 디렉터리를 스캔하고 새 파일이 생성되는 경우 대상 스트림에 [내보내기 태스크를 추가](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. Greengrass 구성 요소는 상태 스트림에서 [메시지를 읽어](work-with-streams.md#streammanagerclient-read-messages) 내보내기 상태를 모니터링합니다. 내보내기 태스크가 완료되면 Greengrass 구성 요소는 해당 입력 파일을 삭제할 수 있습니다. 자세한 내용은 [내보내기 작업 모니터링](#monitor-export-status-s3) 단원을 참조하십시오.

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

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

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

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

다음 예제 워크플로는 Greengrass 구성 요소가 상태 스트림을 사용하여 내보내기 상태를 모니터링하는 방법을 보여줍니다.

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

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

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

1. 내보내기 태스크가 완료되면 Greengrass 구성 요소는 해당 입력 파일을 삭제할 수 있습니다.

다음 예제는 Greengrass 구성 요소가 상태 메시지를 읽고 처리하는 방법을 보여줍니다.

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

```
import time
from stream_manager import (
    ReadMessagesOptions,
    Status,
    StatusConfig,
    StatusLevel,
    StatusMessage,
    StreamManagerClient,
)
from 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-greengrass.github.io/aws-greengrass-stream-manager-sdk-python/_apidoc/stream_manager.streammanagerclient.html#stream_manager.streammanagerclient.StreamManagerClient.read_messages) \$1 [StatusMessage](https://aws-greengrass.github.io/aws-greengrass-stream-manager-sdk-python/_apidoc/stream_manager.data.html#stream_manager.data.StatusMessage)

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

```
import com.amazonaws.greengrass.streammanager.client.StreamManagerClient;
import com.amazonaws.greengrass.streammanager.client.StreamManagerClientFactory;
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 = StreamManagerClientFactory.standard().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-greengrass.github.io/aws-greengrass-stream-manager-sdk-java/com/amazonaws/greengrass/streammanager/client/StreamManagerClient.html#readMessages-java.lang.String-com.amazonaws.greengrass.streammanager.model.ReadMessagesOptions-) \$1 [StatusMessage](https://aws-greengrass.github.io/aws-greengrass-stream-manager-sdk-java/com/amazonaws/greengrass/streammanager/model/StatusMessage.html)

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

```
const {
    StreamManagerClient, ReadMessagesOptions,
    Status, StatusConfig, StatusLevel, StatusMessage,
    util,
} = require(*'aws-greengrass-stream-manager-sdk'*);

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-greengrass.github.io/aws-greengrass-stream-manager-sdk-js/aws-greengrass-core-sdk.StreamManager.StreamManagerClient.html#readMessages) \$1 [StatusMessage](https://aws-greengrass.github.io/aws-greengrass-stream-manager-sdk-js/aws-greengrass-core-sdk.StreamManager.StatusMessage.html)

------