

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

# Amazon SNS FIFO 주제를 사용한 메시지 주문 및 중복 제거 전략
<a name="sns-fifo-topics"></a>

이 주제에서는 Amazon SNS FIFO(First-In-First-Out) 주제의 특성 및 기능과 [Amazon SQS FIFO 대기열](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html)과 통합하는 방법에 대한 정보를 제공합니다. 이러한 서비스를 함께 사용하여 데이터 일관성이 필요한 애플리케이션에 필수적인 엄격한 메시지 순서 지정 및 중복 제거를 보장하는 방법을 알아봅니다. 이 콘텐츠에서는 Amazon SNS FIFO 주제가 유익한 특정 사용 사례를 다루며, 메시지 순서와 고유성이 중요한 시나리오에 대한 통찰력을 제공합니다.

또한 메시지 주문, 메시지 그룹화 및 메시지 전송에 미치는 영향에 대한 기술적 세부 정보도 알아봅니다. 메시지 중복 제거 주제에서는 중복 메시지를 방지하는 메커니즘을 설명하여 각 메시지가 한 번만 처리되도록 합니다. 또한 메시징 시스템의 무결성과 신뢰성을 유지하는 데 중요한 메시지 필터링, 보안 및 내구성에 대해 알아봅니다. 이 콘텐츠에는 메시지 아카이빙 및 재생에 대한 정보도 포함되어 있어 메시지 기록 관리 전략을 제공합니다. 또한 실제 코드 예제는 자체 애플리케이션에서 이러한 기능을 구현하는 데 도움이 되어 Amazon SNS FIFO 주제 및 Amazon SQS FIFO 대기열과의 통합에 대한 실습 경험을 제공합니다.

# Amazon SNS의 높은 처리량 FIFO 주제
<a name="fifo-high-throughput"></a>

Amazon SNS의 높은 처리량 FIFO 주제는 메시지 처리량을 효율적으로 관리하는 동시에 엄격한 메시지 순서를 유지하여 수많은 메시지를 처리하는 애플리케이션의 신뢰성과 확장성을 보장합니다. 이 솔루션은 처리량이 높고 순서가 지정된 메시지 전송이 모두 필요한 시나리오에 적합합니다. 높은 처리량 FIFO 주제를 사용하여 메시지 처리량을 개선하려면 메시지 그룹 수를 늘리는 것이 좋습니다. 높은 처리량 메시지 할당량에 대한 자세한 내용은 *Amazon Web Services 일반 참조*의 [Amazon SNS 서비스 할당량](https://docs.aws.amazon.com/general/latest/gr/sns.html) 섹션을 참조하세요.

## Amazon SNS FIFO 주제의 높은 처리량 사용 사례
<a name="fifo-topic-use-cases"></a>

다음 사용 사례는 여러 산업과 시나리오에서 효율성을 보여주는 높은 처리량 FIFO 주제의 다양한 애플리케이션을 강조합니다.
+ **실시간 데이터 처리:** 이벤트 처리 또는 원격 측정 데이터 수집과 같은 실시간 데이터 스트림을 처리하는 애플리케이션은 정확한 분석을 위해 순서를 유지하면서 메시지의 지속적인 유입을 처리하는 높은 처리량 FIFO 주제의 이점을 누릴 수 있습니다.
+ **전자 상거래 주문 처리:** 고객 트랜잭션의 순서 유지가 중요한 전자 상거래 플랫폼에서 높은 처리량 FIFO 주제를 사용하면 쇼핑 성수기에도 주문이 지연 없이 순차적으로 전송됩니다.
+ **금융 서비스:** 고빈도 거래 또는 트랜잭션 데이터를 처리하는 금융 기관은 높은 처리량 FIFO 주제를 사용하여 메시지 순서에 대한 엄격한 규제 요구 사항을 준수하면서 지연 시간을 최소화하고 시장 데이터 및 트랜잭션을 처리합니다.
+ **미디어 스트리밍:** 스트리밍 플랫폼 및 미디어 배포 서비스는 높은 처리량 FIFO 주제를 사용하여 미디어 파일 및 스트리밍 콘텐츠 전송을 관리하므로 사용자에게 원활한 재생 환경을 보장하는 동시에 콘텐츠 전송 순서를 올바르게 유지합니다.

## Amazon SNS FIFO 주제의 높은 처리량을 위한 파티션 및 데이터 배포
<a name="fifo-topic-partitians-and-data-distribution"></a>

높은 처리량 주제의 경우 Amazon SNS는 파티션 간에 FIFO 주제 데이터를 분산합니다. 파티션은 AWS 리전내의 여러 가용 영역에 자동으로 복제되는 주제에 대한 용량 할당입니다. 사용자는 파티션을 관리하지 않습니다. 대신 Amazon SNS는 수신 속도에 따라 사용자를 대신하여 파티션을 자동으로 관리합니다.

FIFO 주제의 경우 Amazon SNS는 다음과 같은 상황에서 주제의 파티션 수를 수정합니다.
+ 현재 게시 속도가 기존 파티션이 지원할 수 있는 속도에 근접하거나 초과하면 주제가 리전별 할당량에 도달할 때까지 추가 파티션이 할당됩니다. 할당량에 대한 자세한 내용은 *Amazon Web Services 일반 참조*의 [Amazon SNS 서비스 할당량](https://docs.aws.amazon.com/general/latest/gr/sns.html) 섹션을 참조하세요.
+ 현재 파티션의 사용률이 낮으면 파티션 수가 줄어들 수 있습니다.

파티션 관리는 백그라운드에서 자동으로 이루어지므로 애플리케이션에는 표시되지 않습니다. 주제와 메시지를 항상 사용할 수 있습니다.

**참고**  
임시 [Publish](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html) API 스로틀링은 일반적인 볼륨의 몇 배를 보내는 동안 주제에 대한 트래픽을 갑자기 크게 늘리는 경우 발생할 수 있습니다. 이 스로틀링은 주제가 늘어난 트래픽을 수용하기 위해 스케일 업되는 동안 중복 제거 기간까지 지속될 수 있습니다.

## 메시지 그룹 ID별로 데이터 배포
<a name="fifo-topic-message-group-ids"></a>

FIFO 주제에 메시지를 게시하기 위해 Amazon SNS는 각 메시지의 메시지 그룹 ID 값을 내부 해시 함수의 입력으로 사용합니다. 해시 함수의 출력 값에 따라 메시지를 처리하는 파티션이 결정되며, 지정된 파티션에서 하나 이상의 메시지 그룹 ID를 처리할 수 있습니다.

**참고**  
Amazon SNS는 고유 값이 많을 수 있는 메시지 그룹 IDs를 사용하는 partitions. AWS recommds 수에 관계없이 FIFO 주제의 파티션에 항목을 균일하게 배포하도록 최적화되어 있습니다.

## Amazon SNS FIFO 주제에서 높은 처리량 활성화
<a name="enable-high-throughput-on-fifo-topic"></a>

기본적으로 Amazon SNS FIFO 주제는 주제 수준 중복 제거를 위해 구성되며, 이는 `Topic`으로 설정된 주제 속성 [https://docs.aws.amazon.com/sns/latest/api/API_CreateTopic.html](https://docs.aws.amazon.com/sns/latest/api/API_CreateTopic.html)에 의해 제어되고 처리량 할당량이 더 제한적입니다. *Amazon Web Services 일반 참조*의 [Amazon SNS 서비스 할당량](https://docs.aws.amazon.com/general/latest/gr/sns.html) 섹션을 참조하세요.

Amazon SNS FIFO 주제에 대해 높은 처리량을 활성화하려면 `FifoThroughputScope` 속성을 `MessageGroup`으로 업데이트합니다. 이 변경은 콘솔을 통해 수행하거나 AWS CLI 및 SDK를 사용하여 수행할 수 있으며 주제 생성 중에도 설정할 수 있습니다. Amazon SNS는 최상의 고객 경험을 위해 이를 권장하고 주제가 제한될 가능성을 줄입니다.

**중요**  
주제의 `FifoThroughputScope`를 `MessageGroup`으로 활성화한 후에는 `Topic` 처리량으로 되돌릴 수 없습니다.

## 구독한 모든 Amazon SQS FIFO 대기열에 대해 높은 처리량 모드 활성화
<a name="enable-high-throughput-for-sqs-fifo-queue"></a>

처리량이 높고 Amazon SQS FIFO 대기열이 하나 이상 구독되어 있는 상태에서 Amazon SNS FIFO 주제에 게시하는 경우 Amazon SQS FIFO 대기열에 높은 처리량을 활성화하는 것이 좋습니다. 이렇게 하면 Amazon SNS FIFO 높은 처리량을 활성화하여 원활하게 전송할 수 있습니다. 자세한 *Amazon Simple Queue Service 개발자 안내서*의 [FIFO 대기열의 높은 처리량](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/high-throughput-fifo.html)을 참조하세요.

# Amazon SNS FIFO 주제 예제 사용 사례
<a name="fifo-example-use-case"></a>

다음 예에서는 Amazon SNS FIFO 주제 및 Amazon SQS 대기열을 사용하여 자동차 부품 제조업체에서 구축한 전자상거래 플랫폼을 설명합니다. 이 플랫폼은 다음 4가지의 서버리스 애플리케이션으로 구성됩니다.
+ 인벤토리 관리자는 가격 관리 애플리케이션을 사용하여 재고가 있는 각 항목의 가격을 설정합니다. 이 회사에서는 환율 변동, 시장 수요, 판매 전략의 변화에 따라 제품 가격이 변동될 수 있습니다. 가격 관리 애플리케이션은 가격이 변경될 때마다 Amazon SNS FIFO 주제에 가격 업데이트를 게시하는 AWS Lambda 기능을 사용합니다.
+ 도매 애플리케이션은 자동차 차체 상점과 자동차 제조업체가 회사의 자동차 부품을 대량으로 구입할 수 있는 웹사이트에 대한 백엔드를 제공합니다. 가격 변경 알림을 받기 위해 도매 애플리케이션은 해당 Amazon SQS FIFO 대기열에서 가격 관리 애플리케이션의 Amazon SNS FIFO 주제를 구독합니다.
+ 소매 애플리케이션은 자동차 소유자와 자동차 튜닝 애호가가 차량의 개별 자동차 부품을 구매할 수 있는 다른 웹사이트에 대한 백엔드를 제공합니다. 가격 변경 알림을 받기 위해 소매 애플리케이션도 해당 Amazon SQS FIFO 대기열에서 가격 관리 애플리케이션의 Amazon SNS FIFO 주제를 구독합니다.
+ 가격 업데이트를 집계하여 Amazon S3 버킷에 저장하는 분석 애플리케이션을 통해 Amazon Athena에서 비즈니스 인텔리전스(BI) 목적으로 버킷을 쿼리할 수 있습니다. 가격 변경 알림을 받기 위해 분석 애플리케이션은 해당 Amazon SQS 표준 대기열에서 가격 관리 애플리케이션의 Amazon SNS FIFO 주제를 구독합니다. 다른 애플리케이션과 달리 분석 애플리케이션은 가격 업데이트의 순서를 엄격하게 지정할 필요가 없습니다.

![\[Amazon SNS FIFO 주제 및 Amazon SQS 대기열을 사용하여 자동차 부품 제조업체에서 만든 전자 상거래 플랫폼의 예제이며, 이를 통해 가격 관리, 도매, 소매, 분석과 같은 다양한 서버리스 애플리케이션이 순서대로 메시지를 전달하고 중복을 제거하기 위해 이러한 서비스를 어떻게 활용하는지 보여줍니다. 이 설정을 통해 도매 및 소매 애플리케이션이 올바른 순서로 가격 업데이트를 수신하면서 분석 애플리케이션은 엄격한 메시지 순서를 필요로 하지 않고도 비즈니스 인텔리전스 목적으로 데이터를 집계할 수 있습니다.\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/images/sns-fifo-usecase.png)


도매 및 소매 애플리케이션이 올바른 순서로 가격 업데이트를 수신하려면 가격 관리 애플리케이션이 엄격하게 순서가 지정된 메시지 배포 시스템을 사용해야 합니다. Amazon SNS FIFO 주제 및 Amazon SQS FIFO 대기열을 사용하면 중복 없이 순서대로 메시지를 처리할 수 있습니다. 자세한 내용은 [FIFO 주제에 대한 Amazon SNS 메시지 정렬 세부 정보](fifo-topic-message-ordering.md) 섹션을 참조하세요. 이 사용 사례를 구현하는 코드 조각은 [FIFO 주제에 대한 Amazon SNS 코드 예제](fifo-topic-code-examples.md)에서 확인하세요.

# FIFO 주제에 대한 Amazon SNS 메시지 정렬 세부 정보
<a name="fifo-topic-message-ordering"></a>

Amazon SNS FIFO 주제는 항상 메시지가 주제에 게시된 정확한 순서로 한 번만, 구독된 Amazon SQS FIFO 대기열에 메시지를 전달합니다. Amazon SQS FIFO 대기열을 구독하면 대기열 소비자가 메시지가 대기열로 전송되는 순서와 동일한 순서로 메시지를 수신하며 중복은 없습니다. 그러나 Amazon SQS 표준 대기열을 구독하면 대기열의 소비자가 메시지를 다른 순서로 두 번 이상 수신할 수 있습니다. 이를 통해 구독자와 게시자를 더욱 분리할 수 있어 구독자가 [Amazon SNS FIFO 주제 예제 사용 사례](fifo-example-use-case.md)를 기반으로 하는 다음 다이어그램에 나온 것처럼 메시지 소비 및 비용 최적화 측면에서 유연성을 누릴 수 있습니다.

![\[Amazon SNS FIFO(선입선출) 주제의 메시지 전송 시스템의 예로서, Amazon SQS FIFO 대기열에 메시지가 엄격한 순서로 일관되게 전달되는 방법을 강조합니다. 이는 메시지가 순서대로 한 번 이상 도착할 수 있는 Amazon SQS 표준 대기열의 동작과 대조됩니다. 이 예제에서는 분석 함수, 도매 애플리케이션, 소매 애플리케이션 등 세 가지 구독자 유형을 보여 줍니다. 각 구독하는 대기열 유형에 따라 각 구독자가 엄격한 순서 또는 최선의 노력 순서로 메시지를 수신하는 방법을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/images/sns-fifo-ordering-1.png)


구독자에 대한 묵시적인 정렬은 없습니다. 다음 예에서는 메시지 **m1**이 먼저 도매 구독자에게 전달된 다음 소매 구독자에게 전달되고 마지막으로 분석 구독자에게 전달됨을 보여줍니다. 메시지 **m2**는 소매 구독자에게 먼저 전달된 다음 도매 구독자에게 전달되고 마지막으로 분석 구독자에게 전달됩니다. 두 메시지가 구독자에게 다른 순서로 배달되지만 메시지 순서는 각 Amazon SQS FIFO 구독자에 대해 유지됩니다. 각 구독자는 다른 구독자와 분리되어 인식됩니다.

![\[Amazon SNS FIFO 주제와 Amazon SQS FIFO 및 표준 대기열을 포함한 다양한 유형의 구독자가 메시지 주문 및 전송을 처리하는 방법의 예입니다. 메시지가 주제에 게시되고 다양한 유형의 대기열에 전달되어 FIFO 대기열의 경우 주문된 전달을 보장하고 표준 대기열의 경우 최선의 노력을 기울인다는 것을 보여줍니다. 이 설정은 다양한 구성 요소가 정확한 처리를 위해 특정 순서로 신뢰할 수 있는 메시지 전송을 필요로 하는 전자 상거래 플랫폼의 시나리오를 지원합니다.\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/images/sns-fifo-ordering-2.png)


Amazon SQS 대기열 구독자에 연결할 수 없는 경우 동기화되지 않을 수 있습니다. 예를 들어, 도매 애플리케이션 대기열 소유자가 Amazon SNS 서비스 보안 주체가 대기열로 메시지를 전송하지 못하도록 하는 방식으로 [Amazon SQS 대기열 정책](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-using-identity-based-policies.html)을 실수로 변경했다고 가정해 보겠습니다. 이 경우 도매 대기열로의 가격 업데이트는 전달되지 않지만 소매 및 분석 대기열로의 전달은 성공하여 구독자가 동기화되지 않게 됩니다. 도매 애플리케이션 대기열 소유자가 대기열 정책을 수정하면 Amazon SNS는 구독 대기열로 메시지 전달을 재개합니다. 구독에 [DLQ(Dead Letter Queue)](sns-dead-letter-queues.md)가 구성되어 있지 않은 경우, 잘못 구성된 대기열을 대상으로 하는 주제에 게시된 모든 메시지는 삭제됩니다.

![\[Amazon SNS FIFO 설정에서 메시지가 Amazon SQS 대기열을 통해 다양한 구독자 유형(도매, 소매 및 분석)에 게시되는 메시지 전송 동작의 예입니다. 이는 여러 구독자 대기열 간의 메시지 전송 동기화에 대한 대기열 정책 구성 오류의 영향을 강조합니다. 이 예제는 정책 오류로 인해 도매 구독자의 메시지 전송이 실패하지만 소매 및 분석 구독자의 경우 동기화된 데이터 전송을 유지하기 위해 올바른 대기열 구성의 중요성을 강조하면서 성공적으로 계속되는 방법을 보여줍니다. 이 시나리오에서는 정상적인 상황에서 주문 및 정확히 한 번 전송을 보장하는 FIFO 주제의 기능과 구성 오류의 결과를 강조합니다.\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/images/sns-fifo-ordering-3.png)


여러 애플리케이션(또는 동일한 애플리케이션 내의 여러 스레드)이 SNS FIFO 주제에 병렬로 메시지를 게시하도록 할 수 있습니다. 이렇게 하면 메시지 시퀀싱을 Amazon SNS 서비스에 효과적으로 위임하는 것입니다. 설정된 메시지 시퀀스를 확인하기 위해 시퀀스 번호를 확인할 수 있습니다.

시퀀스 번호는 Amazon SNS가 각 메시지에 할당하는 크고 비연속적인 숫자입니다. 시퀀스 번호의 길이는 128비트이며 각 [메시지 그룹](fifo-message-grouping.md)마다 계속 늘어납니다. 시퀀스 번호는 메시지 본문의 일부로 구독된 Amazon SQS 대기열에 전달됩니다. 그러나 [원시 메시지 전달](sns-large-payload-raw-message-delivery.md)을 사용하면 Amazon SQS 대기열로 전달되는 메시지에 시퀀스 번호나 기타 Amazon SNS 메시지 메타데이터가 포함되지 않습니다.

![\[여러 Lambda 함수의 예는 Amazon SNS FIFO(선입선출) 주제에 메시지를 게시한 다음, 이러한 메시지를 Amazon SQS FIFO 대기열에 전달하여 메시지 처리 순서를 엄격하게 유지합니다. 이 설정은 메시지가 애플리케이션의 여러 구성 요소 간에 전송되는 정확한 순서로 처리되도록 하는 데 사용되며, 순서 번호는 그룹 내 각 메시지의 순서를 나타냅니다. 이러한 유형의 구성은 일관성을 보장하기 위해 작업 및 메시지 순서를 엄격하게 유지해야 하는 애플리케이션에 매우 중요합니다.\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/images/sns-fifo-ordering-4.png)


Amazon SNS FIFO 주제는 메시지 그룹의 컨텍스트에서 정렬을 정의합니다. 자세한 내용은 [FIFO 주제에 대한 Amazon SNS 메시지 그룹화](fifo-message-grouping.md) 섹션을 참조하세요.

# FIFO 주제에 대한 Amazon SNS 메시지 그룹화
<a name="fifo-message-grouping"></a>

동일한 그룹에 속한 메시지는 그룹에 상대적인 엄격한 순서로 하나씩 처리됩니다.

Amazon SNS FIFO 주제에 메시지를 게시할 때 메시지 그룹 ID를 설정합니다. 그룹 ID는 메시지가 특정 메시지 그룹에 속하도록 지정하는 필수 토큰입니다. SNS FIFO 주제는 구독된 Amazon SQS FIFO 대기열에 그룹 ID를 전달합니다. SNS FIFO 주제 또는 SQS FIFO 대기열의 그룹 ID 수에는 제한이 없습니다. 메시지 그룹 ID는 Amazon SQS 표준 대기열로 전달되지 않습니다.

메시지 그룹과 구독 간에는 선호도가 없습니다. 따라서 모든 메시지 그룹에 게시된 메시지는 구독에 연결된 필터 정책에 따라 모든 구독 대기열에 전송됩니다. 자세한 정보는 [FIFO 주제에 대한 Amazon SNS 메시지 전송](fifo-message-delivery.md) 및 [FIFO 주제에 대한 Amazon SNS 메시지 필터링](fifo-message-filtering.md)에서 확인하세요.

[자동차 부품 가격 관리 예 사용 사례](fifo-example-use-case.md)에는 플랫폼에서 판매되는 각 제품에 대한 전용 메시지 그룹이 있습니다. 동일한 Amazon SNS FIFO 주제가 모든 가격 업데이트를 처리하는 데 사용됩니다. 가격 업데이트 순서는 단일 자동차 부품 제품 컨텍스트 내에서 유지되지만 복수의 제품에서는 유지되지 않습니다. 다음 다이어그램은 이 과정을 보여 줍니다. 메시지 그룹 ID가 **product-214**인 제품의 경우 **m1** 메시지는 항상 **m4**보다 먼저 처리됩니다. 이 시퀀스는 Amazon SNS FIFO에서 Amazon SQS FIFO까지 사용하는 워크플로 전체에서 보존됩니다. 마찬가지로, 메시지 그룹 ID가 **product-799**인 제품의 경우 **m2** 메시지는 항상 **m3**보다 먼저 처리됩니다. 하지만 Amazon SQS 표준 대기열을 사용하면 메시지 순서가 더 이상 보장되지 않으며 메시지 그룹이 존재하지 않습니다. **product-214** 및 **product-799** 메시지 그룹은 서로 독립적이므로 해당 메시지의 순서를 지정하는 방법 사이에는 관계가 없습니다.

![\[다양한 및 메시지 그룹 ID와 관련된 Amazon SNS FIFO 주제 시나리오에서 메시지 순서 AWS 서비스 지정 및 중복 제거가 작동하는 방법의 예입니다. IDs Amazon SNS FIFO 주제를 통해 다양한 유형의 Amazon SQS 대기열(FIFO 및 표준)로 Lambda 함수의 메시지 흐름을 보여 주고, 표준 대기열에서 잠재적 장애를 보여주면서 FIFO 대기열에서 엄격한 순서를 유지합니다. 이 설정은 전자 상거래 플랫폼의 가격 업데이트와 같은 애플리케이션에서 메시지 순서 지정의 중요성을 강조하는 데 사용되며, 각 메시지 그룹이 다양한 소비자 서비스에서 독립적으로 순서를 유지하는 방법을 강조합니다.\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/images/sns-fifo-grouping.png)


## 성능 향상을 위한 메시지 그룹 ID별 데이터 배포
<a name="fifo-message-grouping-message-group-ids"></a>

전송 처리량을 최적화하기 위해 Amazon SNS FIFO 주제는 서로 다른 메시지 그룹의 메시지를 병렬로 전송하지만 메시지 순서는 각 메시지 그룹 내에서 엄격하게 유지됩니다. 각 메시지 그룹은 초당 최대 300개의 메시지를 전송할 수 있습니다. 따라서 단일 주제에 대한 처리량을 높이려면 많은 수의 개별 메시지 그룹 ID를 사용하도록 합니다. Amazon SNS FIFO 주제는 다양한 메시지 그룹을 활용하여 더 많은 수의 병렬 파티션에 메시지를 자동으로 배포합니다.

**참고**  
Amazon SNS FIFO 주제는 최적화된 성능을 위해 많은 수의 고유한 메시지 그룹 IDs를 사용하는 group. AWS recommds 수에 관계없이 메시지 그룹 IDs.

처리량이 높고 Amazon SQS FIFO 대기열이 하나 이상 구독되어 있는 상태에서 Amazon SNS FIFO 주제에 게시하는 경우 대기열에 높은 처리량을 활성화하는 것이 좋습니다. 자세한 *Amazon Simple Queue Service 개발자 안내서*의 [FIFO 대기열의 높은 처리량](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/high-throughput-fifo.html)을 참조하세요.

# FIFO 주제에 대한 Amazon SNS 메시지 전송
<a name="fifo-message-delivery"></a>

Amazon SNS FIFO(선입 선출) 주제는 Amazon SQS 표준 대기열과 FIFO 대기열 모두에 전송을 지원하므로 거의 실시간으로 데이터 일관성이 필요한 분산 애플리케이션을 통합할 때 유연하게 제어할 수 있습니다.

엄격한 메시지 순서 지정 또는 중복 제거를 유지해야 하는 워크로드의 경우, Amazon SNS FIFO 주제와 전송 엔드포인트로 구독된 [Amazon SQS FIFO 대기열](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html)을 함께 사용하면 작업 및 이벤트 순서가 중요하거나 중복이 허용되지 않을 때 애플리케이션 간 메시징이 개선됩니다.

최선의 순서 지정 및 최소 한 번 전달을 허용하는 워크로드의 경우 [Amazon SQS 표준 대기열](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/standard-queues.html)에서 Amazon SNS FIFO 주제를 구독하면 FIFO를 활용하지 않는 워크로드 전체에서 대기열을 공유할 뿐만 아니라 비용을 절감할 수 있습니다.

**참고**  
Amazon SNS FIFO 주제에서 AWS Lambda 함수로 메시지를 팬아웃하려면 추가 단계가 필요합니다. 먼저 Amazon SQS FIFO 또는 표준 대기열에서 주제를 구독합니다. 그런 다음 함수를 트리거하도록 대기열을 구성합니다. 자세한 정보는 *AWS 컴퓨팅 블로그*의 [이벤트 소스인 SQS FIFO](https://aws.amazon.com/blogs/compute/new-for-aws-lambda-sqs-fifo-as-an-event-source/) 게시글을 참조하세요.

SNS FIFO 주제는 이메일 주소, 모바일 앱, 문자 메시지용 전화번호(SMS) 또는 HTTP(S) 엔드포인트와 같은 고객 관리형 엔드포인트에 메시지를 전송할 수 없습니다. 이러한 엔드포인트 유형은 엄격한 메시지 순서를 유지하지 못할 수 있습니다. 고객 관리형 엔드포인트에서 SNS FIFO 주제를 구독하려고 하면 오류가 발생합니다.

SNS FIFO 주제는 표준 주제와 동일한 메시지 필터링 기능을 지원합니다. 자세한 정보는 [FIFO 주제에 대한 Amazon SNS 메시지 필터링](fifo-message-filtering.md) 및 *AWS 컴퓨팅 블로그*의 [Amazon SNS 메시지 필터링으로 Pub/Sub 메시징 단순화](https://aws.amazon.com/blogs/compute/simplify-pubsub-messaging-with-amazon-sns-message-filtering/) 게시물을 참조하세요.

# FIFO 주제에 대한 Amazon SNS 메시지 필터링
<a name="fifo-message-filtering"></a>

Amazon SNS FIFO 주제는 메시지 필터링을 지원합니다. 메시지 필터링을 사용하면 게시자 시스템의 메시지 라우팅 논리와 구독자 시스템의 메시지 필터링 논리를 오프로드하여 아키텍처가 단순화됩니다. 

Amazon SQS FIFO 또는 표준 대기열에서 SNS FIFO 주제를 구독할 때 메시지 필터링을 사용하여 구독자가 모든 메시지가 아닌 일부 메시지를 수신하도록 지정할 수 있습니다. 각 구독자는 자체 필터 정책을 구독 속성으로 설정할 수 있습니다. 필터 정책 범위에 따라 필터 정책을 수신 메시지 속성 또는 메시지 본문과 일치시킵니다. 필터 정책이 일치하는 경우 주제는 구독자에게 메시지 복사본을 전달합니다. 일치하는 항목이 없으면 주제는 메시지 복사본을 전송하지 않습니다.

[자동차 부품 가격 관리 예 사용 사례](fifo-example-use-case.md)에서 다음 Amazon SNS 필터 정책이 설정되고 필터 정책 범위는 `MessageBody`라고 가정합니다.
+ 도매 대기열의 경우 필터 정책 `{"business":["wholesale"]}`은 이름이 `business`인 키와 값 집합의 `wholesale`이 포함된 모든 메시지를 일치시킵니다. 다음 다이어그램에서 메시지 **m1**의 키 중 하나는 값이 `wholesale`인 `business`입니다. 메시지 **m3**의 키 중 하나는 값이 `["wholesale,retail"]`인 `business`입니다. 따라서 **m1** 및 **m3**은 모두 필터 정책의 기준과 일치하며 두 메시지 모두 도매 대기열로 전달됩니다.
+ 소매 대기열의 경우 필터 정책 `{"business":["retail"]}`는 이름이 `business`인 키와 값 집합의 `retail`이 포함된 모든 메시지를 일치시킵니다. 다이어그램에서 메시지 **m2**의 키 중 하나는 값이 `retail`인 `business`입니다. 메시지 **m3**의 키 중 하나는 값이 `["wholesale,retail"]`인 `business`입니다. 따라서 **m2** 및 **m3**은 모두 필터 정책의 기준과 일치하며 두 메시지 모두 소매 대기열로 전달됩니다.
+ 분석 대기열의 경우 Amazon Athena가 모든 레코드를 수신하도록 할 것이므로 필터 정책이 적용되지 않습니다.

![\[Amazon SNS FIFO 주제에서 필터 정책을 사용하여 메시지 콘텐츠를 기반으로 다른 Amazon SQS 대기열로 메시지를 라우팅하는 방법을 보여주는 예제입니다. '비즈니스' 키가 '도매'로 설정된 메시지 m1 및 m3이 도매 대기열로 전달되고 '소매'로 지정된 메시지 m2는 소매 대기열로 라우팅됩니다. 이는 대상 메시지 전송을 보여주며, 각 구독자 함수가 관련 메시지만 수신하도록 하여 처리 효율성과 데이터 관련성을 최적화합니다.\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/images/sns-fifo-filtering.png)


SNS FIFO 주제는 속성 문자열 값, 속성 숫자 값 및 속성 키를 비롯한 다양한 일치 연산자를 지원합니다. 자세한 내용은 [Amazon SNS 메시지 필터링](sns-message-filtering.md) 섹션을 참조하세요.

SNS FIFO 주제는 구독된 엔드포인트에 중복 메시지를 전달하지 않습니다. 자세한 내용은 [FIFO 주제에 대한 Amazon SNS 메시지 중복 제거](fifo-message-dedup.md) 섹션을 참조하세요.

# FIFO 주제에 대한 Amazon SNS 메시지 중복 제거
<a name="fifo-message-dedup"></a>

 Amazon SNS FIFO 주제 및 Amazon SQS FIFO 대기열은 다음 조건이 충족되는 한 정확히 한 번만 메시지 전송 및 처리를 제공하는 메시지 중복 제거 기능을 지원합니다.
+ 구독한 Amazon SQS FIFO 대기열이 존재하며 이 대기열에는 Amazon SNS 서비스 보안 주체가 대기열에 메시지를 전달할 수 있는 권한이 있습니다.
+ Amazon SQS FIFO 대기열 소비자는 가시성 시간 제한이 만료되기 전에 메시지를 처리하고 대기열에서 해당 메시지를 삭제합니다.
+ Amazon SNS 구독 주제에는 [메시지 필터링](fifo-message-filtering.md) 기능이 없습니다. 메시지 필터링을 구성하는 경우, Amazon SNS FIFO 주제는 구독 필터 정책에 따라 메시지를 필터링할 수 있으므로 최대 1회 전송을 지원합니다.
+ 메시지 전송 확인을 방해하는 네트워크 중단은 없습니다.

**참고**  
메시지 중복 제거는 주제 속성 `FifoThroughputScope`가 `Topic`로 설정된 경우 전체 Amazon SNS FIFO 주제에 적용됩니다. 주제 속성 `FifoThroughputScope`가 `MessageGroup`으로 설정되면 메시지 중복 제거가 각 개별 [메시지 그룹](fifo-message-grouping.md)에 적용됩니다.

메시지를 Amazon SNS FIFO 주제에 게시하면 해당 메시지에는 중복 제거 ID가 포함되어야 합니다. 이 ID는 Amazon SNS FIFO 주제가 구독된 Amazon SQS FIFO 대기열에 전송하는 메시지에 포함됩니다.

특정 중복 제거 ID가 있는 메시지가 Amazon SNS FIFO 주제에 성공적으로 게시된 경우 5분 중복 제거 간격 내에 동일한 중복 제거 ID로 게시된 모든 메시지는 수락되지만 전송되지는 않습니다. Amazon SNS FIFO 주제는 메시지가 구독된 엔드포인트에 전송된 후에도 주제 속성 `FifoThroughputScope`에 의해 구성된 중복 제거 범위에서 메시지 중복 제거 ID를 계속 추적합니다.

메시지 본문이 게시된 각 메시지에 대해 고유하다고 보장되는 경우 Amazon SNS FIFO 주제 및 구독된 Amazon SQS FIFO 대기열에 대해 콘텐츠 기반 중복 제거를 사용할 수 있습니다. Amazon SNS는 메시지 본문을 사용하여 각 메시지의 중복 제거 ID로 사용할 고유한 해시 값을 생성하므로 각 메시지를 보낼 때 중복 제거 ID를 설정할 필요가 없습니다.

**참고**  
메시지 속성은 해시 계산에 포함되지 않습니다.

Amazon SNS FIFO 주제에 대해 콘텐츠 기반 중복 제거가 사용 설정되고 메시지가 중복 제거 ID로 게시되면 게시된 중복 제거 ID가 생성된 콘텐츠 기반 중복 제거 ID를 재정의합니다.

[자동차 부품 가격 관리 예 사용 사례](fifo-example-use-case.md)에서 회사는 각 가격 업데이트에 대해 범용 고유 중복 제거 ID를 설정해야 합니다. 도매 및 소매의 메시지 속성이 다른 경우에도 메시지 본문이 동일할 수 있기 때문입니다. 그러나 회사가 제품 ID 및 제품 가격과 함께 메시지 본문에 비즈니스 유형(도매 또는 소매)을 추가했다면 Amazon SNS FIFO 주제 및 구독된 Amazon SQS FIFO 대기열에서 콘텐츠 기반 복제를 사용할 수 있습니다.

![\[자동차 부품 가격 관리 예제를 사용하여 Amazon SNS FIFO(선입선출) 주제 환경에서 메시지 중복 제거가 작동하는 방법입니다. Amazon SNS FIFO 주제에 게시된 중복 메시지(m1)가 구독자 시스템(도매, 소매, 분석 대기열)에 여러 번 전달되지 않는 방법을 보여줍니다. 이 중복 제거를 통해 고유한 메시지만 처리되므로 다양한 구독자 함수에서 메시지 처리의 효율성과 정확성이 향상됩니다.\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/images/sns-fifo-dedup.png)


메시지 순서 지정 및 중복 제거 외에도 Amazon SNS FIFO 주제는 AWS KMS 키로 메시지 서버 측 암호화(SSE)를 지원하고 AWS PrivateLink가 포함된 VPC 엔드포인트를 통해 메시지 개인 정보 보호 기능을 지원합니다. 자세한 내용은 [FIFO 주제에 대한 Amazon SNS 메시지 보안](fifo-message-security.md) 섹션을 참조하세요.

# FIFO 주제에 대한 Amazon SNS 메시지 보안
<a name="fifo-message-security"></a>

[AWS Key Management Service(AWS KMS)](https://aws.amazon.com/kms/) [고객 마스터 키(CMK)](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)를 사용하여 Amazon SNS FIFO 주제 및 Amazon SQS FIFO 대기열에 대한 암호화를 활성화할 수 있습니다.
+ 암호화된 새 FIFO 주제 및 대기열을 생성하거나 기존 주제에 대해 암호화를 활성화할 수 있습니다.
+ 메시지 본문만 암호화됩니다. 메시지 속성, 리소스 메타데이터 및 리소스 지표는 암호화되지 않은 상태로 유지됩니다.

**참고**  
기존 FIFO 주제 또는 대기열에 암호화를 추가해도 백로그된 메시지는 암호화되지 않으며, 주제 또는 대기열에서 암호화를 제거하면 백로그된 메시지가 암호화된 상태로 남습니다.

SNS FIFO 주제는 구독된 엔드포인트로 메시지를 전달하기 직전에 메시지를 복호화합니다. SQS FIFO 대기열은 메시지를 소비자 애플리케이션에 반환하기 직전에 암호를 복호화합니다. 자세한 정보는 [Amazon SNS 데이터 암호화](sns-data-encryption.md) 및 *AWS 컴퓨팅 블로그*의 [AWS KMS로 Amazon SNS에 게시된 메시지 암호화](https://aws.amazon.com/blogs/compute/encrypting-messages-published-to-amazon-sns-with-aws-kms/) 게시물을 참조하세요.

또한 SNS FIFO 주제 및 SQS FIFO 대기열은 AWS PrivateLink에서 제공하는 [인터페이스 VPC 엔드포인트](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html)로 메시지 개인 정보 보호를 지원합니다. 인터페이스 엔드포인트를 사용하면 공용 인터넷을 통과하지 않고도 Amazon Virtual Private Cloud(Amazon VPC) 서브넷에서 FIFO 주제 및 대기열로 메시지를 보낼 수 있습니다. 이 모델은 AWS 인프라 및 네트워크 내에서 메시징을 유지하여 애플리케이션의 전반적인 보안을 향상시킵니다. AWS PrivateLink를 사용하는 경우 인터넷 게이트웨이, 네트워크 주소 변환(NAT) 또는 가상 사설 네트워크(VPN)를 설정할 필요가 없습니다. 자세한 정보는 [VPC 엔드포인트로 Amazon SNS 트래픽 보호](sns-internetwork-traffic-privacy.md) 및 *AWS 보안 블로그*의 [AWS PrivateLink로 Amazon SNS에 게시된 메시지 보안](https://aws.amazon.com/blogs/security/securing-messages-published-to-amazon-sns-with-aws-privatelink) 게시물을 참조하세요.

SNS FIFO 주제는 가용 영역 전체에서 배달 못한 편지 대기열 및 메시지 스토리지도 지원합니다. 자세한 내용은 [FIFO 주제에 대한 Amazon SNS 메시지 내구성](fifo-message-durability.md) 섹션을 참조하세요.

# FIFO 주제에 대한 Amazon SNS 메시지 내구성
<a name="fifo-message-durability"></a>

Amazon SNS FIFO 주제 및 Amazon SQS 대기열은 내구성이 뛰어납니다. 두 리소스 유형 모두 여러 가용 영역 전반에서 중복 메시지를 저장하고 예외적인 경우를 처리할 수 있는 배달 못한 편지 대기열을 제공합니다.

Amazon SNS에서 클라이언트 측 또는 서버 측 오류로 인해 Amazon SNS 주제가 구독된 Amazon SQS 대기열에 액세스할 수 없으면 메시지 전송이 실패합니다.
+ 클라이언트 측 오류는 Amazon SNS FIFO 주제에 오래된 구독 메타데이터가 있는 경우에 발생합니다. 클라이언트 측 오류가 발생하는 일반적인 원인 두가지는 Amazon SQS 대기열 소유자가 다음 중 하나를 수행하는 경우입니다.
  + 대기열을 삭제합니다.
  + Amazon SNS 서비스 주체가 메시지를 전달하지 못하도록 대기열 정책을 변경합니다.

  Amazon SNS 클라이언트 측 오류로 인해 실패한 메시지 전송을 다시 시도하지 않습니다.
+ 서버 측 오류는 다음과 같은 상황에서 발생할 수 있습니다.
  + Amazon SQS 서비스를 사용할 수 없습니다.
  + Amazon SQS가 Amazon SNS 서비스의 유효한 요청을 처리하지 못합니다.

  서버 측 오류가 발생하면 Amazon SNS FIFO 주제는 23일 동안 최대 100,015회까지 실패한 전송을 다시 시도합니다. 자세한 내용은 [Amazon SNS 메시지 전송 재시도](sns-message-delivery-retries.md) 섹션을 참조하세요.

모든 유형의 오류에 대해 Amazon SNS는 데이터가 손실되지 않도록 Amazon SQS 배달 못한 편지 대기열에 대한 메시지를 제외할 수 있습니다.

Amazon SQS에서 소비자 애플리케이션이 메시지 수신, 처리 및 대기열에서 삭제에 실패하면 메시지 처리가 실패합니다. 최대 수신 요청 수가 실패하면 Amazon SQS는 메시지를 배달 못한 편지 대기열로 제외하여 데이터가 손실되지 않도록 할 수 있습니다.

[자동차 부품 가격 관리 예 사용 사례](fifo-example-use-case.md)에서 회사는 각 Amazon SNS FIFO 주제 구독과 구독된 각 Amazon SQS 대기열에 Amazon SQS DLQ(Dead Letter Queue)를 할당할 수 있습니다. 이러한 작업은 가격 업데이트 손실로부터 회사를 보호합니다.

![\[Dead Letter Queue(DLQ)를 Amazon SNS FIFO 주제 및 Amazon SQS 대기열과 통합하여 자동차 부품 가격 관리 시스템에서 메시지 신뢰성을 보장하는 방법을 보여주는 예제입니다. 도매, 소매, 분석 목적으로 각 Amazon SNS FIFO 구독을 해당 Amazon SQS FIFO 또는 표준 대기열과 연동하는 설정을 보여줍니다. 각 대기열에는 처리 실패로 인한 메시지 손실로부터 보호하기 위해 유형과 일치하는 자체 DLQ가 장착되어 있습니다.\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/images/sns-fifo-dlq.png)


Amazon SNS 구독에 연결된 DLQ(Dead Letter Queue)는 구독 대기열과 동일한 유형의 Amazon SQS 대기열이어야 합니다. 예를 들어 Amazon SQS FIFO 대기열의 Amazon SNS FIFO 구독에는 DLQ(Dead Letter Queue)로 Amazon SQS FIFO 대기열이 있어야 합니다. 마찬가지로, Amazon SQS 표준 대기열의 Amazon SNS FIFO 구독에는 DLQ(Dead Letter Queue)로 Amazon SQS 표준 대기열이 있어야 합니다. 자세한 정보는 *AWS 컴퓨팅 블로그*에 게시된 [Amazon SNS Dead Letter Queue(DLQ)](sns-dead-letter-queues.md) 및 [Amazon SNS, Amazon SQS 및 AWS Lambda용 DLQ를 사용하여 내구성 있는 서버리스 앱 설계](https://aws.amazon.com/blogs/compute/designing-durable-serverless-apps-with-dlqs-for-amazon-sns-amazon-sqs-aws-lambda/ )를 참조하세요.

다운스트림 오류 복구를 지원하는 확장된 내구성을 위해 주제 소유자는 FIFO 주제를 사용하여 메시지를 최대 365일까지 아카이브할 수도 있습니다. 주제 구독자는 이러한 메시지를 구독된 엔드포인트에 재생하여 다운스트림 애플리케이션의 오류로 인해 손실된 메시지를 복구하거나 기존 애플리케이션의 상태를 복제할 수 있습니다. 자세한 내용은 [FIFO 주제의 Amazon SNS 메시지 아카이브 및 재생](fifo-message-archiving-replay.md) 섹션을 참조하세요.

# FIFO 주제의 Amazon SNS 메시지 아카이브 및 재생
<a name="fifo-message-archiving-replay"></a>

## 메시지 아카이브 및 재생이란?
<a name="what-is-message-archiving-and-replay"></a>

Amazon SNS는 FIFO(선입선출) 주제를 위해 특별히 설계된 코드 없는 메시지 아카이브 및 재생 기능을 제공합니다. 이 기능을 사용하면 주제 소유자가 최대 365일 동안 주제 아카이브 내에 직접 메시지를 저장하고 필요한 경우 구독자에게 메시지를 재생할 수 있습니다. 메시지 아카이빙 및 재생은 손실된 메시지를 복구하고 상태를 복제하여 리전 또는 시스템 간에 애플리케이션을 동기화하는 데 필수적입니다.

이 기능은 AWS API, SDK CloudFormation및를 통해 액세스할 수 있습니다 AWS Management Console.

**주요 사용 사례**
+ **메시지 복구** - 다운스트림 애플리케이션 장애로 인해 손실된 메시지를 구독자의 엔드포인트로 재생하여 복구합니다.
+ **상태 복제** - 특정 타임스탬프에서 시작하는 메시지를 재생하여 새 환경에서 기존 시스템의 상태를 복제합니다.
+ **오류 수정** - 중단 중에 누락된 메시지를 다시 보내 모든 이벤트가 올바르게 처리되도록 합니다.

### 메시지 아카이브 및 재생의 구성 요소
<a name="message-archiving-and-replay-components"></a>

보존 기간 설정, CloudWatch를 사용하여 아카이브된 메시지 모니터링, 구독 속성을 통한 재생 시작, 재생을 수정하고 시작하는 데 필요한 권한 이해 등 Amazon SNS FIFO 주제에 대한 메시지 아카이브 및 재생을 관리합니다.

**메시지 보관**
+ 주제 소유자는 아카이빙 기능을 활성화하고 메시지 보존 기간을 최대 365일로 설정합니다. 자세한 내용은 [FIFO 주제 소유자의 Amazon SNS 메시지 아카이브](message-archiving-and-replay-topic-owner.md) 섹션을 참조하세요
+ CloudWatch 지표는 아카이브된 메시지를 모니터링하는 데 도움이 됩니다.

**메시지 재생**
+ 구독자가 재생을 시작하여 구독한 엔드포인트로 메시지를 재처리할 기간을 선택합니다. 자세한 내용은 [FIFO 주제 구독자를 위한 Amazon SNS 메시지 재생](message-archiving-and-replay-subscriber.md) 섹션을 참조하세요.
+ `ReplayPolicy` 기능을 사용하여 구독 속성을 통해 재생을 관리합니다.

**관련 권한**
+ **`SetSubscriptionAttributes`** - 구독의 `ReplayPolicy` 속성을 사용하여 재생 설정을 구성하거나 수정하는 데 필요합니다.
+ **`Subscribe`** - 새 구독을 연결하고 재생을 시작하는 데 필요합니다.
+ **`GetTopicAttributes`** - 주제의 속성을 볼 수 있지만 재생 시작은 주로 구독 관리와 관련이 있습니다.

# FIFO 주제 소유자의 Amazon SNS 메시지 아카이브
<a name="message-archiving-and-replay-topic-owner"></a>

메시지 아카이브 기능을 통해 주제에 게시된 모든 메시지의 단일 사본을 아카이브할 수 있습니다. 주제에 대한 메시지 아카이브 정책을 활성화하여 게시된 메시지를 주제 내에 저장할 수 있습니다. 그러면 해당 주제에 연결된 모든 구독의 메시지를 아카이브할 수 있습니다. 메시지는 최소 1일에서 최대 365일 동안 아카이브될 수 있습니다.

아카이브 정책을 설정하면 추가 요금이 부과됩니다. 요금 정보는 [Amazon SNS 요금](https://aws.amazon.com/sns/pricing/)을 참조하세요.

## 를 사용하여 메시지 아카이브 정책 생성 AWS Management Console
<a name="message-archiving-and-replay-topic-console"></a>

 AWS Management Console을 사용하여 새 메시지 아카이브 정책을 생성하려면 이 옵션을 사용합니다.

1. [Amazon SNS 콘솔](https://console.aws.amazon.com/sns/home)에 로그인합니다.

1. 주제를 선택하거나 새로운 주제를 생성합니다. 주제 생성 및 구성에 대한 자세한 내용은 [Amazon SNS 주제 생성](sns-create-topic.md)을 참조하세요.
**참고**  
Amazon SNS 메시지 아카이브 및 재생은 애플리케이션 간(A2A) FIFO 주제에만 사용할 수 있습니다.

1. **주제 편집** 페이지에서 **아카이브 정책** 섹션을 확장합니다.

1. **아카이브 정책** 기능을 활성화하고 주제에 메시지를 아카이브하려는 **일수**를 입력합니다.

1. **변경 사항 저장**을 선택합니다.

**메시지 아카이브 주제 정책을 확인, 편집 및 비활성화하려면**
+ **주제 세부 정보** 페이지의 **보존 정책**에는 설정된 일수를 포함한 아카이브 정책의 상태가 표시됩니다. **아카이브 정책** 탭을 선택하면 다음 메시지 아카이브 세부 정보를 볼 수 있습니다.
  + **상태** - 아카이브 정책이 적용되면 아카이브 및 재생 상태가 **활성**으로 표시됩니다. 아카이브 정책이 빈 JSON 객체로 설정되면 아카이브 및 재생 상태가 **비활성**으로 표시됩니다.
  + **메시지 보존 기간** - 지정된 메시지 보존 일수입니다.
  + **아카이브 시작 날짜** - 구독자가 메시지를 재생할 수 있는 날짜입니다.
  + **JSON 미리 보기** - 아카이브 정책의 JSON 미리 보기입니다.
+ (선택 사항) 아카이브 정책을 **편집**하려면 주제 요약 페이지로 이동하여 **편집**을 선택합니다.
+ (선택 사항) 아카이브 정책을 **비활성화**하려면 주제 요약 페이지로 이동하여 **편집**을 선택합니다. **아카이브 정책**을 비활성화하고 **변경 사항 저장**을 선택합니다.
+ (선택 사항) 아카이브 정책을 사용하여 주제를 **삭제**하려면 먼저 앞서 설명한 대로 아카이브 정책을 비활성화해야 합니다.
**중요**  
실수로 메시지가 삭제되는 것을 방지하려는 경우, 활성 메시지 아카이브 정책이 적용된 주제는 삭제할 수 없습니다. 주제를 삭제하려면 먼저 주제의 메시지 아카이브 정책을 비활성화해야 합니다. 메시지 아카이브 정책을 비활성화하면 Amazon SNS에서 아카이브된 모든 메시지가 삭제됩니다. 주제를 삭제하면 구독이 제거되고 전송 중인 메시지가 전송되지 않을 수 있습니다.

## API를 사용하여 메시지 아카이브 정책 생성
<a name="message-archiving-and-replay-topic-api"></a>

API를 사용하여 메시지 아카이브 정책을 생성하려면 주제에 `ArchivePolicy` 속성을 추가해야 합니다. API 작업 `CreateTopic` 및 `SetTopicAttributes`를 사용하여 `ArchivePolicy`를 설정할 수 있습니다. `ArchivePolicy`에는 Amazon SNS가 메시지를 보관하는 일수를 나타내는 단일 값인 `MessageRetentionPeriod`가 있습니다. 주제에 대한 메시지 아카이브를 활성화하려면 `MessageRetentionPeriod`를 0보다 큰 정수 값으로 설정합니다. 예를 들어 아카이브에서 메시지를 30일 동안 보존하려면 `ArchivePolicy`를 다음과 같이 설정합니다.

```
{
    "ArchivePolicy": {
        "MessageRetentionPeriod": "30"
    }
}
```

주제에 대한 메시지 아카이브를 비활성화하고 아카이브를 지우려면 다음과 같이 `ArchivePolicy` 설정을 해제합니다.

```
{}
```

## SDK를 사용하여 메시지 아카이브 정책 생성
<a name="message-archiving-and-replay-topic-sdk"></a>

 AWS SDK를 사용하려면 자격 증명으로 구성해야 합니다. 자세한 내용은 SDK [`config` 및 도구 참조 안내서의 공유 및 `credentials` 파일을](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html) 참조하세요. * AWS SDKs *

다음 코드 예시에서는 해당 주제에 게시된 모든 메시지를 30일 동안 보존하도록 Amazon SNS 주제에 `ArchivePolicy`를 설정하는 방법을 보여줍니다.

```
// Specify the ARN of the Amazon SNS topic to set the ArchivePolicy for.
String topicArn =
    "arn:aws:sns:us-east-2:123456789012:MyArchiveTopic.fifo";

// Set the MessageRetentionPeriod to 30 days for the ArchivePolicy.
String archivePolicy =
    "{\"MessageRetentionPeriod\":\"30\"}";

// Set the ArchivePolicy for the Amazon SNS topic
SetTopicAttributesRequest request = new SetTopicAttributesRequest()
    .withTopicArn(topicArn)
    .withAttributeName("ArchivePolicy")
    .withAttributeValue(archivePolicy);
sns.setTopicAttributes(request);
```

## 를 사용하여 메시지 아카이브 정책 생성 CloudFormation
<a name="message-archiving-and-replay-topic-cfn"></a>

를 사용하여 아카이브 정책을 생성하려면 *AWS CloudFormation 사용 설명서*[https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html)의 섹션을 CloudFormation 참조하세요.

## 암호화된 아카이브에 대한 액세스 권한 부여
<a name="message-archiving-and-replay-topic-kms"></a>

구독자가 암호화된 주제에서 메시지 재생을 시작할 수 있도록 하려면 먼저 다음 단계를 완료해야 합니다. 이전 메시지가 재생되므로 아카이브의 메시지를 암호화하는 데 사용된 KMS 키에 대한 `Decrypt` 액세스 권한을 Amazon SNS에 프로비저닝해야 합니다.

1. KMS 키로 메시지를 암호화하고 주제 내에 저장하는 경우 키 정책을 통해 이러한 메시지를 해독할 수 있는 권한을 Amazon SNS에 부여해야 합니다. 자세한 내용은 [Amazon SNS에 암호 해독 권한 부여](#message-archiving-and-replay-topic-decrypt-permissions) 섹션을 참조하세요.

1. Amazon SNS AWS KMS 에 대해를 활성화합니다. 자세한 내용은 [AWS KMS 권한 구성](sns-key-management.md#sns-what-permissions-for-sse) 섹션을 참조하세요.

**중요**  
KMS 키 정책에 새 섹션을 추가할 때 정책의 기존 섹션을 변경하지 마세요. 주제에 암호화가 활성화되고 KMS 키가 비활성화 또는 삭제되거나 KMS 키 정책이 Amazon SNS에서 올바르게 구성되지 않은 경우 Amazon SNS는 구독자에게 메시지를 재생할 수 없습니다.

### Amazon SNS에 암호 해독 권한 부여
<a name="message-archiving-and-replay-topic-decrypt-permissions"></a>

Amazon SNS가 주제 아카이브 내에서 암호화된 메시지에 액세스하고 이를 구독한 엔드포인트에 재생하려면 Amazon SNS 서비스 보안 주체를 활성화하여 이러한 메시지를 해독해야 합니다.

다음은 주제 내에서 이전 메시지를 재생하는 동안 Amazon SNS 서비스 보안 주체가 저장된 메시지를 해독하도록 허용하는 데 필요한 정책의 예입니다.

```
{
    "Sid": "Allow SNS to decrypt archived messages",
    "Effect": "Allow",
    "Principal": {
        "Service": "sns.amazonaws.com"
    },
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey"
    ],
    "Resource": "*"
}
```

## Amazon CloudWatch를 사용하여 메시지 아카이브 지표 모니터링
<a name="message-archiving-and-replay-topic-cloudwatch"></a>

Amazon CloudWatch에서 다음 지표를 사용하여 아카이브된 메시지를 모니터링할 수 있습니다. 워크로드의 이상 현상에 대한 알림을 받고 관련 영향을 방지하기 위해 이러한 지표에 Amazon CloudWatch 경보를 구성할 수 있습니다. 자세한 내용은 [Amazon SNS의 로깅 및 모니터링](sns-logging-monitoring.md) 섹션을 참조하세요.


| 지표 | 설명 | 
| --- | --- | 
|  **ApproximateNumberOfMessagesArchived**  |  주제 소유자에게 주제 아카이브에 아카이브된 총 메시지 수를 60분 단위로 제공합니다.  | 
|  **ApproximateNumberOfBytesArchived**   |  주제 소유자에게 주제 아카이브의 모든 메시지에 걸쳐 아카이브된 총 바이트 수를 60분 단위로 제공합니다.  | 
|  **NumberOfMessagesArchiveProcessing**   |  주제 소유자에게 해당 간격 동안 주제 아카이브에 저장된 메시지 수를 1분 단위로 제공합니다.  | 
|  **NumberOfBytesArchiveProcessing**  |  주제 소유자에게 해당 간격 동안 주제 아카이브에 저장된 총 바이트 수를 1분 단위로 제공합니다.  | 

`GetTopicAttributes` API에는 구독자가 재생을 시작할 수 있는 가장 오래된 타임스탬프를 나타내는 `BeginningArchiveTime` 속성이 있습니다. 다음은 이 API 작업에 대한 샘플 응답입니다.

```
{
 "ArchivePolicy": {
    "MessageRetentionPeriod": "<integer>"
  },
  "BeginningArchiveTime": "<timestamp>",
  ...
}
```

# FIFO 주제 구독자를 위한 Amazon SNS 메시지 재생
<a name="message-archiving-and-replay-subscriber"></a>

Amazon SNS 재생 기능을 사용하면 주제 구독자가 주제 데이터 스토어에서 아카이브된 메시지를 검색하고 구독한 엔드포인트에 다시 전송할 수 있습니다.
+ 구독이 생성되는 즉시 메시지를 재생할 수 있습니다.
+ 재생된 메시지는 원본과 동일한 콘텐츠, `MessageId` 및 `Timestamp`를 유지합니다.
+ 메시지에는 재생된 메시지임을 나타내는 `Replayed` 속성이 포함되어 있습니다.
+ 특정 메시지만 재생하려는 경우 구독에 필터 정책을 적용할 수 있습니다.

메시지 필터링에 대한 자세한 내용은 [재생된 메시지 필터링](#message-archiving-and-replay-subscription-filtering) 섹션을 참조하세요.

## 를 사용하여 메시지 재생 정책 생성 AWS Management Console
<a name="message-archiving-and-replay-replaying-console"></a>

 AWS Management Console을 사용하여 새 재생 정책을 생성하려면 이 옵션을 사용합니다.

1. [Amazon SNS 콘솔](https://console.aws.amazon.com/sns/home)에 로그인합니다.

1. 주제 구독을 선택하거나 새 주제 구독을 생성합니다. 구독 생성에 대한 자세한 내용은 [Amazon SNS 주제에서 구독 만들기](sns-create-subscribe-endpoint-to-topic.md) 섹션을 참조하세요.

1. 메시지 재생을 시작하려면 **재생** 드롭다운으로 이동하여 **재생 시작**을 선택합니다.

1. **재생 기간** 모달에서 다음과 같이 선택합니다.

   1. **재생 시작 날짜 및 시간 선택** - 아카이브된 메시지의 재생을 시작할 **날짜**(YYYY/MM/DD 형식)와 **시간**(24시간 hh:mm:ss 형식)을 선택합니다. 시작 시간은 대략적인 아카이브 시간의 시작 시간보다 이후여야 합니다.

   1. **(선택 사항) 재생 종료 날짜 및 시간 선택** - 아카이브된 메시지의 재생을 중지할 **날짜**(YYYY/MM/DD 형식)와 **시간**(24시간 hh:mm:ss 형식)을 선택합니다.

   1. **재생 시작**을 선택합니다.

1. (선택 사항) 메시지 재생을 **중지**하려면 **구독 세부 정보** 페이지로 이동한 다음 **재생** 드롭다운에서 **재생 중지**를 선택합니다.

1. (선택 사항) CloudWatch를 사용하여 이 워크플로 내에서 메시지 재생 지표를 **모니터링**하려면 [Amazon CloudWatch를 사용하여 메시지 재생 지표 모니터링](#message-archiving-and-replay-subscription-cloudwatch) 섹션을 참조하세요.

**메시지 재생 정책을 확인하고 편집하려면**

**구독 세부 정보** 페이지에서 다음 작업을 수행할 수 있습니다.
+ 메시지 재생 상태를 **확인**하려는 경우, **재생 상태** 필드에 다음 값이 표시됩니다.
  + **완료** - 재생 기능이 모든 메시지를 성공적으로 다시 전송했으며 이제 새로 게시된 메시지를 전송하고 있습니다.
  + **진행 중** - 현재 선택한 메시지가 재생 중입니다.
  + **실패** - 재생을 완료할 수 없습니다.
  + **보류 중** - 재생이 시작되는 동안의 기본 상태입니다.
+ (선택 사항) 메시지 재생 정책을 **수정**하려면 **구독 세부 정보** 페이지로 이동한 다음 **재생** 드롭다운에서 **재생 시작**을 선택합니다. 재생을 시작하면 기존 재생이 대체됩니다.

## API를 사용하여 구독에 재생 정책 추가
<a name="message-archiving-and-replay-subscription-api"></a>

아카이브된 메시지를 재생하려면 `ReplayPolicy` 속성을 사용합니다. `ReplayPolicy`는 `Subscribe` 및 `SetSubscriptionAttributes` API 작업과 함께 사용할 수 있습니다. 이 정책에는 다음 값이 포함되어 있습니다.
+ **`StartingPoint`**(필수) - 메시지 재생을 시작할 위치를 나타냅니다.
+ **`EndingPoint`**(선택 사항) - 메시지 재생을 중지할 시기를 나타냅니다. `EndingPoint`를 생략하면 현재 시간에 도달할 때까지 재생이 계속됩니다.
+ **`PointType`**(필수) - 시작점과 종료점의 유형을 설정합니다. 현재 `PointType`에 지원되는 값은 `Timestamp`입니다.

예를 들어 다운스트림 오류를 복구하고 2023년 10월 1일에 2시간 동안 모든 메시지를 다시 보내려면 `SetSubscriptionAttributes` API 작업을 사용하여 다음과 같이 `ReplayPolicy`를 설정합니다.

```
{
  "PointType":"Timestamp", 
  "StartingPoint":"2023-10-01T10:00:00.000Z", 
  "EndingPoint":"2023-10-01T12:00:00.000Z"
}
```

2023년 10월 1일 현재 주제에 전송된 모든 메시지를 재생하고 주제에 새로 게시된 모든 메시지를 계속 수신하려면 `SetSubscriptionAttributes` API 작업을 사용하여 다음과 같이 구독에 `ReplayPolicy`를 설정합니다.

```
{
  "PointType":"Timestamp",
  "StartingPoint":"2023-10-01T00:00:00.000Z"
}
```

메시지가 재생되었는지 확인하기 위해 재생된 각 메시지에 부울 속성 `Replayed`가 추가됩니다.

## SDK를 사용하여 구독에 재생 정책 추가
<a name="message-replay-sdk"></a>

 AWS SDK를 사용하려면 자격 증명으로 구성해야 합니다. 자세한 내용은 SDK [`config` 및 도구 참조 안내서의 공유 및 `credentials` 파일을](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html) 참조하세요. * AWS SDKs *

다음 코드 예제는 2023년 10월 1일 2시간 동안 Amazon SNS FIFO 주제 아카이브에서 메시지를 재전송하도록 구독에 `ReplayPolicy`를 설정하는 방법을 보여줍니다.

```
// Specify the ARN of the Amazon SNS subscription to initiate the ReplayPolicy on.
String subscriptionArn =
    "arn:aws:sns:us-east-2:123456789012:MyArchiveTopic.fifo:1d2a3e9d-7f2f-447c-88ae-03f1c68294da";

// Set the ReplayPolicy to replay messages from the topic's archive 
// for a 2 hour time period on October 1st 2023 between 10am and 12pm UTC.
String replayPolicy =
    "{\"PointType\":\"Timestamp\",\"StartingPoint\":\"2023-10-01T10:00:00.000Z\",\"EndingPoint\":\"2023-10-01T12:00:00.000Z\"}";

// Set the ArchivePolicy for the Amazon SNS topic
SetSubscriptionAttributesRequest request = new SetSubscriptionAttributesRequest()
    .withSubscriptionArn(subscriptionArn)
    .withAttributeName("ReplayPolicy")
    .withAttributeValue(replayPolicy);
sns.setSubscriptionAttributes(request);
```

## EndingPoint 이해
<a name="message-archiving-and-replay-understanding-endpoint"></a>

Amazon SNS 구독에 `ReplayPolicy`를 적용하는 경우 `EndingPoint` 값은 선택 사항입니다. `EndingPoint` 아무 것도 입력하지 않으면 재생은 지정된 `StartingPoint`에서 시작되어 새로 게시된 메시지 처리를 포함하여 현재 시간까지 계속됩니다. 일단 확인되면 구독은 일반 구독으로 작동하여 새 메시지가 게시될 때 수신됩니다.

`EndingPoint`가 지정되면 서비스는 `StartingPoint`에서 `EndingPoint`까지 메시지를 재생한 다음 중지합니다. **이 작업은 구독을 효과적으로 일시 중지합니다.** 구독이 일시 중지된 동안에는 새로 게시된 메시지가 구독된 엔드포인트로 전달되지 않습니다.

메시지 전송을 재개하려면 `EndingPoint`를 제공하지 않고 새 `ReplayPolicy`를 적용하고 `StartingPoint`가 메시지를 계속 수신할 원하는 시점으로 설정합니다. 예를 들어 이전 재생이 완료된 구독에서 구독을 재개하려면 새 `EndingPoint`를 이전에 제공된 `StartingPoint`로 설정합니다.

## 재생된 메시지 필터링
<a name="message-archiving-and-replay-subscription-filtering"></a>

Amazon SNS 메시지 필터링을 사용하면 Amazon SNS가 구독자 엔드포인트에 재생하는 재생된 메시지를 제어할 수 있습니다. 메시지 필터링과 메시지 보관이 모두 활성화된 경우 Amazon SNS는 먼저 주제의 데이터 스토어에서 메시지를 검색한 다음 구독의 `FilterPolicy`에 대해 메시지를 적용합니다. 일치하는 항목이 있으면 메시지가 구독된 엔드포인트로 전송되고 그렇지 않으면 메시지가 필터링됩니다. 자세한 내용은 [Amazon SNS 구독 필터 정책](sns-subscription-filter-policies.md) 섹션을 참조하세요.

## Amazon CloudWatch를 사용하여 메시지 재생 지표 모니터링
<a name="message-archiving-and-replay-subscription-cloudwatch"></a>

Amazon CloudWatch에서 다음 지표를 사용하여 재생 메시지를 모니터링할 수 있습니다. 워크로드의 이상 현상에 대한 알림을 받고 관련 영향을 방지하기 위해 이러한 지표에 Amazon CloudWatch 경보를 구성할 수 있습니다. 자세한 내용은 [Amazon SNS의 로깅 및 모니터링](sns-logging-monitoring.md) 섹션을 참조하세요.


| 지표 | 설명 | 
| --- | --- | 
|  **NumberOfReplayedNotificationsDelivered**  |  구독자에게 주제 아카이브에서 재생된 총 메시지 수를 1분 단위로 제공합니다.  | 
|  **NumberOfReplayedNotificationsFailed**   |  구독자에게 주제 아카이브에서 전송에 실패한 재생된 총 메시지 수를 1분 단위로 제공합니다.  | 

# FIFO 주제에 대한 Amazon SNS 코드 예제
<a name="fifo-topic-code-examples"></a>

다음 코드 예제를 통해 Amazon SNS FIFO 주제를 사용하는 [자동차 부품 가격 관리 예제 사용 사례](fifo-example-use-case.md)를 Amazon SQS FIFO 대기열 또는 표준 대기열과 통합할 수 있습니다.

## AWS SDK 사용
<a name="fifo-topic-aws-sdks"></a>

 AWS SDK를 사용하여 `FifoTopic` 속성을 로 설정하여 Amazon SNS FIFO 주제를 생성합니다**true**. `FifoQueue` 속성을 **true**로 설정하여 Amazon SQS FIFO 대기열을 생성합니다. 또한 각 FIFO 리소스의 이름에 **.fifo** 접미사를 추가해야 합니다. FIFO 주제 또는 대기열을 생성한 후에는 표준 주제 또는 대기열로 변환할 수 없습니다.

다음 코드 예제에서는 이러한 FIFO 및 표준 대기열 리소스를 생성합니다.
+ 가격 업데이트를 배포하는 Amazon SNS FIFO 주제
+ 도매 및 소매 애플리케이션에 이러한 업데이트를 제공하는 Amazon SQS FIFO 대기열
+ 비즈니스 인텔리전스(BI) 목적으로 쿼리할 수 있는 레코드를 저장하는 분석 애플리케이션에 대한 Amazon SQS 표준 대기열
+ 세 대기열을 주제에 연결하는 Amazon SNS FIFO 구독

이 예에서는 구독에 대한 [필터 정책](sns-subscription-filter-policies.md)을 설정합니다. 주제에 메시지를 게시하여 예제를 테스트하는 경우 `business` 속성을 사용하여 메시지를 게시해야 합니다. 속성 값에 대해 `retail` 또는 `wholesale` 중 하나를 지정합니다. 그렇지 않으면 메시지가 필터링되어 구독된 대기열에 배달되지 않습니다. 자세한 내용은 [FIFO 주제에 대한 Amazon SNS 메시지 필터링](fifo-message-filtering.md) 섹션을 참조하세요.

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

**SDK for Java 2.x**  
 GitHub에 더 많은 내용이 있습니다. [AWS 코드 예 리포지토리](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/sns#code-examples)에서 전체 예를 찾고 설정 및 실행하는 방법을 배워보세요.
이 예에서는  
+ Amazon SNS FIFO 주제 1개, Amazon SQS FIFO 대기열 2개, 표준 대기열 1개를 생성합니다.
+ 대기열에서 주제를 구독하고 해당 주제에 메시지를 게시합니다.
[테스트](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/sns/src/test/java/com/example/sns/PriceUpdateExampleTest.java)에서는 각 대기열에 대한 메시지 수신 여부를 확인합니다. 또한 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/sns/src/main/java/com/example/sns/PriceUpdateExample.java)에서는 액세스 정책을 추가하는 것을 보여주고 마지막에 리소스를 삭제합니다.  

```
public class PriceUpdateExample {
    public final static SnsClient snsClient = SnsClient.create();
    public final static SqsClient sqsClient = SqsClient.create();

    public static void main(String[] args) {

        final String usage = "\n" +
            "Usage: " +
            "    <topicName> <wholesaleQueueFifoName> <retailQueueFifoName> <analyticsQueueName>\n\n" +
            "Where:\n" +
            "   fifoTopicName - The name of the FIFO topic that you want to create. \n\n" +
            "   wholesaleQueueARN - The name of a SQS FIFO queue that will be created for the wholesale consumer. \n\n"
            +
            "   retailQueueARN - The name of a SQS FIFO queue that will created for the retail consumer. \n\n" +
            "   analyticsQueueARN - The name of a SQS standard queue that will be created for the analytics consumer. \n\n";
        if (args.length != 4) {
            System.out.println(usage);
            System.exit(1);
        }

        final String fifoTopicName = args[0];
        final String wholeSaleQueueName = args[1];
        final String retailQueueName = args[2];
        final String analyticsQueueName = args[3];

        // For convenience, the QueueData class holds metadata about a queue: ARN, URL,
        // name and type.
        List<QueueData> queues = List.of(
            new QueueData(wholeSaleQueueName, QueueType.FIFO),
            new QueueData(retailQueueName, QueueType.FIFO),
            new QueueData(analyticsQueueName, QueueType.Standard));

        // Create queues.
        createQueues(queues);

        // Create a topic.
        String topicARN = createFIFOTopic(fifoTopicName);

        // Subscribe each queue to the topic.
        subscribeQueues(queues, topicARN);

        // Allow the newly created topic to send messages to the queues.
        addAccessPolicyToQueuesFINAL(queues, topicARN);

        // Publish a sample price update message with payload.
        publishPriceUpdate(topicARN, "{\"product\": 214, \"price\": 79.99}", "Consumables");

        // Clean up resources.
        deleteSubscriptions(queues);
        deleteQueues(queues);
        deleteTopic(topicARN);
    }

    public static String createFIFOTopic(String topicName) {
        try {
            // Create a FIFO topic by using the SNS service client.
            Map<String, String> topicAttributes = Map.of(
                "FifoTopic", "true",
                "ContentBasedDeduplication", "false",
                "FifoThroughputScope", "MessageGroup");

            CreateTopicRequest topicRequest = CreateTopicRequest.builder()
                .name(topicName)
                .attributes(topicAttributes)
                .build();

            CreateTopicResponse response = snsClient.createTopic(topicRequest);
            String topicArn = response.topicArn();
            System.out.println("The topic ARN is" + topicArn);

            return topicArn;

        } catch (SnsException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
        return "";
    }

    public static void subscribeQueues(List<QueueData> queues, String topicARN) {
        queues.forEach(queue -> {
            SubscribeRequest subscribeRequest = SubscribeRequest.builder()
                .topicArn(topicARN)
                .endpoint(queue.queueARN)
                .protocol("sqs")
                .build();

            // Subscribe to the endpoint by using the SNS service client.
            // Only Amazon SQS queues can receive notifications from an Amazon SNS FIFO
            // topic.
            SubscribeResponse subscribeResponse = snsClient.subscribe(subscribeRequest);
            System.out.println("The queue [" + queue.queueARN + "] subscribed to the topic [" + topicARN + "]");
            queue.subscriptionARN = subscribeResponse.subscriptionArn();
        });
    }

    public static void publishPriceUpdate(String topicArn, String payload, String groupId) {

        try {
            // Create and publish a message that updates the wholesale price.
            String subject = "Price Update";
            String dedupId = UUID.randomUUID().toString();
            String attributeName = "business";
            String attributeValue = "wholesale";

            MessageAttributeValue msgAttValue = MessageAttributeValue.builder()
                .dataType("String")
                .stringValue(attributeValue)
                .build();

            Map<String, MessageAttributeValue> attributes = new HashMap<>();
            attributes.put(attributeName, msgAttValue);
            PublishRequest pubRequest = PublishRequest.builder()
                .topicArn(topicArn)
                .subject(subject)
                .message(payload)
                .messageGroupId(groupId)
                .messageDeduplicationId(dedupId)
                .messageAttributes(attributes)
                .build();

            final PublishResponse response = snsClient.publish(pubRequest);
            System.out.println(response.messageId());
            System.out.println(response.sequenceNumber());
            System.out.println("Message was published to " + topicArn);

        } catch (SnsException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
    }
```
+ API 세부 정보는 *AWS SDK for Java 2.x API 참조*의 다음 주제를 참조하세요.
  + [CreateTopic](https://docs.aws.amazon.com/goto/SdkForJavaV2/sns-2010-03-31/CreateTopic)
  + [게시](https://docs.aws.amazon.com/goto/SdkForJavaV2/sns-2010-03-31/Publish)
  + [Subscribe](https://docs.aws.amazon.com/goto/SdkForJavaV2/sns-2010-03-31/Subscribe)

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

**SDK for Python (Boto3)**  
 GitHub에 더 많은 내용이 있습니다. [AWS 코드 예 리포지토리](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/python/example_code/sns#code-examples)에서 전체 예를 찾고 설정 및 실행하는 방법을 배워보세요.
Amazon FIFO 주제를 생성하고, Amazon SQS FIFO 및 표준 대기열에서 주제를 구독하고, 해당 주제에 메시지를 게시합니다.  

```
def usage_demo():
    """Shows how to subscribe queues to a FIFO topic."""
    print("-" * 88)
    print("Welcome to the `Subscribe queues to a FIFO topic` demo!")
    print("-" * 88)

    sns = boto3.resource("sns")
    sqs = boto3.resource("sqs")
    fifo_topic_wrapper = FifoTopicWrapper(sns)
    sns_wrapper = SnsWrapper(sns)

    prefix = "sqs-subscribe-demo-"
    queues = set()
    subscriptions = set()

    wholesale_queue = sqs.create_queue(
        QueueName=prefix + "wholesale.fifo",
        Attributes={
            "MaximumMessageSize": str(4096),
            "ReceiveMessageWaitTimeSeconds": str(10),
            "VisibilityTimeout": str(300),
            "FifoQueue": str(True),
            "ContentBasedDeduplication": str(True),
        },
    )
    queues.add(wholesale_queue)
    print(f"Created FIFO queue with URL: {wholesale_queue.url}.")

    retail_queue = sqs.create_queue(
        QueueName=prefix + "retail.fifo",
        Attributes={
            "MaximumMessageSize": str(4096),
            "ReceiveMessageWaitTimeSeconds": str(10),
            "VisibilityTimeout": str(300),
            "FifoQueue": str(True),
            "ContentBasedDeduplication": str(True),
        },
    )
    queues.add(retail_queue)
    print(f"Created FIFO queue with URL: {retail_queue.url}.")

    analytics_queue = sqs.create_queue(QueueName=prefix + "analytics", Attributes={})
    queues.add(analytics_queue)
    print(f"Created standard queue with URL: {analytics_queue.url}.")

    topic = fifo_topic_wrapper.create_fifo_topic("price-updates-topic.fifo")
    print(f"Created FIFO topic: {topic.attributes['TopicArn']}.")

    for q in queues:
        fifo_topic_wrapper.add_access_policy(q, topic.attributes["TopicArn"])

    print(f"Added access policies for topic: {topic.attributes['TopicArn']}.")

    for q in queues:
        sub = fifo_topic_wrapper.subscribe_queue_to_topic(
            topic, q.attributes["QueueArn"]
        )
        subscriptions.add(sub)

    print(f"Subscribed queues to topic: {topic.attributes['TopicArn']}.")

    input("Press Enter to publish a message to the topic.")

    message_id = fifo_topic_wrapper.publish_price_update(
        topic, '{"product": 214, "price": 79.99}', "Consumables"
    )

    print(f"Published price update with message ID: {message_id}.")

    # Clean up the subscriptions, queues, and topic.
    input("Press Enter to clean up resources.")
    for s in subscriptions:
        sns_wrapper.delete_subscription(s)

    sns_wrapper.delete_topic(topic)

    for q in queues:
        fifo_topic_wrapper.delete_queue(q)

    print(f"Deleted subscriptions, queues, and topic.")

    print("Thanks for watching!")
    print("-" * 88)



class FifoTopicWrapper:
    """Encapsulates Amazon SNS FIFO topic and subscription functions."""

    def __init__(self, sns_resource):
        """
        :param sns_resource: A Boto3 Amazon SNS resource.
        """
        self.sns_resource = sns_resource

    def create_fifo_topic(self, topic_name):
        """
        Create a FIFO topic.
        Topic names must be made up of only uppercase and lowercase ASCII letters,
        numbers, underscores, and hyphens, and must be between 1 and 256 characters long.
        For a FIFO topic, the name must end with the .fifo suffix.

        :param topic_name: The name for the topic.
        :return: The new topic.
        """
        try:
            topic = self.sns_resource.create_topic(
                Name=topic_name,
                Attributes={
                    "FifoTopic": str(True),
                    "ContentBasedDeduplication": str(False),
                    "FifoThroughputScope": "MessageGroup",
                },
            )
            logger.info("Created FIFO topic with name=%s.", topic_name)
            return topic
        except ClientError as error:
            logger.exception("Couldn't create topic with name=%s!", topic_name)
            raise error


    @staticmethod
    def add_access_policy(queue, topic_arn):
        """
        Add the necessary access policy to a queue, so
        it can receive messages from a topic.

        :param queue: The queue resource.
        :param topic_arn: The ARN of the topic.
        :return: None.
        """
        try:
            queue.set_attributes(
                Attributes={
                    "Policy": json.dumps(
                        {
                            "Version":"2012-10-17",		 	 	 
                            "Statement": [
                                {
                                    "Sid": "test-sid",
                                    "Effect": "Allow",
                                    "Principal": {"AWS": "*"},
                                    "Action": "SQS:SendMessage",
                                    "Resource": queue.attributes["QueueArn"],
                                    "Condition": {
                                        "ArnLike": {"aws:SourceArn": topic_arn}
                                    },
                                }
                            ],
                        }
                    )
                }
            )
            logger.info("Added trust policy to the queue.")
        except ClientError as error:
            logger.exception("Couldn't add trust policy to the queue!")
            raise error


    @staticmethod
    def subscribe_queue_to_topic(topic, queue_arn):
        """
        Subscribe a queue to a topic.

        :param topic: The topic resource.
        :param queue_arn: The ARN of the queue.
        :return: The subscription resource.
        """
        try:
            subscription = topic.subscribe(
                Protocol="sqs",
                Endpoint=queue_arn,
            )
            logger.info("The queue is subscribed to the topic.")
            return subscription
        except ClientError as error:
            logger.exception("Couldn't subscribe queue to topic!")
            raise error


    @staticmethod
    def publish_price_update(topic, payload, group_id):
        """
        Compose and publish a message that updates the wholesale price.

        :param topic: The topic to publish to.
        :param payload: The message to publish.
        :param group_id: The group ID for the message.
        :return: The ID of the message.
        """
        try:
            att_dict = {"business": {"DataType": "String", "StringValue": "wholesale"}}
            dedup_id = uuid.uuid4()
            response = topic.publish(
                Subject="Price Update",
                Message=payload,
                MessageAttributes=att_dict,
                MessageGroupId=group_id,
                MessageDeduplicationId=str(dedup_id),
            )
            message_id = response["MessageId"]
            logger.info("Published message to topic %s.", topic.arn)
        except ClientError as error:
            logger.exception("Couldn't publish message to topic %s.", topic.arn)
            raise error
        return message_id


    @staticmethod
    def delete_queue(queue):
        """
        Removes an SQS queue. When run against an AWS account, it can take up to
        60 seconds before the queue is actually deleted.

        :param queue: The queue to delete.
        :return: None
        """
        try:
            queue.delete()
            logger.info("Deleted queue with URL=%s.", queue.url)
        except ClientError as error:
            logger.exception("Couldn't delete queue with URL=%s!", queue.url)
            raise error
```
+ API 세부 정보는 *AWS SDK for Python (Boto3) API 참조*의 다음 주제를 참조하세요.
  + [CreateTopic](https://docs.aws.amazon.com/goto/boto3/sns-2010-03-31/CreateTopic)
  + [게시](https://docs.aws.amazon.com/goto/boto3/sns-2010-03-31/Publish)
  + [Subscribe](https://docs.aws.amazon.com/goto/boto3/sns-2010-03-31/Subscribe)

------
#### [ SAP ABAP ]

**SDK for SAP ABAP API**  
 GitHub에 더 많은 내용이 있습니다. [AWS 코드 예 리포지토리](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/sap-abap/services/sns#code-examples)에서 전체 예를 찾고 설정 및 실행하는 방법을 배워보세요.
FIFO 주제를 생성하고, 주제에 대한 Amazon SQS FIFO 대기열을 구독하고, Amazon SNS 주제에 메시지를 게시합니다.  

```
    " Creates a FIFO topic. "
    DATA lt_tpc_attributes TYPE /aws1/cl_snstopicattrsmap_w=>tt_topicattributesmap.
    DATA ls_tpc_attributes TYPE /aws1/cl_snstopicattrsmap_w=>ts_topicattributesmap_maprow.
    ls_tpc_attributes-key = 'FifoTopic'.
    ls_tpc_attributes-value = NEW /aws1/cl_snstopicattrsmap_w( iv_value = 'true' ).
    INSERT ls_tpc_attributes INTO TABLE lt_tpc_attributes.

    TRY.
        DATA(lo_create_result) = lo_sns->createtopic(
               iv_name = iv_topic_name
               it_attributes = lt_tpc_attributes ).
        DATA(lv_topic_arn) = lo_create_result->get_topicarn( ).
        ov_topic_arn = lv_topic_arn.                                    " ov_topic_arn is returned for testing purposes. "
        MESSAGE 'FIFO topic created' TYPE 'I'.
      CATCH /aws1/cx_snstopiclimitexcdex.
        MESSAGE 'Unable to create more topics. You have reached the maximum number of topics allowed.' TYPE 'E'.
    ENDTRY.

    " Subscribes an endpoint to an Amazon Simple Notification Service (Amazon SNS) topic. "
    " Only Amazon Simple Queue Service (Amazon SQS) FIFO queues can be subscribed to an SNS FIFO topic. "
    TRY.
        DATA(lo_subscribe_result) = lo_sns->subscribe(
               iv_topicarn = lv_topic_arn
               iv_protocol = 'sqs'
               iv_endpoint = iv_queue_arn ).
        DATA(lv_subscription_arn) = lo_subscribe_result->get_subscriptionarn( ).
        ov_subscription_arn = lv_subscription_arn.                      " ov_subscription_arn is returned for testing purposes. "
        MESSAGE 'SQS queue was subscribed to SNS topic.' TYPE 'I'.
      CATCH /aws1/cx_snsnotfoundexception.
        MESSAGE 'Topic does not exist.' TYPE 'E'.
      CATCH /aws1/cx_snssubscriptionlmte00.
        MESSAGE 'Unable to create subscriptions. You have reached the maximum number of subscriptions allowed.' TYPE 'E'.
    ENDTRY.

    " Publish message to SNS topic. "
    TRY.
        DATA lt_msg_attributes TYPE /aws1/cl_snsmessageattrvalue=>tt_messageattributemap.
        DATA ls_msg_attributes TYPE /aws1/cl_snsmessageattrvalue=>ts_messageattributemap_maprow.
        ls_msg_attributes-key = 'Importance'.
        ls_msg_attributes-value = NEW /aws1/cl_snsmessageattrvalue( iv_datatype = 'String'
                                                                    iv_stringvalue = 'High' ).
        INSERT ls_msg_attributes INTO TABLE lt_msg_attributes.

        DATA(lo_result) = lo_sns->publish(
             iv_topicarn = lv_topic_arn
             iv_message = 'The price of your mobile plan has been increased from $19 to $23'
             iv_subject = 'Changes to mobile plan'
             iv_messagegroupid = 'Update-2'
             iv_messagededuplicationid = 'Update-2.1'
             it_messageattributes = lt_msg_attributes ).
        ov_message_id = lo_result->get_messageid( ).                    " ov_message_id is returned for testing purposes. "
        MESSAGE 'Message was published to SNS topic.' TYPE 'I'.
      CATCH /aws1/cx_snsnotfoundexception.
        MESSAGE 'Topic does not exist.' TYPE 'E'.
    ENDTRY.
```
+ API 세부 정보는 *AWS SDK for SAP ABAP API 참조*의 다음 주제를 참조하세요.
  + [CreateTopic](https://docs.aws.amazon.com/sdk-for-sap-abap/v1/api/latest/index.html)
  + [게시](https://docs.aws.amazon.com/sdk-for-sap-abap/v1/api/latest/index.html)
  + [Subscribe](https://docs.aws.amazon.com/sdk-for-sap-abap/v1/api/latest/index.html)

------

### FIFO 구독의 메시지 받기
<a name="fifo-receiving-messages"></a>

이제 구독한 애플리케이션 3개에서 가격 업데이트를 받을 수 있습니다. 에 표시된 것처럼 각 소비자 애플리케이션의 진입[Amazon SNS FIFO 주제 예제 사용 사례](fifo-example-use-case.md)점은 해당 AWS Lambda 함수가 자동으로 폴링할 수 있는 Amazon SQS 대기열입니다. Amazon SQS 대기열이 Lambda 함수의 이벤트 소스인 경우 Lambda는 메시지를 효율적으로 소비하기 위해 필요에 따라 폴러의 플릿을 확장합니다.

자세한 내용은 *AWS Lambda 개발자 안내서*의 [ Amazon SQS AWS Lambda 에서 사용을](https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html) 참조하세요. 사용자 고유의 대기열 폴러 작성에 대한 자세한 내용은 *Amazon Simple Queue Service 개발자 안내서*의 [Amazon SQS 표준 및 FIFO 대기열에 대한 권장 사항](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-best-practices.html#sqs-standard-fifo-queue-best-practices) 및 *Amazon Simple Queue Service API 참조*의 [ReceiveMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html)를 참조하세요.

## 사용 AWS CloudFormation
<a name="fifo-topic-cfn"></a>

CloudFormation 를 사용하면 템플릿 파일을 사용하여 AWS 리소스 모음을 단일 단위로 생성하고 구성할 수 있습니다. 이 섹션은 다음을 생성하는 예제 템플릿을 보여줍니다.
+ 가격 업데이트를 배포하는 Amazon SNS FIFO 주제
+ 도매 및 소매 애플리케이션에 이러한 업데이트를 제공하는 Amazon SQS FIFO 대기열
+ 비즈니스 인텔리전스(BI) 목적으로 쿼리할 수 있는 레코드를 저장하는 분석 애플리케이션에 대한 Amazon SQS 표준 대기열
+ 세 대기열을 주제에 연결하는 Amazon SNS FIFO 구독
+ 구독자 애플리케이션이 필요한 가격 업데이트만 수신하도록 지정하는 [필터 정책](sns-subscription-filter-policies.md)

**참고**  
주제에 메시지를 게시하여 이 코드 샘플을 테스트하는 경우 `business` 속성을 사용하여 메시지를 게시해야 합니다. 속성 값에 대해 `retail` 또는 `wholesale` 중 하나를 지정합니다. 그렇지 않으면 메시지가 필터링되어 구독된 대기열에 배달되지 않습니다.

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Resources": {
    "PriceUpdatesTopic": {
      "Type": "AWS::SNS::Topic",
      "Properties": {
        "TopicName": "PriceUpdatesTopic.fifo",
        "FifoTopic": true,
        "ContentBasedDeduplication": false,
        "ArchivePolicy": {
        "MessageRetentionPeriod": "30"
        }
      }
    },
    "WholesaleQueue": {
      "Type": "AWS::SQS::Queue",
      "Properties": {
        "QueueName": "WholesaleQueue.fifo",
        "FifoQueue": true,
        "ContentBasedDeduplication": false
      }
    },
    "RetailQueue": {
      "Type": "AWS::SQS::Queue",
      "Properties": {
        "QueueName": "RetailQueue.fifo",
        "FifoQueue": true,
        "ContentBasedDeduplication": false
      }
    },
    "AnalyticsQueue": {
      "Type": "AWS::SQS::Queue",
      "Properties": {
        "QueueName": "AnalyticsQueue"
      }
    },
    "WholesaleSubscription": {
      "Type": "AWS::SNS::Subscription",
      "Properties": {
        "TopicArn": {
          "Ref": "PriceUpdatesTopic"
        },
        "Endpoint": {
          "Fn::GetAtt": [
            "WholesaleQueue",
            "Arn"
          ]
        },
        "Protocol": "sqs",
        "RawMessageDelivery": "false",
        "FilterPolicyScope": "MessageBody",
        "FilterPolicy": {
          "business": [
            "wholesale"
          ]
        }
      }
    },
    "RetailSubscription": {
      "Type": "AWS::SNS::Subscription",
      "Properties": {
        "TopicArn": {
          "Ref": "PriceUpdatesTopic"
        },
        "Endpoint": {
          "Fn::GetAtt": [
            "RetailQueue",
            "Arn"
          ]
        },
        "Protocol": "sqs",
        "RawMessageDelivery": "false",
        "FilterPolicyScope": "MessageBody",
        "FilterPolicy": {
          "business": [
            "retail"
          ]
        }
      }
    },
    "AnalyticsSubscription": {
      "Type": "AWS::SNS::Subscription",
      "Properties": {
        "TopicArn": {
          "Ref": "PriceUpdatesTopic"
        },
        "Endpoint": {
          "Fn::GetAtt": [
            "AnalyticsQueue",
            "Arn"
          ]
        },
        "Protocol": "sqs",
        "RawMessageDelivery": "false"
      }
    },
    "SalesQueuesPolicy": {
      "Type": "AWS::SQS::QueuePolicy",
      "Properties": {
        "PolicyDocument": {
          "Statement": [
            {
              "Effect": "Allow",
              "Principal": {
                "Service": "sns.amazonaws.com"
              },
              "Action": [
                "sqs:SendMessage"
              ],
              "Resource": "*",
              "Condition": {
                "ArnEquals": {
                  "aws:SourceArn": {
                    "Ref": "PriceUpdatesTopic"
                  }
                }
              }
            }
          ]
        },
        "Queues": [
          {
            "Ref": "WholesaleQueue"
          },
          {
            "Ref": "RetailQueue"
          },
          {
            "Ref": "AnalyticsQueue"
          }
        ]
      }
    }
  }
}
```

 CloudFormation 템플릿을 사용하여 AWS 리소스를 배포하는 방법에 대한 자세한 내용은 *CloudFormation 사용 설명서*의 [시작하기](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/GettingStarted.Walkthrough.html)를 참조하세요.