

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon SNS FIFO トピックを使用したメッセージの順序付けと重複排除戦略
<a name="sns-fifo-topics"></a>

このトピックでは、Amazon SNS FIFO (先入れ先出し) トピックの特徴と機能、およびそれらを [Amazon SQS FIFO キュー](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html)と統合する方法について説明します。これらのサービスをあわせて使用して、データ整合性を必要とするアプリケーションに不可欠な厳密なメッセージの順序付けと重複排除を実現する方法について説明します。このコンテンツでは、Amazon SNS FIFO トピックが役立つ特定のユースケースについて説明し、メッセージの順序と一意性が重要なシナリオに関するインサイトを提供します。

また、メッセージの順序付け、メッセージのグループ化、それらによるメッセージ配信への影響の技術的な詳細についても説明します。メッセージ重複排除のトピックでは、重複メッセージを防ぎ、各メッセージが 1 回のみ処理されるようにするメカニズムについて説明します。さらに、メッセージングシステムの整合性と信頼性の確保のために重要となる、メッセージフィルタリング、セキュリティ、耐久性についても説明します。このコンテンツには、メッセージアーカイブとリプレイに関する情報も含まれており、メッセージ履歴を管理するための戦略を提供します。これらの機能を独自のアプリケーションに実装するために役立つ実用的なコード例も提供されており、Amazon SNS FIFO トピックと Amazon SQS FIFO キューの統合を実際に体験できます。

# Amazon SNS の高スループット FIFO トピック
<a name="fifo-high-throughput"></a>

Amazon SNS の高スループット FIFO トピックは、厳密なメッセージ順序を維持しながら、高いメッセージスループットを効率的に管理することで、多数のメッセージを処理するアプリケーションの信頼性とスケーラビリティを確保します。このソリューションは、高スループットおよび順序付けられたメッセージ配信の両方を必要とするシナリオに最適です。高スループット FIFO トピックを使用してメッセージのスループットを向上させるには、メッセージグループの数を増やすことを推奨します。高スループットのメッセージクォータの詳細については、「*Amazon Web Services 全般のリファレンス*」の「[Amazon SNS Service Quotas](https://docs.aws.amazon.com/general/latest/gr/sns.html)」を参照してください。

## Amazon SNS FIFO トピックに関する高スループットのユースケース
<a name="fifo-topic-use-cases"></a>

以下のユースケースでは、高スループット FIFO トピックの多様な応用例を紹介し、さまざまな業界やシナリオでの効果を示します。
+ **リアルタイムデータ処理:** イベント処理やテレメトリデータインジェストなど、リアルタイムデータストリームを扱うアプリケーションは、高スループット FIFO トピックを利用することで、メッセージの継続的な流入を処理しながら、メッセージの順序を維持して正確な分析を行うことができます。
+ **e コマース注文処理:** 顧客取引の順序を維持することが重要な e コマースプラットフォームでは、高スループット 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 Service Quotas](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 の値を内部ハッシュ関数への入力値として使用します。ハッシュ関数からの出力値は、メッセージを処理するパーティションを決定します。その際、1 つ以上のメッセージグループ ID が、特定のパーティションで処理される場合があります。

**注記**  
Amazon SNS は、パーティションの数に関係なく、FIFO トピックのパーティション間で項目を均一に分散するように最適化されています。 では、多数の個別の値を持つメッセージグループ IDs を使用する AWS ことをお勧めします。

## 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 Service Quotas](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 SNS FIFO トピックにメッセージを発行しており、1 つ以上の Amazon SQS 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 キューを使用して構築した e コマースプラットフォームを示してします。プラットフォームは 4 つのサーバーレスアプリケーションで構成されています。
+ インベントリ管理者は、価格管理アプリケーションを使用して、在庫の各品目の価格を設定します。この会社では、為替変動や市場需要、販売戦略の推移などにより、商品価格が変動する可能性があります。価格管理アプリケーションは、AWS Lambda 関数を使用して、価格が変更されるたびに Amazon SNS FIFO トピックに価格の更新を発行します。
+ 卸売アプリケーションは、自動車修理工場や自動車メーカーがその自動車部品を一括で購入できるウェブサイトのバックエンドを提供します。価格変更通知を取得する場合、卸売アプリケーションは 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 キューを使用した e コマースプラットフォームの例です。価格管理、卸売、小売、分析などのさまざまなサーバーレスアプリケーションが、これらのサービスを活用して、順序付けられたメッセージ配信と重複排除を実行しています。この設定により、卸売アプリケーションと小売アプリケーションは正しい順序で価格更新を受け取ることができ、分析アプリケーションは厳密なメッセージ順序付けを必要とせずにビジネスインテリジェンス用のデータを集約できます。\]](http://docs.aws.amazon.com/ja_jp/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 キューにメッセージを 1 回だけ配信します。Amazon SQS FIFO キューをサブスクライブすると、キューのコンシューマーは、メッセージがキューに配信されるのとまったく同じ順序で、メッセージを重複することなく受信します。ただし、 SQS 標準キューをサブスクライブすると、キューのコンシューマーはメッセージを順序どおりではなく、さらに重複して受信する可能性があります。これにより、サブスクライバーをパブリッシャーからさらに切り離すことができ、次の図に示すように、「[Amazon SNS FIFO トピックのユースケース例](fifo-example-use-case.md)」に基づいて、サブスクライバーはメッセージの使用とコストの最適化をより柔軟に行うことができます。

![\[Amazon SNS FIFO (先入れ先出し) トピックのメッセージ配信システムの例。メッセージが一貫して厳密な順序で Amazon SQS FIFO キューに配信されることを示しています。これは、メッセージが順序どおりに到達しなかったり複数回到達したりする可能性がある、Amazon SQS 標準キューの動作とは対照的です。この例では、分析関数、卸売アプリケーション、小売アプリケーションという 3 つの異なるサブスクライバータイプを示し、それぞれが、サブスクライブするキューのタイプに応じて、厳密な順序またはベストエフォートな順序でメッセージを受信する方法を示しています。\]](http://docs.aws.amazon.com/ja_jp/sns/latest/dg/images/sns-fifo-ordering-1.png)


サブスクライバーの暗黙の順序付けはないことに注意してください。次の例は、メッセージ **m1** が卸売サブスクライバー、小売サブスクライバー、分析サブスクライバーの順に配信されることを示しています。メッセージ **m2** は、小売サブスクライバー、卸売サブスクライバー、分析サブスクライバーの順に配信されます。2 つのメッセージは異なる順序でサブスクライバーに配信されますが、メッセージの順序は Amazon SQS FIFO サブスクライバーごとに保持されます。各サブスクライバーは、他のサブスクライバーとは切り離して認識されます。

![\[Amazon SNS FIFO トピックと、Amazon SQS FIFO や標準キューなどのさまざまなタイプのサブスクライバーが、メッセージの順序付けと配信を処理する方法の例。メッセージがトピックに発行されて、さまざまなタイプのキューに配信される場合に、FIFO キューでは順序付けられた配信が確保され、標準キューではベストエフォートな順序となることを示しています。この設定は、さまざまなコンポーネントで正確な処理を行うために特定の順序で高い信頼性でメッセージが配信される必要のある e コマースプラットフォームのシナリオをサポートします。\]](http://docs.aws.amazon.com/ja_jp/sns/latest/dg/images/sns-fifo-ordering-2.png)


Amazon SQS キューサブスクライバーが到達不能になると、同期が失われる可能性があります。例えば、卸売アプリケーションキュー所有者が誤って [Amazon SQS キューポリシー](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-using-identity-based-policies.html)を変更し、Amazon SNS サービスプリンシパルがメッセージをキューに配信できなくなったとします。この場合、卸売キューへの価格更新配信は失敗し、小売キューと分析キューへの配信は成功するため、サブスクライバーは同期しなくなります。卸売アプリケーションキュー所有者がキューポリシーを修正すると、Amazon SNS はサブスクライブされたキューへのメッセージ配信を再開します。対応するサブスクリプションに[デッドレターキュー](sns-dead-letter-queues.md)が設定されていない限り、誤設定されたキューを対象とするトピックに発行されたメッセージはすべてドロップされます。

![\[Amazon SNS FIFO セットアップでのメッセージ配信の動作の例。ここでは Amazon SQS キューを介してさまざまなサブスクライバータイプ (卸売、小売、分析) にメッセージが発行されています。キューポリシーの設定ミスによる、さまざまなサブスクライバーキューにわたるメッセージ配信の同期に与える影響が示されています。この例では、ポリシーエラーのために卸売サブスクライバーへのメッセージ配信は失敗しますが、小売サブスクライバーおよび分析サブスクライバーへの配信は正常に続行されています。データ配信の同期を維持するために正しいキュー設定が重要であることを示しています。このシナリオでは、FIFO トピックの機能によって通常の状況下では順序付けられて確実に 1 回配信されることが示され、さらに設定エラーによる結果が示されています。\]](http://docs.aws.amazon.com/ja_jp/sns/latest/dg/images/sns-fifo-ordering-3.png)


複数のアプリケーション (または同じアプリケーション内の複数のスレッド) が、SNS FIFO トピックにメッセージを並行して発行できます。これを行うと、メッセージシーケンスを Amazon SNS サービスに効果的に委任します。確立されたメッセージのシーケンスを決定するには、シーケンス番号を確認します。

シーケンス番号は、Amazon SNS が各メッセージに割り当てる、連続しない大きな数字です。シーケンス番号の長さは 128 ビットで、[メッセージグループ](fifo-message-grouping.md)ごとに増え続けます。シーケンス番号は、メッセージ本文の一部として、サブスクライブされた Amazon SQS キューに渡されます。ただし、[raw メッセージ配信](sns-large-payload-raw-message-delivery.md)を有効にすると、Amazon SQS キューに配信されるメッセージには、シーケンス番号やその他の Amazon SNS メッセージメタデータは含まれません。

![\[複数の Lambda 関数が Amazon SNS FIFO (先入れ先出し) トピックにメッセージを発行し、さらにこれらのメッセージを Amazon SQS FIFO キューに配信して、メッセージ処理の厳密な順序を維持する例。この設定は、メッセージがアプリケーションのさまざまなコンポーネント間で送信された順序で正確に処理されるようにするために使用され、シーケンス番号はグループ内の各メッセージの順序を示しています。このタイプの設定は、オペレーションとメッセージの順序を厳密に維持して一貫性を確保する必要があるアプリケーションにとって非常に重要です。\]](http://docs.aws.amazon.com/ja_jp/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>

同じグループに属するメッセージは、グループに対する厳密な順序で 1 つずつ処理されます。

メッセージを Amazon SNS FIFO トピックに発行する際、メッセージのグループ ID を設定します。グループ ID は、メッセージが特定のメッセージグループに属することを指定する必須トークンです。SNS FIFO トピックは、グループ ID をサブスクライブされた Amazon SQS FIFO キューに渡します。SNS FIFO トピックまたは SQS FIFO キュー内のグループ ID の数に制限はありません。メッセージグループ ID は Amazon SQS 標準キューには渡されません。

メッセージグループとサブスクリプションの間にアフィニティはありません。したがって、任意のメッセージグループに発行されたメッセージは、サブスクリプションに添付されたフィルターポリシーに従って、すべてのサブスクライブ済みキューに配信されます。詳細については、「[FIFO トピックの Amazon SNS メッセージ配信](fifo-message-delivery.md)」および「[SNS 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** メッセージグループは互いに独立しているため、メッセージの順序付けには関係がありません。

![\[さまざまな およびメッセージグループ IDs を含む Amazon SNS FIFO トピックシナリオでのメッセージの順序 AWS のサービス 付けと重複排除の仕組みの例。Lambda 関数から Amazon SNS FIFO トピックを介してさまざまなタイプの Amazon SQS キュー (FIFO および標準) に送信されるメッセージのフローを示しています。FIFO キューでは厳密な順序が維持されますが、標準キューでは順序が維持されない場合があります。この設定は、e コマースプラットフォームでの価格更新など、アプリケーションでのメッセージの順序が重要である場合に利用されます。さまざまなコンシューマーサービスにわたって各メッセージグループが独立して順序を維持しています。\]](http://docs.aws.amazon.com/ja_jp/sns/latest/dg/images/sns-fifo-grouping.png)


## メッセージグループ ID 別のデータ配布によりパフォーマンスを改善
<a name="fifo-message-grouping-message-group-ids"></a>

配信スループットを最適化するために、Amazon SNS FIFO トピックは異なるメッセージグループからのメッセージを並列配信しますが、メッセージの順序は各メッセージグループ内で厳密に維持されます。個々のメッセージグループごとに、1 秒あたり最大 300 件のメッセージを配信できます。したがって、1 つのトピックで高いスループットを実現するには、多数の異なるメッセージグループ ID を使用してください。Amazon SNS FIFO トピックは、多様なメッセージグループのセットを利用することで、メッセージを多数の並列パーティションに自動的に配布します。

**注記**  
Amazon SNS FIFO トピックは、グループ数に関係なく、メッセージグループ IDs 間でメッセージを均一に分散するように最適化されています。パフォーマンスを最適化するために、多数の個別のメッセージグループ IDs を使用する AWS ことをお勧めします。

スループットが高い Amazon SNS FIFO トピックに公開し、1 つ以上の Amazon SQS 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)を組み合わせると、オペレーションやイベントの順序が重要であるときや重複が許容されないときにアプリケーション間のメッセージングを強化できます。

ベストエフォート型の順序付けと少なくとも 1 回の配信を許容するワークロードでは、[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 トピックでは、E メールアドレス、モバイルアプリケーション、テキストメッセージング (SMS) の電話番号、HTTP (S) エンドポイントなど、顧客マネージドエンドポイントにメッセージを配信することはできません。これらのエンドポイントタイプは、厳密なメッセージの順序を維持することは保証されません。顧客マネージドエンドポイントを SNS FIFO トピックにサブスクライブしようとすると、エラーが発生します。

SNS FIFO トピックは、標準トピックと同じメッセージフィルター処理機能をサポートします。詳細については、「[SNS 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/)」の投稿を参照してください。

# SNS 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** 内のキーの 1 つは `wholesale` の値を持つ `business` です。メッセージ **m3** 内の 1 つのキーは `["wholesale,retail"]` の値を持つ `business` です。したがって、**m1** および **m3** の両方がフィルターポリシーの基準に一致し、両方のメッセージが卸売キューに配信されます。
+ 小売キューについては、フィルターポリシー `{"business":["retail"]}` は、`business` という名前のキーと値のセットの `retail` を持つすべてのメッセージと一致します。図では、メッセージ **m2** 内のキーの 1 つは `retail` の値を持つ `business` です。メッセージ **m3** 内の 1 つのキーは、`["wholesale,retail"]` の値を持つ `business` です。したがって、**m2** および **m3** の両方がフィルターポリシーの基準に一致し、両方のメッセージが小売キューに配信されます。
+ 分析キューでは、Amazon Athena ですべてのレコードを受信したいため、フィルタポリシーは適用しません。

![\[Amazon SNS FIFO トピックがフィルターポリシーを使用して、メッセージコンテンツに基づいてメッセージをさまざまな Amazon SQS キューにルーティングする方法の例。メッセージ m1 と m3 は「ビジネス」キーが「卸売」に設定されているため卸売キューに配信され、メッセージ m2 は「小売」が設定されているため小売キューにルーティングされます。このように、ターゲットを絞ったメッセージ配信を実行し、各サブスクライバー関数が関連するメッセージのみを受信して、処理効率とデータの関連性を最適化できます。\]](http://docs.aws.amazon.com/ja_jp/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 キューでは、メッセージの重複排除がサポートされます。これは、以下の条件が満たされている限り、メッセージの配信と処理を 1 回だけ行います。
+ サブスクライブされた 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/ja_jp/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 キューを作成することも、既存のトピックやキューに対して暗号化を有効にすることもできます。
+ メッセージ本文のみが暗号化されます。メッセージ属性、リソースメタデータ、リソースメトリクスは暗号化されません。

**注記**  
既存の 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 トピックに古いサブスクリプションのメタデータがあると、クライアント側のエラーが発生します。クライアント側のエラーの一般的な 2 つの原因は、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 SQS デッドレターキュー (DLQ) を各 Amazon SNS FIFO トピックサブスクリプションおよびサブスクライブされた各 Amazon SQS キューに割り当てることができます。これにより、価格更新の損失から会社を保護します。

![\[自動車部品価格管理システムで、メッセージの信頼性を確保するため、デッドレターキュー (DLQ) を Amazon SNS FIFO トピックおよび Amazon SQS キューと統合した例。卸売、小売、分析のための各 Amazon SNS FIFO サブスクリプションが、対応する Amazon SQS FIFO または標準キューとペアリングされ、それぞれに各タイプの DLQ が備えられ、処理の失敗によるメッセージ損失を防いでいる設定を示しています。\]](http://docs.aws.amazon.com/ja_jp/sns/latest/dg/images/sns-fifo-dlq.png)


Amazon SNS サブスクリプションに関連するデッドレターキューは、サブスクライブキューと同じタイプの Amazon SQS キューである必要があります。例えば、Amazon SQS FIFO キューの Amazon SNS FIFO サブスクリプションでは、デッドレターキューとして Amazon SQS FIFO キューが必要です。同様に、Amazon SQS 標準キューの Amazon SNS FIFO サブスクリプションには、デッドレターキューとして Amazon SQS 標準キューが必要です。詳細については、[Amazon SNS デッドレターキュー](sns-dead-letter-queues.md) と『*AWS コンピューティングブログ*』の「[Amazon SNS、Amazon SQS 用の DLQ を使用した耐久性のあるサーバーレスアプリケーションの設計、AWS Lambda](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 日間直接保存して、必要に応じてサブスクライバーにリプレイできます。メッセージのアーカイブとリプレイは、失われたメッセージを復旧し、状態をレプリケートして、リージョンやシステム間でアプリケーションを同期するために不可欠です。

この機能は API AWS 、SDK CloudFormation、および からアクセスできます AWS マネジメントコンソール。

**主なユースケース**
+ **メッセージの復旧** – ダウンストリームアプリケーションの障害により失われたメッセージを、サブスクライバーのエンドポイントにリプレイして復旧できます。
+ **状態のレプリケーション** – 特定のタイムスタンプからメッセージをリプレイし、既存のシステムの状態を新しい環境にレプリケートします。
+ **エラーの修正** – 停止中に失われたメッセージを再送信して、すべてのイベントが正しく処理されるようにします。

### メッセージのアーカイブとリプレイのコンポーネント
<a name="message-archiving-and-replay-components"></a>

Amazon SNS FIFO トピックのメッセージのアーカイブとリプレイを管理します。これには、保持期間の設定、CloudWatch を使用したアーカイブ済みメッセージのモニタリング、サブスクリプション属性によるリプレイの開始、リプレイの変更と開始に必要なアクセス許可の理解が含まれます。

**メッセージのアーカイブ**
+ トピック所有者はアーカイブ機能を有効にして、メッセージの保持期間 (最大 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 つのコピーをアーカイブできます。トピックのメッセージアーカイブポリシーを有効にすることで、発行されたメッセージをトピック内に保存できます。これにより、そのトピックにリンクされているすべてのサブスクリプションのメッセージアーカイブが有効になります。メッセージのアーカイブ期間は、最短で 1 日、最長で 365 日です。

アーカイブポリシーを設定すると、追加料金がかかります。料金については、「[Amazon SNS 料金](https://aws.amazon.com/sns/pricing/)」を参照してください。

## を使用してメッセージアーカイブポリシーを作成する AWS マネジメントコンソール
<a name="message-archiving-and-replay-topic-console"></a>

 AWS マネジメントコンソールを使用する新しいメッセージアーカイブポリシーを作成するには、このオプションを使用します。

1. [Amazon SNS コンソール](https://console.aws.amazon.com/sns/home)にサインインします。

1. トピックを選択するか、新しいトピックを作成できます。トピックの作成の詳細については、「[Amazon SNS トピックを作成する](sns-create-topic.md)」を参照してください。
**注記**  
Amazon SNS メッセージのアーカイブとリプレイは、Application-to-Application (A2A) FIFO トピックでのみ使用できます。

1. **[トピックの編集]** ページで **[アーカイブポリシー]** セクションを展開します。

1. **アーカイブポリシー機能**を有効にし、トピック内でメッセージを**保存する日数**を入力します。

1. **[Save changes]** (変更の保存) をクリックします。

**メッセージアーカイブトピックポリシーを表示、編集、非アクティブ化するには**
+ **トピックの詳細**ページでは、設定されている日数などのアーカイブポリシーのステータスが**リテンションポリシー**に表示されます。**[アーカイブポリシー]** タブを選択すると、以下のメッセージアーカイブの情報が表示されます。
  + **ステータス** — アーカイブポリシーが適用されると、アーカイブとリプレイのステータスは **[有効]** と表示されます。アーカイブポリシーが空の JSON オブジェクトに設定されている場合は、アーカイブとリプレイのステータスは **[無効]** と表示されます。
  + **メッセージ保持期間** — 指定されたメッセージ保持日数。
  + **アーカイブ開始日** — サブスクライバーがメッセージを再生できる日付。
  + **JSON のプレビュー** — アーカイブポリシーの JSON プレビュー。
+ (オプション) アーカイブポリシーを**編集**するには、トピックの [概要] ページに移動して **[編集]** を選択します。
+ (オプション) アーカイブポリシーを**無効化**するには、トピックの [概要] ページに移動して **[編集]** を選択します。**アーカイブポリシー**を無効化し、**[変更の保存]** を選択します。
+ (オプション) アーカイブポリシーを含むトピックを**削除**するには、前に説明したように、アーカイブポリシーを無効化する必要があります。
**重要**  
メッセージが誤って削除されるのを防ぐため、メッセージアーカイブポリシーが有効なトピックは削除できません。トピックを削除する前に、トピックのメッセージアーカイブポリシーを無効化する必要があります。メッセージアーカイブポリシーを無効にすると、Amazon SNS ではアーカイブされたすべてのメッセージが削除されます。トピックを削除すると、サブスクリプションは削除され、転送中のメッセージが配信されない場合があります。

## API を使用するメッセージアーカイブポリシーを作成する
<a name="message-archiving-and-replay-topic-api"></a>

API を使用するメッセージアーカイブポリシーを作成するには、属性 `ArchivePolicy` をトピックに追加する必要があります。`ArchivePolicy` は、API アクション `CreateTopic` と `SetTopicAttributes` を使用して設定できます。 `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 *

次のコード例は、Amazon SNS トピック用にそのトピックに発行されたすべてのメッセージを 30 日間保持するように `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>

暗号化されたトピックからのメッセージのリプレイをサブスクライバーが開始する前に、次の手順を完了する必要があります。過去のメッセージがリプレイされるため、Amazon SNS では、アーカイブ内のメッセージの暗号化に使用された KMS キーへの `Decrypt` アクセス権がプロビジョニングされている必要があります。

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 マネジメントコンソール
<a name="message-archiving-and-replay-replaying-console"></a>

 AWS マネジメントコンソールを使用する新しいリプレイポリシーを作成するには、このオプションを使用します。

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. [**Start replay**] (再生を開始) を選択します。

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"
}
```

メッセージがリプレイされたことを確認するため、リプレイされた各メッセージに boolean 属性 `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 *

次のコード例は、Amazon SNS FIFO トピックのアーカイブからのメッセージについて、2023 年 10 月 1 日に 2 時間の時間ウィンドウで再配信するようにサブスクリプションで `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>

`ReplayPolicy` を Amazon SNS サブスクリプションに適用する場合、`EndingPoint` の値はオプションです。`EndingPoint` が指定されていない場合、リプレイは指定された `StartingPoint` から開始され、新しく発行されたメッセージの処理を含め、現在の時刻になるまで続行されます。現在の時刻にキャッチアップすると、サブスクリプションは通常のサブスクリプションとして機能し、発行された新しいメッセージを受信します。

`EndingPoint` が指定されている場合、サービスは `StartingPoint` から `EndingPoint` までのメッセージをリプレイして停止します。**このアクションによってサブスクリプションは事実上一時停止します。**サブスクリプションが一時停止している間、新しく発行されたメッセージは、サブスクライブされたエンドポイントに配信されません。

メッセージ配信を再開するには、`EndingPoint` を指定せずに新しい `ReplayPolicy` を適用し、`StartingPoint`をメッセージの受信を継続する時点に設定します。例えば、以前のリプレイが終了したところからサブスクリプションを再開するには、新しい `StartingPoint` を以前に提供された `EndingPoint` に設定します。

## リプレイされたメッセージをフィルタリングする
<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>

以下のコード例を使用して、[自動車部品価格管理のユースケース例](fifo-example-use-case.md)を Amazon SNS FIFO トピック、および 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 標準キュー
+ 3 つのキューをトピックに接続する Amazon SNS FIFO サブスクリプション

この例では、サブスクリプションで[フィルターポリシー](sns-subscription-filter-policies.md)を設定します。トピックにメッセージを発行することで、サンプルをテストする場合は、メッセージは必ず `business` 属性で発行してください。`retail` または `wholesale` のいずれかの属性値を指定します。それ以外を指定すると、メッセージは除外され、サブスクライブされたキューに配信されません。詳細については、「[SNS 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)での設定と実行の方法を確認してください。
この例では  
+ 1 つの Amazon SNS FIFO トピック、2 つの Amazon SQS FIFO キュー、および 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)
  + [Publish](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)での設定と実行の方法を確認してください。
FIFO トピックを作成し、そのトピックに Amazon SQS FIFO キューと標準キューをサブスクライブして、メッセージを Amazon SNS トピックに発行します。  

```
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)
  + [Publish](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**  
 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)
  + [Publish](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)、各コンシューマーアプリケーションのエントリポイントは Amazon SQS キューであり、対応する AWS Lambda 関数が自動的にポーリングできます。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 リソースのコレクションを 1 つのユニットとしてまとめて作成および設定できます。このセクションでは、以下を作成するサンプルテンプレートを使用します。
+ 価格更新を配信する Amazon SNS FIFO のトピック
+ これらの更新を卸売アプリケーションと小売アプリケーションに提供する Amazon SQS FIFO キュー
+ ビジネスインテリジェンス (BI) のクエリが可能なレコードを格納する分析アプリケーション用の Amazon SQS 標準キュー
+ 3 つのキューをトピックに接続する 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](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/GettingStarted.Walkthrough.html)」を参照してください。