지원되는 AWS 클라우드 대상의 구성 내보내기 - AWS IoT Greengrass

AWS IoT Greengrass Version 1이(가) 2023년 6월 30일에 수명 연장 단계에 들어갔습니다. AWS IoT Greengrass V1 관리형 정책에 대한 자세한 정보는 섹션을 참조하세요. 이 날짜 이후에는 AWS IoT Greengrass V1에서 기능, 개선 사항, 버그 수정 또는 보안 패치를 제공하는 업데이트를 릴리스하지 않습니다. AWS IoT Greengrass V1에서 실행되는 장치는 중단되지 않으며 계속 작동하고 클라우드에 연결됩니다. 중대한 새 기능추가 플랫폼에 대한 지원이 추가되는 AWS IoT Greengrass Version 2(으)로 마이그레이션하는 것이 좋습니다.

지원되는 AWS 클라우드 대상의 구성 내보내기

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

ExportDefinition 속성 유형의 객체 모델 다이어그램.

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

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

참고

StreamManagerClient는 스트림을 HTTP 서버로 내보내는 데 사용할 수 있는 대상을 제공합니다. 이 대상은 테스트 목적으로만 사용됩니다. 이 대상은 안정적이지 않으며 프로덕션 환경에서 사용할 수 없습니다.

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

AWS IoT Analytics 채널

스트림 관리자는 AWS IoT Analytics로 자동 내보내기를 지원합니다. AWS IoT Analytics를 이용해 데이터에 대한 고급 분석을 수행하여 비즈니스 결정을 내리고 기계 학습 모델을 개선할 수 있습니다. 자세한 내용은 AWS IoT Analytics 사용 설명서의 AWS IoT Analytics란 무엇인가요?를 참조하세요.

AWS IoT Greengrass Core SDK에서 Lambda 함수는 IoTAnalyticsConfig를 사용하여 이 대상 유형에 대한 내보내기 구성을 정의합니다. 자세한 내용은 대상 언어에 대한 SDK 참조를 확인하십시오.

요구 사항

이 내보내기 대상은 다음 요구 사항을 충족해야 합니다.

  • AWS IoT Analytics의 대상 채널은 Greengrass 그룹과 동일한 AWS 계정 및 AWS 리전에 있어야 합니다.

  • Greengrass 그룹 역할은 채널을 타겟팅할 수 있는 iotanalytics:BatchPutMessage 권한을 허용해야 합니다. 예:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iotanalytics:BatchPutMessage" ], "Resource": [ "arn:aws:iotanalytics:region:account-id:channel/channel_1_name", "arn:aws:iotanalytics:region:account-id:channel/channel_2_name" ] } ] }

    리소스에 대한 세부적 또는 조건부 액세스 권한을 부여할 수 있습니다(예: 와일드카드 * 이름 지정 스키마를 사용해). 자세한 내용은 IAM 사용 설명서IAM 정책 추가 및 제거를 참조하세요.

AWS IoT Analytics로 내보내기

AWS IoT Analytics로 내보내는 스트림을 생성하기 위해 Lambda 함수는 하나 이상의 IoTAnalyticsConfig 객체를 포함하는 내보내기 정의를 가지는 스트림을 생성합니다. 이 객체는 대상 채널, 배치 크기, 배치 간격, 우선 순위와 같은 내보내기 설정을 정의합니다.

Lambda 함수는 장치로부터 데이터를 수신할 때 대상 스트림에 데이터 묶음이 포함된 메시지를 추가합니다.

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

 

Amazon Kinesis Data Streams

스트림 관리자는 Amazon Kinesis Data Streams로의 자동 내보내기를 지원합니다. Kinesis Data Streams는 일반적으로 대용량 데이터를 종합하여 데이터 웨어하우스나 map-reduce 클러스터에 로드하는 데 사용됩니다. 자세한 내용은 Amazon Kinesis 개발자 안내서Amazon Kinesis Data Streams이란 무엇입니까?를 참조하세요.

AWS IoT Greengrass Core SDK에서 Lambda 함수는 KinesisConfig를 사용하여 이 대상 유형에 대한 내보내기 구성을 정의합니다. 자세한 내용은 대상 언어에 대한 SDK 참조를 확인하십시오.

요구 사항

이 내보내기 대상은 다음 요구 사항을 충족해야 합니다.

  • Kinesis Data Streams의 대상 스트림은 Greengrass 그룹과 동일한 AWS 계정 및 AWS 리전에 있어야 합니다.

  • Greengrass 그룹 역할은 데이터 스트림을 타겟팅할 수 있는 kinesis:PutRecords 권한을 허용해야 합니다. 예:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kinesis:PutRecords" ], "Resource": [ "arn:aws:kinesis:region:account-id:stream/stream_1_name", "arn:aws:kinesis:region:account-id:stream/stream_2_name" ] } ] }

    리소스에 대한 세부적 또는 조건부 액세스 권한을 부여할 수 있습니다(예: 와일드카드 * 이름 지정 스키마를 사용해). 자세한 내용은 IAM 사용 설명서IAM 정책 추가 및 제거를 참조하세요.

Kinesis Data Streams로 내보내기

Kinesis Data Streams로 내보내는 스트림을 생성하기 위해 Lambda 함수는 하나 이상의 KinesisConfig 객체를 포함하는 내보내기 정의를 가진 스트림을 생성합니다. 이 객체는 대상 데이터 스트림, 배치 크기, 배치 간격, 우선 순위와 같은 내보내기 설정을 정의합니다.

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

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

 

AWS IoT SiteWise 자산 속성

스트림 관리자는 AWS IoT SiteWise로 자동 내보내기를 지원합니다. AWS IoT SiteWise는 대규모로 산업 장비 데이터를 수집, 구성 및 분석할 수 있습니다. 자세한 내용은 AWS IoT SiteWise 사용 설명서의 AWS IoT SiteWise란 무엇인가요?를 참조하세요.

AWS IoT Greengrass Core SDK에서 Lambda 함수는 IoTSiteWiseConfig를 사용하여 이 대상 유형에 대한 내보내기 구성을 정의합니다. 자세한 내용은 대상 언어에 대한 SDK 참조를 확인하십시오.

참고

또한 AWS는 OPC-UA 소스와 함께 사용할 수 있는 사전 구축된 솔루션인 IoT SiteWise 커넥터도 제공합니다.

요구 사항

이 내보내기 대상은 다음 요구 사항을 충족해야 합니다.

  • AWS IoT SiteWise의 대상 자산 속성은 Greengrass 그룹과 동일한 AWS 계정 및 AWS 리전에 있어야 합니다.

    참고

    AWS IoT SiteWise가 지원하는 리전 목록은 AWS 일반 참조AWS IoT SiteWise 엔드포인트 및 할당량을 참조하세요.

  • Greengrass 그룹 역할은 대상 자산 속성에 iotsitewise:BatchPutAssetPropertyValue 권한을 허용해야 합니다. 다음 예제의 정책은 iotsitewise:assetHierarchyPath 조건 키를 사용하여 대상 루트 자산과 그 하위 자산에 대한 액세스 권한을 부여합니다. 정책에서 Condition을 제거하여 모든 AWS IoT SiteWise 자산에 대한 액세스를 허용하거나 개별 자산의 ARN을 지정할 수 있습니다.

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

    리소스에 대한 세부적 또는 조건부 액세스 권한을 부여할 수 있습니다(예: 와일드카드 * 이름 지정 스키마를 사용해). 자세한 내용은 IAM 사용 설명서IAM 정책 추가 및 제거를 참조하세요.

    중요한 보안 정보는 AWS IoT SiteWise 사용 설명서BatchPutAssetPropertyValue 권한 부여를 참조하십시오.

AWS IoT SiteWise로 내보내기

AWS IoT SiteWise로 내보내는 스트림을 생성하기 위해 Lambda 함수는 하나 이상의 IoTSiteWiseConfig 객체를 포함하는 내보내기 정의를 가지는 스트림을 생성합니다. 이 객체는 배치 크기, 배치 간격 및 우선 순위와 같은 내보내기 설정을 정의합니다.

Lambda 함수는 장치로부터 데이터를 수신할 때 대상 스트림에 데이터를 포함하는 메시지를 추가합니다. 메시지는 하나 이상의 자산 속성에 대한 속성 값을 포함하는 JSON 직렬화 PutAssetPropertyValueEntry 객체입니다. 자세한 내용은 AWS IoT SiteWise 내보내기 대상에 대한 메시지 추가를 참조하십시오.

참고

AWS IoT SiteWise(으)로 데이터를 보낼 때 데이터는 BatchPutAssetPropertyValue 작업의 요구 사항을 충족해야 합니다. 자세한 내용은 AWS IoT SiteWise API 참조BatchPutAssetPropertyValue를 참조하세요.

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

 

스트림 관리자 설정 및 Lambda 함수 로직을 조정하여 내보내기 전략을 설계할 수 있습니다. 예:

  • 거의 실시간으로 내보내려면 배치 크기 및 간격을 낮게 설정하고 스트림이 수신되면 스트림에 데이터를 추가하십시오.

  • 배치 처리를 최적화하고, 대역폭 제약을 완화하거나, 비용을 최소화하기 위해 Lambda 함수는 스트림에 데이터를 추가하기 전에 단일 자산 속성에 대해 수신된 타임스탬프-품질-값(TQV) 데이터 포인트를 풀링할 수 있습니다. 한 가지 전략은 동일한 속성에 대해 둘 이상의 항목을 보내는 대신 최대 10개의 서로 다른 속성-자산 조합 또는 속성 별칭에 대한 항목을 하나의 메시지로 일괄 처리하는 것입니다. 이렇게 하면 스트림 관리자가 AWS IoT SiteWise 할당량 이내로 유지할 수 있습니다.

 

Amazon S3 객체

스트림 관리자는 Amazon S3로의 자동 내보내기를 지원합니다. Amazon S3를 사용하여 대량의 데이터를 저장 및 검색할 수 있습니다. 자세한 내용은 Amazon Simple Storage Service 개발자 안내서Amazon S3란 무엇인가요?를 참조하세요.

AWS IoT Greengrass Core SDK에서 Lambda 함수는 S3ExportTaskExecutorConfig를 사용하여 이 대상 유형에 대한 내보내기 구성을 정의합니다. 자세한 내용은 대상 언어에 대한 SDK 참조를 확인하십시오.

요구 사항

이 내보내기 대상은 다음 요구 사항을 충족해야 합니다.

  • 대상 Amazon S3 버킷은 Greengrass 그룹과 동일한 AWS 계정에 있어야 합니다.

  • Greengrass 그룹의 기본 컨테이너화가 Greengrass 컨테이너인 경우, STREAM_MANAGER_READ_ONLY_DIRS 파라미터를 설정하여 /tmp 아래에 있거나 루트 파일 시스템에 있지 않은 입력 파일 디렉터리를 사용해야 합니다.

  • Greengrass 컨테이너 모드에서 실행되는 Lambda 함수가 입력 파일 디렉터리에 입력 파일을 쓰는 경우, 디렉터리에 대한 로컬 볼륨 리소스를 생성하고 쓰기 권한을 사용하여 디렉터리를 컨테이너에 마운트해야 합니다. 이렇게 하면 파일이 루트 파일 시스템에 기록되고 컨테이너 외부에서 볼 수 있습니다. 자세한 내용은 Lambda 함수와 커넥터를 사용하여 로컬 리소스에 액세스 단원을 참조하십시오.

  • Greengrass 그룹 역할은 대상 버킷에 다음 권한을 허용해야 합니다. 예:

    { "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/*" ] } ] }

    리소스에 대한 세부적 또는 조건부 액세스 권한을 부여할 수 있습니다(예: 와일드카드 * 이름 지정 스키마를 사용해). 자세한 내용은 IAM 사용 설명서IAM 정책 추가 및 제거를 참조하세요.

Amazon S3로 내보내기

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

참고

대상 버킷은 AWS 계정 내에 이미 있어야 합니다. 지정된 키의 객체가 존재하지 않는 경우 스트림 관리자가 대신 객체를 생성합니다.

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

Amazon S3 내보내기의 스트림 관리자 워크플로우 다이어그램.

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

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

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

스트림의 내보내기 상태를 모니터링하려면 먼저 상태 스트림을 만든 다음 이를 사용하도록 내보내기 스트림을 구성하십시오. 자세한 내용은 내보내기 작업 모니터링 단원을 참조하십시오.

입력 데이터 관리

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

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

    참고

    입력 파일 디렉터리에 대한 액세스를 구성해야 하는지 확인하려면 STREAM_MANAGER_READ_ONLY_DIRS 파라미터를 참조하십시오.

    스트림 관리자가 실행하는 프로세스는 그룹에 대한 기본 액세스 ID의 모든 파일 시스템 권한을 상속합니다. 스트림 관리자는 입력 파일에 액세스할 수 있는 권한이 있어야 합니다. chmod(1) 명령을 사용해 필요한 경우 파일의 권한을 변경할 수 있습니다.

  2. Lambda 함수는 디렉토리를 스캔하고 새 파일이 생성될 때 대상 스트림에 내보내기 작업을 추가합니다. 작업은 입력 파일의 URL, 대상 Amazon S3 버킷 및 키, 선택적 사용자 메타데이터를 지정하는 JSON 직렬화 S3ExportTaskDefinition 객체입니다.

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

  4. Lambda 함수는 상태 스트림에서 메시지를 읽어 내보내기 상태를 모니터링합니다. 내보내기 작업이 완료된 후 Lambda 함수는 해당 입력 파일을 삭제할 수 있습니다. 자세한 내용은 내보내기 작업 모니터링 단원을 참조하십시오.

내보내기 작업 모니터링

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

먼저 상태 스트림으로 사용할 스트림을 생성합니다. 스트림의 크기 및 보존 정책을 구성하여 상태 메시지의 수명을 제어할 수 있습니다. 예:

  • 상태 메시지를 저장하지 않으려는 경우 PersistenceMemory로 설정합니다.

  • 새 상태 메시지가 손실되지 않도록 StrategyOnFullOverwriteOldestData로 설정합니다.

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

  • ERROR

  • WARN

  • INFO

  • DEBUG

  • TRACE

 

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

  1. 이전 워크플로우에서 설명한 것처럼 Lambda 함수는 내보내기 작업에 대한 상태 메시지를 상태 스트림에 기록하도록 구성된 스트림에 내보내기 작업을 추가합니다. 추가 작업은 작업 ID를 나타내는 시퀀스 번호를 반환합니다.

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

    다음 상태 코드는 내보내기 작업이 완료됨 상태에 도달했음을 나타냅니다.

    • Success. 업로드가 성공적으로 완료되었습니다.

    • Failure. 스트림 관리자에서 오류가 발생했습니다. 예를 들어, 지정된 버킷이 존재하지 않습니다. 문제를 해결한 후 내보내기 작업을 스트림에 다시 추가할 수 있습니다.

    • Canceled. 스트림 또는 내보내기 정의가 삭제되었거나 작업의 TTL(Time-to-Live) 기간이 만료되어 작업이 중단되었습니다.

    참고

    작업 상태가 InProgress 또는 Warning 상태를 가질 수도 있습니다. 이벤트가 작업 실행에 영향을 주지 않는 오류를 반환하면 스트림 관리자에서 경고를 발행합니다. 예를 들어 중단된 부분 업로드를 정리하지 못하면 경고가 반환됩니다.

  3. 내보내기 작업이 완료된 후 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_messages | 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 | StatusMessage

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 | StatusMessage