はじめに
今日はAWS SQS(以降SQS)について調べました。
こういうサービスのことは何となく大まかにはわかっていても、知っていること同士がうまく紐付かなかったリ必要な時に出てこなかったりするので、とにかく実機で手を動かしながら各項目について調べまくるようにしようと思っています。
(最近仕事でVPCピアリングを設定する機会がありましたが、すごく基本的なことがわかっていないなと思ったりするなど)
SQSキュー作成
手順はマネジメントコンソールでポチポチやるだけなので、設定する項目についてまとめます。
必須パラメータ
設定値1 : キューのタイプ
コンソールの表示順としては前後しますが、キューの名前を決める前にSQSタイプを指定します。
ざっくり言うと費用面で標準キュー、性能面でFIFOキューが勝りますが、それぞれ用途が異なります。
標準キュー
- 無制限のスループット
- 配信順序は保証されない(ベストエフォート型)
- メッセージは最低1回配信する(複数回配信されることもある)
スループットが高く(FIFOキューに比べて)安価であるため、配信順序を気にする必要がないバッチ処理などに向いています。
FIFOキュー
- スループットは1秒あたり300件のメッセージ処理をサポート(AWSにリクエストを上げれば最大3000件)
- 配信順序は厳密に保証
- メッセージは必ず1回のみ配信
標準キューがベストエフォートとしている部分が全て解決されているため、オンラインショップやストリーミングなどの入力順や処理回数が重要な処理に向いています。
設定値2 : キュー名
キューの名前は基本的に自由ですが、FIFOキューを選択した場合は末尾に「.fifo」を付ける必要があります。
(逆に、標準キューの場合は「.fifo」を付けてはいけない)
キュー属性
ここからはオプションです。
※「」はマネジメントコンソール上での説明文
設定値1 : 可視性タイムアウト
「キューから受信したメッセージが他の受信コンポーネントから見えない時間の長さ(秒)です。」
これを読んで正直何のこっちゃ、と思ったので少し突っ込んで調べました。
どうもSQSではメッセージを配信した後もキューから自動的には削除されず、そのまま残り続ける仕様となっているようです。
(非同期という特性上、相手が正しく受信できたかを確認できないため)
そのため、メッセージを受信して処理が終わった後明示的にメッセージの削除を行う必要があります。
この「受信~処理~削除」を行っている間にキューに残っているメッセージを他のコンシューマー(受信者)が処理されてしまうのを避けるのが可視性タイムアウトであり、これを設定することで指定した時間メッセージを受信・処理されないようになります。
可視性タイムアウトが過ぎれば、当然他のコンシューマーでも受信が可能になります(一回のみの配信が保証されているFIFOキューの場合は除く)
デフォルト値は30秒で、0秒~12時間の中で設定可能です。
チュートリアル: Amazon SQS キューからのメッセージの受信および削除
設定値2 : メッセージ保持期間
「メッセージが削除されない場合に Amazon SQS で保持される時間です。」
キューにある古いメッセージを削除するハウスキーピング的な処理の期限を決める設定値。
デフォルトは4日で、1分~14日の中で設定可能です。
設定値3 : 最大メッセージサイズ
「Amazon SQS が受け付ける最大メッセージサイズ(バイト)です。」
SQSが受付可能なメッセージの最大サイズを指定する設定値。
デフォルトは256KBで、1B~256KBの中で設定可能です。
設定値4 : 配信遅延
「このキューに追加されたすべてのメッセージの初回配信の遅延時間です。」
新しいメッセージをコンシューマーに配信するのを指定した時間待たせる(遅延させる)ことができるもの。
(コンシューマー側のアプリケーションがメッセージの処理に追加の時間を必要とする場合に使える、とのことらしいです。自分は開発者ではないのであまりピンと来ていませんが)
コンシューマーでメッセージが受信できなくなる、という点で機能的には可視性タイムアウトに似ていて、こちらはキューに入った直後に発動するものになります。
デフォルトは0秒(遅延無し)で、0秒~15分の中で設定可能です。
設定値5 : メッセージ受信待機時間
「ロングポーリング受信呼び出しが空の応答を返すまでに、メッセージが利用可能になるまで待機する最大時間です。」
平たく言うと、コンシューマーがキューにメッセージを取得しに行った際、受信可能なメッセージが無い場合に待機する時間です。
待機時間を設定しない場合をショートポーリング、設定する場合をロングポーリングと説明されます。
SQSでは受信可能なメッセージが無い場合に空のレスポンスを返します。
(アプリケーション側で空のレスポンスを処理できれば)これでも問題ないのですが、SQSはリクエスト課金のため、空のレスポンスを受け取る回数が多いと料金が上がってしまうため、費用削減に役立ちます。
ちなみにロングポーリンとショートポーリングの違いはAWS認定資格(SOAやDVAなど)でも出題されます。
デフォルトは0秒で、0秒~20秒の中で設定可能です。
ちなみにロングポーリングを設定していても必ずその時間待機するというわけではなく、新しいメッセージが来たらその時点でコンシューマーにレスポンスを戻します(あくまでメッセージが来るまで待つ時間のようです)
設定値6 : コンテンツに基づく重複排除(※FIFOキュー限定)
「メッセージの本文 (メッセージの属性ではない) のSHA-256 ハッシュを使用してコンテンツベースのメッセージ重複排除 ID を生成します。」
FIFOキューの場合、メッセージの配信は1回のみであるため、同じメッセージの配信リクエストがあった場合は削除される仕様になっています。
その重複メッセージかどうかの判定を行っているのがこのメッセージ重複排除IDで、それを自動で生成するかどうかの設定値です。
【新機能】Amazon SQSにFIFOが追加されました!(重複削除/単一実行/順序取得に対応)
デッドレターキュー設定
デッドレターキューとは、正常に処理できないメッセージを格納するキューです。
サーバー側の暗号化 (SSE) の設定
メッセージの暗号化に使う暗号キーを指定する項目で、デフォルトではAWS KMSで管理されているキーを使いますが、顧客側の暗号キー(カスタマーキー)を使うことも可能です。
CLIコマンド
CLIで作成する場合は下記になります。
### 標準キュー ###
> aws sqs create-queue --queue-name make-test-queue
### FIFOキュー ###
> aws sqs create-queue --queue-name make-test-queue.fifo --attributes "FifoQueue"=True
### 作成確認 ###
> aws sqs list-queues --output table
------------------------------------------------------------------------------------
| ListQueues |
+----------------------------------------------------------------------------------+
|| QueueUrls ||
|+--------------------------------------------------------------------------------+|
|| https://ap-northeast-1.queue.amazonaws.com/XXXXXXXXXXXX/make-test-queue ||
|| https://ap-northeast-1.queue.amazonaws.com/XXXXXXXXXXXX/make-test-queue.fifo ||
|+--------------------------------------------------------------------------------+|
※参考URL
https://docs.aws.amazon.com/cli/latest/reference/sqs/create-queue.html