
Amazon SQS のメッセージをコンソールで表示しただけで、デッドレターキューに移りました。原因を教えてください
困っていること
Amazon Simple Queue Service(Amazon SQS)のキューに入っているメッセージの中身を確認しようとして、マネジメントコンソールの「メッセージを送受信」画面で「メッセージをポーリング」を何度か押しました。
その後、アプリケーションが処理する前に、メッセージがデッドレターキュー(DLQ)に移っていました。
表示しただけで DLQ に移った理由を知りたいです。
どう対応すればいいの?
コンソールでメッセージを表示(ポーリング)すると、その表示も 1 回の受信として、受信回数に数えられます。受信回数が最大受信数(maxReceiveCount)に達した後、次の受信のときに、メッセージは DLQ に移ります。表示しただけでも、アプリケーションが受信したのと同じように数えられるということです。
次の対策を行ってください。
- 本番のキューでは、コンソールでメッセージをポーリングしません。表示の動きを試したいときは、検証用のキューで試します。
- 件数だけを知りたいときは、メッセージを受信せずに、キューの属性で確かめます。コンソールなら、キューの一覧の「利用可能なメッセージ」「処理中のメッセージ」です。API なら、GetQueueAttributes で
ApproximateNumberOfMessagesとApproximateNumberOfMessagesNotVisibleを取得します。属性の取得では、受信回数は増えません。 - 本番のキューでどうしても中身を表示したいときは、表示で増える分を見込んで、最大受信数を大きくしておきます。キューの詳細ページの「デッドレターキュー」タブの「編集」から変えられます。
- DLQ に移ってしまったメッセージは、DLQ の再処理(リドライブ)で、元のキューに戻せます(今回は試していません)。
表示が受信回数に数えられる理由
SQS は、コンソールでの表示を、再処理ポリシー(最大受信数)の受信回数として数えます。
Amazon SQS は、コンソールでのメッセージの表示回数を、対応するキューの再処理ポリシーに従ってカウントします。このため、コンソールでのメッセージの表示回数が、対応するキューの再処理ポリシーに指定された回数に達すると、メッセージは対応するキューのデッドレターキューに移動されます。
この動作を調整するには、次のいずれかを実行します。
対応するキューの再処理ポリシーで、[最大受信数] 設定の値を大きくします。
対応するキューのメッセージをコンソールに表示しないようにします。
「処理中のメッセージ」では、表示した回数は分からない
API の receive-message で受信したメッセージは、可視性タイムアウト(デフォルトは 30 秒)の間、ほかの受信には返らなくなり、「処理中のメッセージ」に数えられます。一方、コンソールで取得したメッセージは、表示されたままになります。
Amazon SQS コンソールを使用して取得したメッセージが再取得のために表示されたままになります。
そのため、「処理中のメッセージ」の数を見ても、コンソールで何回表示したかは分かりません。表示した後に処理中の数が増えていなくても、受信回数は増えている場合があるので、注意してください。
確認してみた
最大受信数を 2 にしたキュー(東京リージョン)に、メッセージを 1 通入れて、AWS CLI の receive-message を 3 回実行しました。最大受信数は、キューの詳細ページの「デッドレターキュー」タブで確かめました。

| 受信 | 実行した時点 | 可視性タイムアウト | 受信回数 | そのほか |
|---|---|---|---|---|
| 1 回目 | メッセージを入れた後 | 120 秒 | 1 | 直後の GetQueueAttributes で、利用可能 0・処理中 1 |
| 2 回目 | 可視性タイムアウトが過ぎた後 | 5 秒 | 2 | — |
| 3 回目 | その 5 秒が過ぎた後 | — | メッセージが返らない | DLQ の件数が 1 |
受信回数(ApproximateReceiveCount)は 1、2 と増え、最大受信数の 2 に達した後の 3 回目の受信では、メッセージは返らずに DLQ に移りました。途中で属性を取得していますが、受信回数は 1 から 2 へ 1 つだけ増えていて、属性の取得では増えていません。

API で受信した直後は、コンソールのキューの一覧でも、「処理中のメッセージ」が 1 になりました。次の画面は、同じ設定のキューを作り直し、1 回受信した直後のものです。










