AWS CLI + SQS の send/receive 操作

9月 27, 2022AWS,SQS

AWS CLI + SQS

概要

  • aws cli を使用して、SQSキューにメッセージを送受信する確認を行った際の備忘録です。
  • Amazon SQS(Amazon Simple Queue Service) は、フルマネージド型のメッセージキューイングサービスです。キューイングはいわゆる待ち行列のことです。
  • キューイングを使用することで、AWS上の分散アプリケーションが疎結合で構成できます。アプリケーションがこれから処理する内容を一度キューに溜めることができ、順次任意のタイミング(非同期)に取り出して処理ができます。

 

キューの作成

  • スタンダードのキューを作成します。
  • キューを作成後、キューが使用できるようになるまで少なくとも 1 秒以上待つ必要があります。
niikawa@niikawa1:~$ QUEUE_NAME=niikawa-test-queue
niikawa@niikawa1:~$ aws sqs create-queue --queue-name ${QUEUE_NAME} --region ap-northeast-1
{
    "QueueUrl": "https://ap-northeast-1.queue.amazonaws.com/111111111111/niikawa-test-queue"
}
  • FIFO(先入れ先出し)のキューを作成します。キューの名前に .fifo を付けます。
niikawa@niikawa1:~$ aws sqs create-queue --queue-name ${QUEUE_NAME}.fifo --attributes FifoQueue=true --region ap-northeast-1
{
    "QueueUrl": "https://ap-northeast-1.queue.amazonaws.com/111111111111/niikawa-test-queue.fifo"
}

 

キューの一覧

  • queue-name-prefixオプションを指定すると、指定した文字列で始まる名前のキューのみが返されます。
niikawa@niikawa1:~$ aws sqs list-queues --queue-name-prefix ${QUEUE_NAME} --region ap-northeast-1
{
    "QueueUrls": [
        "https://ap-northeast-1.queue.amazonaws.com/111111111111/niikawa-test-queue",
        "https://ap-northeast-1.queue.amazonaws.com/111111111111/niikawa-test-queue.fifo"
    ]
}

 

キューの属性を確認する

  • get-queue-attributesオプションを指定すると、キューのすべてあるいは一部の属性を返します。
  • ApproximateNumberOfMessages の値から、メッセージの処理待ちがいくつあるか確認できます。
niikawa@niikawa1:~$ QUEUE_URL="https://ap-northeast-1.queue.amazonaws.com/111111111111/niikawa-test-queue"
niikawa@niikawa1:~$ aws sqs get-queue-attributes --queue-url ${QUEUE_URL} --attribute-names All --region ap-northeast-1
{
    "Attributes": {
        "QueueArn": "arn:aws:sqs:ap-northeast-1:111111111111:niikawa-test-queue",
        "ApproximateNumberOfMessages": "0",
        "ApproximateNumberOfMessagesNotVisible": "0",
        "ApproximateNumberOfMessagesDelayed": "0",
        "CreatedTimestamp": "1664203053",
        "LastModifiedTimestamp": "1664203053",
        "VisibilityTimeout": "30",
        "MaximumMessageSize": "262144",
        "MessageRetentionPeriod": "345600",
        "DelaySeconds": "0",
        "ReceiveMessageWaitTimeSeconds": "0",
        "SqsManagedSseEnabled": "true"
    }
}
niikawa@niikawa1:~$ aws sqs get-queue-attributes --queue-url ${QUEUE_URL} --attribute-names ApproximateNumberOfMessages --region ap-northeast-1
{
    "Attributes": {
        "ApproximateNumberOfMessages": "0"
    }
}

 

メッセージの送信

  • 作成したスタンダードのキューにメッセージを送信します。ApproximateNumberOfMessages の値が 1に変わりました。
niikawa@niikawa1:~$ aws sqs send-message --queue-url ${QUEUE_URL} --message-body "SQS Test1" --region ap-northeast-1
{
    "MD5OfMessageBody": "7f280e3e98acc75e845d722277584fac",
    "MessageId": "b90f5a71-a098-49a5-8b28-b34ddbae56b0"
}
niikawa@niikawa1:~$ aws sqs get-queue-attributes --queue-url ${QUEUE_URL} --attribute-names ApproximateNumberOfMessages --region ap-northeast-1
{
    "Attributes": {
        "ApproximateNumberOfMessages": "1"
    }
}

 

  • 次は、作成したFIFOのキューにメッセージを送信します。FIFO の場合、MessageGroupId オプションの指定は必須です。同じMessageGroupId の場合にFIFOとして処理され、異なる場合は順序の保証はありません。
    • MessageGroupId は128文字まで、英数字および記号(!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~)が使用可。
  • FIFO の場合、MessageDeduplicationId オプションの指定が可能です。送信されたメッセージの重複排除に使用可能です。同じメッセージMessageDeduplicationId (重複除外 ID)で送信されたメッセージは正常に受信しますが、5 分間の重複除外間隔においては配信されません。
    • MessageDeduplicationId (重複除外 ID)は、個別のMessageGroupId ではなく、キュー全体に適用されます。
    • MessageDeduplicationId は128文字まで、英数字および記号(!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~)が使用可。
niikawa@niikawa1:~$ GROUP_ID=group1
niikawa@niikawa1:~$ DEDUP_ID=dedup1
niikawa@niikawa1:~$ aws sqs send-message --queue-url ${QUEUE_URL}.fifo --message-group-id ${GROUP_ID} --message-deduplication-id ${DEDUP_ID} --message-body "SQS Test2" --region ap-northeast-1
{
    "MD5OfMessageBody": "ad4955e0fd7d49e133c9442e50b61c45",
    "MessageId": "37aa65d0-6468-42a5-a86d-71301611e8bb",
    "SequenceNumber": "18872780435158256128"
}
niikawa@niikawa1:~$ aws sqs get-queue-attributes --queue-url ${QUEUE_URL}.fifo --attribute-names ApproximateNumberOfMessages --region ap-northeast-1
{
    "Attributes": {
        "ApproximateNumberOfMessages": "1"
    }
}

 

メッセージの受信

  • 指定されたキューから 1 つまたは複数 (最大 10) のメッセージを取得します。
niikawa@niikawa1:~$ aws sqs receive-message --queue-url ${QUEUE_URL} --region ap-northeast-1
{
    "Messages": [
        {
            "MessageId": "b90f5a71-a098-49a5-8b28-b34ddbae56b0",
            "ReceiptHandle": "AQEBQcMw6bDnZVuBlfA33c5a7Lgh+mscuEv7i2BpoxpBH8HZF6VGffU9BnYf4jggFR5sBIKqPdXloJq0yxg+oqYBtPQa6ZybAhls4RldbIMP5QxVwT+oGiuXerDiEW6Jk1dthr4a2KKSiw6xf78jO9WfLp8j8jfE66UFhCseR0mrsglcmEex89dMKXm2ASHL07Ok4qztg2kVfLZgp862aQJiztFxORy9hPPPH6V6Lr/r7pKf/y1BeDpjb/SHaxuw7Uxzu7bzLjItcgYxFPBhMihiLQOavg3jAvqMTTg8BUtKPH9vG1uleQxzHm0DD7A/3Z1xNHw9nNVjqM5KQx42iAfh1/auDrsAVvQ863J2q1B4xZw6pCUuKXNPUh8sd4ZgSRa16Ph6wGGWG/hBVuF7i8M5ZK1IiDGHrzeG5J8IdMUj8HE=",
            "MD5OfBody": "7f280e3e98acc75e845d722277584fac",
            "Body": "SQS Test1"
        }
    ]
}

 

niikawa@niikawa1:~$ aws sqs receive-message --queue-url ${QUEUE_URL}.fifo --region ap-northeast-1
{
    "Messages": [
        {
            "MessageId": "37aa65d0-6468-42a5-a86d-71301611e8bb",
            "ReceiptHandle": "AQEB1CQMCu6V8nC/Gs7BJmhfRAjWwYW/EESkRSHBLNiYnPIAW8EyiN2vFh8VIiUfZ1/G2MYF7LWI5Qj+rcN7L7KvH6KAW5FA7fEyRrShr01+nECcqQxxZe3wQMv3M3GhZIgNL6QFWuVXH8+doZBaZDOxJGmIv6YK250xdAJ5RpYfj2DZVf0f5I8WunrjDdoHXbux32FahHwJirmdt8s2X0K+Y9KmBYfD2ulp84+jlHrffNtJcPgkDPBPPeUQvU/rGuWS9AAS7q2/fghwXF8+Za4T2r+HvYiZAGA6daEv7zcDZ28P/RmBa/zuysdXDw3CLV7u",
            "MD5OfBody": "ad4955e0fd7d49e133c9442e50b61c45",
            "Body": "SQS Test2"
        }
    ]
}

 

可視性タイムアウト(VisibilityTimeout)

  • コンシューマーからメッセージが受信された直後は、メッセージはキューに保留されたままです。他のコンシューマーが同じメッセージを再び処理しないようにSQSには可視性タイムアウトが設定されています。
  • VisibilityTimeout に指定された秒数内では、他のコンシューマーによる同じメッセージの受信と処理が防止されます。デフォルトの可視性タイムアウトは30秒です。
niikawa@niikawa1:~$ aws sqs send-message --queue-url ${QUEUE_URL} --message-body "SQS Test1" --region ap-northeast-1
{
    "MD5OfMessageBody": "7f280e3e98acc75e845d722277584fac",
    "MessageId": "9f6f4b1a-536e-4248-aa53-7f1fb7c9e12a"
}
niikawa@niikawa1:~$ aws sqs get-queue-attributes --queue-url ${QUEUE_URL} --attribute-names ApproximateNumberOfMessages --region ap-northeast-1
{
    "Attributes": {
        "ApproximateNumberOfMessages": "1"
    }
}
niikawa@niikawa1:~$ aws sqs receive-message --queue-url ${QUEUE_URL} --region ap-northeast-1
{
    "Messages": [
        {
            "MessageId": "9f6f4b1a-536e-4248-aa53-7f1fb7c9e12a",
            "ReceiptHandle": "AQEBQENxFQcNH+Ui+DBucOh+wDorRjmiqeH1EUayWOU3mvfDYCRfDG6AJwYi+DID7sqqOr2Ae/DvQiv3Wt0Uu4qfgcMJ1j/+mPkMM5hDLKLWRgHscWyXQcYLvS/UK8sMc3oQBcI1v1oq9jQ2eTg99/vBHITd5QeOyHlBHKqywfrzMoxSPSSLZ6EUD5VMAoR7C5oBHr/jFEM79xIo388yk4mIEgrmoiDsT/RU9l5GHBMC3E2Y+rXrShNDPtYyF6NvnJVu0pmdFzZpWWC9WvlifPosxxvrejHSSxZwCJwiqtpfZLnYeEhmK/GbfzRflUKwxFTCL1pvr2NiiOa6C7p5FnqWzZ7NZw5/H2DnK+OpoYeNZXIDE77orCbYPcNTFdCNMayvLRwiPwC/cSStATGqXVAvQfG/hTGm8QKts1Nb2f78NJY=",
            "MD5OfBody": "7f280e3e98acc75e845d722277584fac",
            "Body": "SQS Test1"
        }
    ]
}
niikawa@niikawa1:~$ aws sqs get-queue-attributes --queue-url ${QUEUE_URL} --attribute-names ApproximateNumberOfMessages --region ap-northeast-1
{
    "Attributes": {
        "ApproximateNumberOfMessages": "0"
    }
}

** 30秒経過後 **
niikawa@niikawa1:~$ aws sqs get-queue-attributes --queue-url ${QUEUE_URL} --attribute-names ApproximateNumberOfMessages --region ap-northeast-1
{
    "Attributes": {
        "ApproximateNumberOfMessages": "1"
    }
}

 

 

参考資料

AWS,SQS

Posted by takaaki