SQSのメトリクスから標準キューが空であることを確認してみた

2022.01.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

データアナリティクス事業本部の鈴木です。

SQSの標準キューが空かどうか確かめたいことがありました。 キューが空かどうかは、ほとんどの場合はロングポーリングを使用して判断するので十分そうですが、下記のデベロッパーガイドにより厳密に確認する方法の記載があったので試してみました。

キューが空であることの確認 - Amazon Simple Queue Service

準備

検証に使用する標準キューを作成しておきます。 CloudFormationのテンプレートを作成したので、それを使ってキューを作成しました。

標準キューの名前はcm-nayuts-sample-sqsなどとしておきました。

AWSTemplateFormatVersion: 2010-09-09
Description: SQS Standard Queue

Parameters:
  QueueName:
    Description: Name for queue
    Type: String

Resources:
  Queue:
    Type: AWS::SQS::Queue
    Properties:
      QueueName: !Sub ${QueueName}

やってみる

1. コンソールから確認する

SQSのコンソールから作成したキューを開きます。モニタリングタブからモニタリング間隔の設定を行います。

キューの画面を開く

今回はデベロッパーガイドに従い、1分間隔の自動更新にしました。

モニタリング間隔の設定

このうち、以下の項目を確認する必要があります。

  • 表示されたメッセージのおよその数
  • 表示されないメッセージのおよその数
  • 遅延メッセージのおよその数

※デベロッパーガイドと少し訳が異なっていたので、適宜読み替えました。

確認する項目

メッセージを送受信画面から、メッセージを2件送信後、しばらくおいてメッセージを削除し、表示の変化を確認してみました。

表示されたメッセージのおよその数が2件に上がった後、削除すると0件に下がってそのままであることが確認できました。特に遅延メッセージを入れたりメッセージを不可視の状態にはしなかったので、ほかの2つは0件のままです。表示されたメッセージのおよその数が0件になった後、3つのモニタリング項目が数分間0件のままなので、この標準キューは空であると言えます。

モニタリング結果の変化

2. AWS CLIやSDKから確認する

AWS CLIから確認することも可能です。この場合、数分の間、一定の間隔で属性のメトリックを確認します。今回はある時点でのメトリックの取得方法をみてみます。

以下の3つの属性のメトリックを確認します。

  • ApproximateNumberOfMessagesVisible
  • ApproximateNumberOfMessagesNotVisible
  • ApproximateNumberOfMessagesDelayed

結果が分かりやすいよう、メトリックを取得する前に、キューに2件メッセージを入れておきました。

キューの状態

まずAWS CLIのget-queue-attributesコマンドでメトリックを取得します。

aws sqs get-queue-attributes --queue-url https://sqs.ap-northeast-1.amazonaws.com/123456789012/cm-nayuts-sample-sqs \
                             --attribute-names ApproximateNumberOfMessages ApproximateNumberOfMessagesNotVisible ApproximateNumberOfMessagesDelayed
# {
#     "Attributes": {
#         "ApproximateNumberOfMessages": "2",
#         "ApproximateNumberOfMessagesNotVisible": "0",
#         "ApproximateNumberOfMessagesDelayed": "0"
#     }
# }

また、Python SDKからは以下のようになります。

get_queue_attributes.py

import boto3

client = boto3.client("sqs")
sqs_url = "https://sqs.ap-northeast-1.amazonaws.com/123456789012/cm-nayuts-sample-sqs"

response = client.get_queue_attributes(
            QueueUrl=sqs_url,
            AttributeNames=["ApproximateNumberOfMessages", 
                            "ApproximateNumberOfMessagesNotVisible",
                            "ApproximateNumberOfMessagesDelayed"])
print(response["Attributes"])
python get_queue_attributes.py
# {'ApproximateNumberOfMessages': '2', 
# 'ApproximateNumberOfMessagesNotVisible': '0', 
# 'ApproximateNumberOfMessagesDelayed': '0'}

3. CloudWatchメトリクスから確認する

CloudWatchメトリクスからも先ほど確認したメトリックを見ることができます。こちらも複数のデータ点で、連続して値が0件であることを確認する必要があります。

CloudWatchメトリクスのすべてのメトリクス > SQS > キューメトリクスで、作成したキューのメトリクスを確認します。

CloudWatchから確認するメトリクス

確認が必要な3つのメトリックを選択し、グラフ上で複数の0件が連続して記録されていることを確認します。

可視化したメトリクス

最後に

今回はデベロッパーガイドに記載のある3つの方法で、SQSの標準キューが空か確認してみました。

標準キューはSQSの分散アーキテクチャからおおよその結果を使ってキューの状態を確認することになるため、いくつかの属性のメトリックを連続した時間点で確認する工夫が必要になりました。参考になりましたら幸いです。

参考