Amazon SQSの学習(AWS認定Developer associate対策)

## はじめに

* AWS認定ソリューションアーキテクト-アソシエイト、AWS認定SysOpsアドミニストレータ-アソシエイトの資格取得を行いましたので、アソシエイトレベルの資格のラストとしてAWS認定デベロッパー-アソシエイトにチャレンジしたいと思います 
* AWS認定デベロッパーではソリューションアーキテクトやSysOpsアドミニストレータと比べて、実際のサービスを使ってシステムを構築する知識が必要となります
* そのため、試験対象範囲に含まれるAWSサービスについて少し掘り下げて学習していこうと思います
* 各サービスの基本や用語などのポイントを個人メモとして残していきます

## Amazon SQSとは

* フルマネージド型のメッセージキューサービス
  * 可用性やスケーラビリティはAWS側の責任で管理されている
* 正式名称は「Amazon Simple Queue Service」

* 汎用的なWebAPIを提供しており、AWS SDKでサポートされている任意のプログラミング言語からアクセスできる
* 分散型アプリケーションによって使用されるメッセージキューサービスで、ポーリングモデルを通じてメッセージを交換し、コンポーネントの送受信を切り離すために使用することができる

## Amazon SNSやAmazon MQとの違い

### Amazon SNS

* フルマネージド型のPub/Subメッセージングサービス
* アプリケーションは「プッシュ」メカニズムを使用して、複数のサブスクライバーにタイミングが重要なメッセージを送信することができる
* 更新を定期的に確認したり、「ポーリング」したりする必要性がない
* トピックを作成しサブスクライバーにサブスクライブさせる

### Amazon MQ

* Apache ActiveMQ向けのフルマネージド型メッセージブローカーサービス
* 業界標準APIや、JMS、NMS、AMQP、STOMP、MQTT、WebSocket などのメッセージング用のプロトコルを使用している
* 業界標準形式を使用しているアプリケーションの場合、AWS移行の際にメッセージングコードを書き換える必要はほぼない

## SQSのキューの種類

### スタンダード(標準)キュー

* 無制限のスループット
  * 無制限の数の 1 秒あたりのトランザクション(TPS)をサポート
* １回以上の配信
  * １回は確実に送信されるが、複数回送信されることもある
* ベストエフォート型の順序付け
  * メッセージが送信されたときと異なる順序で配信されることがある

### FIFOキュー

* 高スループット
  * バッチ処理・・・1 秒あたり最大 3,000 件のメッセージをサポート(上限緩和申請可能)
    * １回のアクションで最大１０通のメッセージを操作する
    * 送信ごとの課金のやめコスト削減が可能
    * メッセージサイズに制約あり(256KB)
  * その他アクション・・・ 1 秒あたり最大 300 件のメッセージをサポート
* １回だけの配信
  * メッセージは必ず１度しか送信されない
  * メッセージの重複は発生しない
  * メッセージ重複排除IDの設定、あるいはコンテンツベースの重複排除を有効にする
* 順序保証
  * 先入れ先出し配信のため、メッセージが送信または受信された順序が厳密に保持される
* グループ性
  * 単一キュー内に複数の順序付けされたメッセージグループが存在でるメッセージグループがサポートされている（メッセージグループIDを使用する）



## メッセージのライフサイクル

1. プロデューサー(アプリ１)がメッセージを送信する
   1. Amazon SQSサーバー全体にまたがって冗長的に保管される
2. コンシューマー(アプリ２)がメッセージを取得する
   1. メッセージは削除されない
   2. 可視性タイムアウトの間は取得されることはない
3. コンシューマー(アプリ２)が処理を終了し、メッセージを削除する
   1. 可視性タイムアウトが切れた場合は別のコンシューマが再取得可能

* 最長メッセージ保持期間を超えてキューに残っているメッセージは自動的に削除される
* デフォルトのメッセージ保持期間は 4 日間(６０秒から１４日間までの範囲を設定可能)

## SQSの詳細

### 分散キュー

* SQSのメッセージは、複数のSQSサーバーに冗長的に分散して管理される
* 同じメッセージが複数のサーバーにまたがって保管されているため、障害時の損失を防ぐ

### メッセージ識別キー

* すべてのメッセージには、メッセージがメッセージキューに配信される際に Amazon SQS から返される、グローバルに一意の ID(メッセージID) が割り当てられる
* このIDは、メッセージキューの特定のメッセージの受信状況を追跡するのに利用できる
* メッセージを削除する際には、メッセージ受信時に受け取る受信ハンドルが必要

### 可視性タイムアウト

* この時間内は他のコンシューマーによる同じメッセージの受信と処理が防止される
* メッセージのデフォルトの可視性タイムアウトは 30 秒（最小値は 0 秒、最大値は 12 時間）

### デッドレターキュー

* 正常に処理できないメッセージの送信先として使用することができるキュー
* 問題のあるメッセージを分離して処理が成功しない理由を調べることができる
* FIFO キューのデッドレターキューはFIFO キュー、スタンダード キューのデッドレターキューはスタンダード キューである必要がある
* キューと同じリージョンに存在するデッドレターキューしか指定できない

### ポイズンピルメッセージ

* 受信されたが処理できないメッセージのこと
* デッドレターキューを設定しておくことにより、キュー内にポイズンピルメッセージが発生する可能性を抑える

### ショートポーリング

- ポーリングスタイルのデフォルト
- サーバーのサブセットだけに対して (重み付けされてランダムに分散される) クエリを実行する
- そのサーバーのメッセージのみが返される(他サーバーにメッセージがあったとしても空のレスポンス)
- ポーリングされたメッセージキューが空であっても直ちに応答を返す

### ロングポーリング

* メッセージが取得出来るまで待つ時間を設定することができる
* すべてのSQSサーバーにクエリを実行して、偽の空のレスポンスを排除する
* デフォルトはショートポーリングとなり、取得できない場合は空のレスポンスが返る
* 空のレスポンスが返されることを抑制することで、課金抑制・呼び出し元CPUの負荷軽減が可能

### メッセージ属性

* メッセージに最大１０個の構造化メタデータ (タイムスタンプ、地理空間データ、署名、識別子など) を含めることができる
* メッセージ属性はオプションとなり、メッセージ本文とは別となるが、２５６KBのメッセージサイズ制限は考慮する必要がある
* Name/Type/Valueで構造化されている

### コスト配分タグ

* キューにキューの目的、所有者、または環境を識別するメタデータタグを追加することができる
* コスト配分タグを使用してキューごとのコストを管理することができる

### 遅延キュー

* キューへの新しいメッセージの配信を数秒延期させることができる
* 遅延期間の間コンシューマーに表示されなくなる
* キュー全体に適用される
* スタンダード キューの場合は、キューごとの遅延設定を変更しても既にキューにあるメッセージの遅延には影響しない
* FIFO キューの場合は、キューごとの遅延設定を変更すると、既にキューにあるメッセージの遅延に影響する
* 遅延キューの場合はメッセージが最初にキューに追加されたときに非表示になるのに対し、可視性タイムアウトの場合は、メッセージがキューから処理された後のみ非表示になる

### メッセージタイマー

* キューに追加するメッセージの初期非表示期間を指定できる
* デフォルトの 最小非表示期間は０秒、最大は １５ 分
* FIFO キューは個別のメッセージタイマーをサポートしていない
* キュー全体でなく個々のメッセージに適用される
* 個々のメッセージのメッセージタイマー設定は、遅延キューよりも優先される

### CloudWatchによるモニタリング

* SQS用のCloudWatchメトリクスは、自動的に収集され、5 分おきに CloudWatch にプッシュされる
* SQSメトリクスの料金は発生しない。これらは Amazon SQSサービスの一部として提供される
* 詳細モニタリング(1分単位)はサポートされていない

### 暗号化

* サーバー側暗号化 (SSE) を使用すると、暗号化されたキューで機密データを送信できる
* SSEでは、AWS Key Management Service (AWS KMS) で管理されているキーを使用する
* 暗号化されるのはメッセージ本文のみで、メタデータは暗号化されない

### Amazon VPCエンドポイント

* SQSではVPCエンドポイントを利用したプライベートアクセスが可能