AWSのメッセージングサービス SQS、SNS、EventBridge の主な機能比較

# はじめに

本記事は、AWSの**メッセージングサービス**である [SQS](https://aws.amazon.com/jp/sqs/)、[SNS](https://aws.amazon.com/jp/sns/)、[EventBridge](https://aws.amazon.com/jp/eventbridge) の主な機能を簡単に比較してまとめたものになります。（2022/04/16現在）
サービスを選定する時の気づきになれば幸いです。

各サービスの機能の詳細は、AWS Black Belt Online Seminarの資料を一読してから、詳細はAWSのドキュメントを読むようにすると頭に入りやすいです。

***SQS***
[AWS Black Belt Online Seminar SQS](https://d1.awsstatic.com/webinars/jp/pdf/services/20190717_AWS-BlackBelt_AmazonSQS.pdf)
[Amazon Simple Queue Service のドキュメント](https://docs.aws.amazon.com/sqs/)

***SNS***
[AWS Black Belt Online Seminar SNS](https://d1.awsstatic.com/webinars/jp/pdf/services/20190604_AWS-Blackbelt_AmazonSNS.pdf)
[Amazon Simple Notification Service のドキュメント](https://docs.aws.amazon.com/ja_jp/sns/)

***EventBridge***
[AWS Black Belt Online Seminar EventBridge](https://d1.awsstatic.com/webinars/jp/pdf/services/20200122_BlackBelt_EventBridge.pdf)
[Amazon EventBridge のドキュメント](https://docs.aws.amazon.com/ja_jp/eventbridge/)

## メッセージングのモデル
|SQS|SNS|EventBridge|
|:---|:---|:---|
|キュー|トピック|バス|

### SQS
![キュー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283246/f9118b9c-1f45-9e1a-b7de-c3f9b271ea41.png)
>引用：[「疎結合」を実現する メッセージングサービスの選択と利用](https://pages.awscloud.com/rs/112-TZM-766/images/DevAx_connect_season1_Day2_MessagingService_%E9%85%8D%E5%B8%83.pdf)

### SNS
![トピック.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283246/4cab0595-3ccc-39f1-ee7b-d25075189911.png)
>引用：[「疎結合」を実現する メッセージングサービスの選択と利用](https://pages.awscloud.com/rs/112-TZM-766/images/DevAx_connect_season1_Day2_MessagingService_%E9%85%8D%E5%B8%83.pdf)

### EventBridge
![バス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283246/05eebba4-7dc9-7021-7327-8c4964d082c5.png)
>引用：[「疎結合」を実現する メッセージングサービスの選択と利用](https://pages.awscloud.com/rs/112-TZM-766/images/DevAx_connect_season1_Day2_MessagingService_%E9%85%8D%E5%B8%83.pdf)

## サービスのビルディングブロック

### SQS
![SQS_ARC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283246/891a5348-30db-7504-5195-7f4374d5d1dd.png)
> 引用: [仕組み](https://aws.amazon.com/jp/sqs/faqs/)

### SNS
![SNS_ARC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283246/927ab251-6a60-e297-f91e-219ebbb77a92.png)
> 引用: [仕組み](https://aws.amazon.com/jp/sns/)

### EventBridge
![EventBridge_ARC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283246/2a158015-1f99-e2ae-1a10-351a5c9c429f.png)
> 引用: [仕組み](https://aws.amazon.com/jp/eventbridge/)

## メッセージ処理のタイミング
|SQS|SNS|EventBridge|
|:---|:---|:---|
|Point to Point方式|Pub/Sub方式|Pub/Sub方式|

![処理タイミング.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283246/7aae4ba5-a650-2a86-e857-5365e9b7aff5.png)
>[引用：Amazon Simple Queue Service サービスカットシリーズ](https://d1.awsstatic.com/webinars/jp/pdf/services/20190717_AWS-BlackBelt_AmazonSQS.pdf)

## スケジュール実行
|SQS|SNS|EventBridge|
|:---|:---|:---|
|できない|できない|<font color="Red">できる</font>|

### EventBridge
[スケジュールに従って実行する Amazon EventBridge ルールの作成](https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-create-rule-schedule.html)

## 配信先のサービス

### SQS
[Amazon SQS での Lambda の使用](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-sqs.html)
> Lambda

### SNS
[Application-to-Application(A2A)配信先](https://docs.aws.amazon.com/ja_jp/sns/latest/dg/sns-event-destinations.html#sns-event-destinations-a2a)
> Kinesis Data Firehose
> Lambda
> SQS
>HTTP/S

[Application-to-Person(A2P) 配信先](https://docs.aws.amazon.com/ja_jp/sns/latest/dg/sns-event-destinations.html#sns-event-destinations-a2p)
> Email / SMS 通知
> Mobile Push 通知
> AWS Chatbot

### EventBridge
[Amazon EventBridge ターゲット](https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-targets.html)
> Lambda関数
> EC2インスタンス
> Kinesis Data Streams のストリーム
> Kinesis Data Firehose の配信ストリーム
> CloudWatch Logs ロググループ
> ECS タスク
> Systems Manager Run Command
> Systems Manager Automation
> AWS Batch ジョブ
> AWS Step Functionsステートマシン
> AWS CodePipelineのパイプライン
> AWS CodeBuildプロジェクト
> Inspector の評価テンプレート
> SNS トピック
> SQS キュー
> EC2 CreateSnapshot API call
> EC2 RebootInstances API call
> EC2 StopInstances API call
> EC2 TerminateInstances API call
> 別のAWS アカウントのイベントバス

## SaaS アプリケーションとの連携
|SQS|SNS|EventBridge|
|:---|:---|:---|
|できない|できない|<font color="Red">できる</font>|

### EventBridge
[サポートされる SaaS パートナー統合](https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-saas.html#eb-supported-integrations)
> Amazon EventBridge では、サポートされている SaaS プラットフォームからデータが取り込まれ、AWS のサービスターゲットにルーティングされます。

さらに、送信先にAPI を使用できる
[API 送信先](https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-api-destinations.html)
> API 送信先を使用すると、REST API コールを使用して、AWS サービス、統合された 
> SaaS (Software-as-a-Service) アプリケーション、および AWS 外のアプリケーションの間でイベントをルーティングできます。

![SaaS_Integration.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283246/17c3ad8f-cf05-badc-d622-b24cd37e475c.png)
> 引用：[Using API destinations with Amazon EventBridge](https://aws.amazon.com/jp/blogs/compute/using-api-destinations-with-amazon-eventbridge/)

## メッセージの配信保証
|SQS(標準)|SQS(FIFO)|SNS(標準)|SNS(FIFO)|EventBridge|
|:---|:---|:---|:---|:---|
|at-least-once|exactly-once|at-least-once|exactly-once|at-least-once|

### at-least-once
***メッセージ*** が少なくとも一つの受信側へ配信される。
（2回以上の***メッセージ***が配信される可能性がある。）

### exactly-once
***メッセージ*** は重複せず必ず一回だけ配信される。

## メッセージの順序保証
|SQS(標準)|SQS(FIFO)|SNS(標準)|SNS(FIFO)|EventBridge|
|:---|:---|:---|:---|:---|
|保証なし|<font color="Red">保証あり</font>|保証なし|<font color="Red">保証あり</font>|保証なし|

### SQS(FIFO)
[Amazon SQS FIFO (先入れ先出し) キュー](https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html)

### SNS(FIFO)
[メッセージの順序付けと重複除外 (FIFO トピック)](https://docs.aws.amazon.com/ja_jp/sns/latest/dg/sns-fifo-topics.html)

## メッセージの永続化
|SQS|SNS|EventBridge|
|:---|:---|:---|
|できる|できる|できる|

### SQS
デフォルトは4日間。保存期間は1分間 〜 14日間の範囲内で設定可能。

### SNS
[Amazon SNS メッセージのアーカイブと分析](https://docs.aws.amazon.com/ja_jp/sns/latest/dg/message-archiving-and-analytics.html)
> 引用：
>Amazon SNS は、Amazon Kinesis Data Firehose を通じてメッセージのアーカイブと分析を提供します。

***ユースケース***
![SNS_MSG_永続化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283246/23652349-a214-faa0-50b4-2f979a21882b.png)
>引用：[メッセージのアーカイブと分析のユースケースの例](https://docs.aws.amazon.com/ja_jp/sns/latest/dg/firehose-example-use-case.html)

### EventBridge
[Amazon EventBridge のアーカイブと再生](https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-archive.html)

## メッセージのバッチ処理
|SQS|SNS|EventBridge|
|:---|:---|:---|
|<font color="Red">最大 10件</font>|<font color="Red">最大 10件</font>|できない|

### SQS
[Amazon SQS バッチアクション](https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-batch-api-actions.html)

### SNS
[Amazon SNS メッセージのバッチ処理](https://docs.aws.amazon.com/ja_jp/sns/latest/dg/sns-batch-api-actions.html)

## メッセージのフィルタリング
|SQS|SNS|EventBridge|
|:---|:---|:---|
|できない|<font color="Red">できる</font>|<font color="Red">できる</font>|

### SNS
[Amazon SNS サブスクリプションフィルターポリシー](https://docs.aws.amazon.com/ja_jp/sns/latest/dg/sns-subscription-filter-policies.html)
![SNS_Subscription_Filter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283246/c6f86114-753c-fd2e-9e32-b80a28c581b6.png)
> 引用：[Amazon Simple Notification Service (SNS) サービスカットシリーズ](https://d1.awsstatic.com/webinars/jp/pdf/services/20190604_AWS-Blackbelt_AmazonSNS.pdf)

### EventBridge
[Amazon EventBridge イベントパターンでのコンテンツのフィルタリング](https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-event-patterns-content-based-filtering.html)
![コンテンツベースのフィルタリング.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283246/4d455afa-b401-56a4-742d-af158166e08a.png)
> 引用：[Amazon EventBridge サービスカットシリーズ](https://d1.awsstatic.com/webinars/jp/pdf/services/20200122_BlackBelt_EventBridge.pdf)

## メッセージの加工
|SQS|SNS|EventBridge|
|:---|:---|:---|
|できない|できない|<font color="Red">できる</font>|

### EventBridge
[Amazon EventBridge ターゲット入力の変換](https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-transform-target-input.html)

# さいごに
AWSの公式では、**メッセージングサービス**のデジションツリーとなるようなものをみつけることができなかったのですが、下記の記事が、サービスを選定する時に参考になるかと思います。

https://betterdev.blog/decision-tree-sqs-sns-kinesis-eventbridge/