Y_Yamashitaのブログ

勉強したことのアウトプット・メモ中心。たまに日記とか。

Amazon SQS標準キューが順序を保証しないことをスクリプトを使って確認してみた(JAWS-UG CLI専門支部 #181R SQS入門の復習その②)

はじめに

この記事は前回のJAWS-UG CLI専門支部 #181R SQS入門を噛みしめながら復習する(①事前作業編)の続編にあたる。

続編ならタイトルを「噛みしめながら復習する(②〇〇編)」にすべきだが、今回は、前回ほど一つ一つのコマンドを掘り下げておらず、別のことがやりたくなったので、結局全然違うタイトルにしてしまった。

やりたいこと

タイトル通り、Amazon SQS標準キューがキューの順序を保証しないことを、実際に確かめてみたくなった。当日のハンズオンでは送受信したメッセージが一つだったので、今回は複数メッセージを送受信してみる。

それとシェルスクリプトが書きたくなったので、メッセージの送受信や削除をスクリプトで回してみる。(スクリプト中のSQS絡みのコマンドは、ハンズオンで学習したものを主に使用している。)

<補足>Amazon SQSキューには、キューの順序を保証しない標準キューと、格納された順に取り出しが可能なFIFOキューがある。両者の細かい違いについては以下を参照。5年前の記事だが、凄く分かりやすくまとまっていた。

dev.classmethod.jp

今回の確認方法

まず30回ほどメッセージを送信してキューに格納する。次に、それを30回受信し、送信時と順番がどのように変わるか確認してみる。メッセージの送受信はシェルスクリプトで実施する。

なお、前提として、SQS標準キューはすでに作成済み。また、今回は可視性タイムアウトをデフォルトの30秒から、少し長めの2分に変更してみた。それと、メッセージを受信する際の最大メッセージ数を30に設定した。

メッセージの送信

早速、メッセージを送信してみる。

送信用スクリプト

#!/bin/bash

SQS_QUEUE_NAME="handson-cli-sqs-novice-queue"
SQS_QUEUE_URL=$(aws sqs get-queue-url \
    --queue-name ${SQS_QUEUE_NAME} \
    --output text)

for ((i=1; i<=30; i++))
do
    SQS_MESSAGE_BODY="${i}回目のメッセージ送信です。今は$(date +%H:%M:%S)です。" \
    && echo ${SQS_MESSAGE_BODY}

    aws sqs send-message --queue-url "${SQS_QUEUE_URL}" --message-body "${SQS_MESSAGE_BODY}"

    SQS_MESSAGE_NUMBER="キューのメッセージ数は \
    $(aws sqs get-queue-attributes \
    --queue-url ${SQS_QUEUE_URL} \
    --attribute-names ApproximateNumberOfMessages \
    --query 'Attributes.ApproximateNumberOfMessages' \
    --output text) \
    です。" \
    && echo ${SQS_MESSAGE_NUMBER}
done

SQS_QUEUE_NAMEには事前に作成したキューの名前を指定。SQS_QUEUE_URLには作成したキューのURLを指定する。(キューにメッセージを送信する際や、キューに格納されているメッセージ数を表示する際に引数として指定する必要がある。)

送信メッセージは、「〇回目のメッセージ送信です。今は<何時何分何秒>です。」という内容にした。(後でメッセージを受信した際に、何回目に送信したメッセージを受信したのか分かりやすくするため。)

その後、aws sqs send-messageコマンドで実際にメッセージを送信し、最後にaws sqs get-queue-attributesコマンドを使用し、ApproximateNumberOfMessages(キューから取得可能なおおよそのメッセージ数)を表示させる。

実際に送信してみた

[ec2-user@ip-10-0-0-127%]$ sh Message_send.sh
1回目のメッセージ送信です。今は18:00:17です。
{
    "MD5OfMessageBody": "8cfebdc11d8f69f86f5b9e6ebb3b498c",
    "MessageId": "87674bd6-168c-4e2f-bae1-04a38d354979"
}
キューのメッセージ数は 1 です。
2回目のメッセージ送信です。今は18:00:18です。
{
    "MD5OfMessageBody": "69654bfffefed671752009807c78a201",
    "MessageId": "3aca5431-db4b-4f92-8b94-4bd4bbe13bad"
}
キューのメッセージ数は 0 です。
3回目のメッセージ送信です。今は18:00:19です。
{
    "MD5OfMessageBody": "63926ed43acc5a4e5090acb674b51586",
    "MessageId": "6bf66fde-b885-4156-8d71-dd821d8f00f6"
}
キューのメッセージ数は 2 です。
4回目のメッセージ送信です。今は18:00:20です。
{
    "MD5OfMessageBody": "9fab63a356221d8c157018b0f1602ec9",
    "MessageId": "e967d444-70e4-414f-9876-4d4f986f2a0d"
}
キューのメッセージ数は 4 です。
5回目のメッセージ送信です。今は18:00:21です。
{
    "MD5OfMessageBody": "a554d49254c583f472cfbaf684d63cd5",
    "MessageId": "93685150-7a86-43ea-aa4c-b79d3b0d1c0a"
}
キューのメッセージ数は 5 です。

-------中略-------

26回目のメッセージ送信です。今は18:00:42です。
{
    "MD5OfMessageBody": "f507afe33a1fdebc3c33d34bd8bd88d2",
    "MessageId": "4cb3cf6e-4944-4126-8d44-11a4e2035005"
}
キューのメッセージ数は 19 です。
27回目のメッセージ送信です。今は18:00:43です。
{
    "MD5OfMessageBody": "9dbe09b131ece845f9d9e81d1efb9023",
    "MessageId": "96ea8765-7fd3-450f-9b62-28975f914a2c"
}
キューのメッセージ数は 15 です。
28回目のメッセージ送信です。今は18:00:44です。
{
    "MD5OfMessageBody": "65b5d8d23b5431e40ffcbaf47cd45b58",
    "MessageId": "4af0258b-ce2f-47c6-923a-2420506318fe"
}
キューのメッセージ数は 17 です。
29回目のメッセージ送信です。今は18:00:45です。
{
    "MD5OfMessageBody": "1e33c69b50bd937a4d250bfbb0dd6754",
    "MessageId": "be599a97-d21a-4f15-ba63-59bece7d0773"
}
キューのメッセージ数は 28 です。
30回目のメッセージ送信です。今は18:00:46です。
{
    "MD5OfMessageBody": "57d21dc8959426918e66607515c4fb0d",
    "MessageId": "e2bcc30a-36cf-4796-a3b4-12e4c60191a7"
}
キューのメッセージ数は 26 です。
[ec2-user@ip-10-0-0-127%]$
[ec2-user@ip-10-0-0-127%]$ 
[ec2-user@ip-10-0-0-127%]$ aws sqs get-queue-attributes \
>   --queue-url ${SQS_QUEUE_URL} \
>   --attribute-names ApproximateNumberOfMessages \
>   --query 'Attributes.ApproximateNumberOfMessages' \
>   --output text
30
[ec2-user@ip-10-0-0-127%]$

無事に30回メッセージが送信された。実行結果を見ると、ちょうど1秒に1メッセージ送信していた模様。また、最後のメッセージが送信されて少ししてから改めてApproximateNumberOfMessagesを確認すると、キューに格納されているメッセージ数はちゃんと30個になっていた。

ただし、スクリプトを回している間のApproximateNumberOfMessagesの数はキレイに増える訳ではなく、結構増減していた。結果を表にまとめると以下のようになった。

メッセージ送信回数 送信時刻 ApproximateNumberOfMessages
1回目 18:00:17 1
2回目 18:00:18 0
3回目 18:00:19 2
4回目 18:00:20 4
5回目 18:00:21 5
6回目 18:00:22 6
7回目 18:00:23 2
8回目 18:00:24 7
9回目 18:00:25 7
10回目 18:00:26 10
11回目 18:00:27 5
12回目 18:00:28 6
13回目 18:00:29 11
14回目 18:00:30 11
15回目 18:00:31 1
16回目 18:00:32 4
17回目 18:00:33 12
18回目 18:00:34 16
19回目 18:00:35 7
20回目 18:00:36 11
21回目 18:00:37 10
22回目 18:00:38 20
23回目 18:00:39 21
24回目 18:00:40 20
25回目 18:00:41 20
26回目 18:00:42 19
27回目 18:00:43 15
28回目 18:00:44 17
29回目 18:00:45 28
30回目 18:00:46 26

大体、5秒に1回くらいキューの数がガクッと下がっているけど、理由がイマイチ分からん。。これはもう少し調べる必要がありそうだけど、とりあえず次は受信してみる。

メッセージの受信

キューに溜まっている30個のメッセージを、スクリプトを使って全て受信する。

受信用スクリプト

#!/bin/bash

SQS_QUEUE_NAME="handson-cli-sqs-novice-queue"
SQS_QUEUE_URL=$(aws sqs get-queue-url \
    --queue-name ${SQS_QUEUE_NAME} \
    --output text)

DIR_SQS_MESSAGE="${HOME}/environment/tmp-handson-cli-sqs"


for ((i=1; i<=30; i++))
do
    FILE_SQS_MESSAGE="${DIR_SQS_MESSAGE}/${SQS_QUEUE_NAME}-${i}.json"
    
    echo "${i}回目のメッセージ受信です。今は$(date +%H:%M:%S)です。"
    
    aws sqs receive-message --queue-url "${SQS_QUEUE_URL}" > ${FILE_SQS_MESSAGE}
    
    SQS_MESSAGE_BODY="受信したメッセージは \
    $(cat ${FILE_SQS_MESSAGE} | jp.py 'Messages[].Body' | sed 's/[]\"\[]//g') \
    です。" \
    && echo ${SQS_MESSAGE_BODY}

    SQS_MESSAGE_NUMBER="キューのメッセージ数は \
    $(aws sqs get-queue-attributes \
    --queue-url ${SQS_QUEUE_URL} \
    --attribute-names ApproximateNumberOfMessages \
    --query 'Attributes.ApproximateNumberOfMessages' \
    --output text) \
    です。" \
    && echo ${SQS_MESSAGE_NUMBER}
done

今回はハンズオンの手順に倣い、受信したメッセージを一時ファイルに保存する。その際、メッセージ毎に個別の一時ファイルを作成することにした。(後でメッセージを削除する時に、その方が楽そうなので。詳細は後述。)

スクリプトの内容について簡単に触れておくと、まずは何回目の受信であるか最初に表示する。その後、aws sqs receive-messageコマンドでメッセージを受信し、受信したメッセージの内容を表示する。

もしキューが順序を保証するなら、1回目に受信したメッセージの中身は「1回目のメッセージ送信です。」だし、10回目に受信したものは「10回目のメッセージ送信です。」になるはずだが、どれくらいずれるのだろうか。

また、今回もApproximateNumberOfMessagesを表示させるようにした。メッセージを受信してもキューから削除されるわけではないが、可視性タイムアウトが効いて数字がどんどん減るのかな?

実際に受信してみた

[ec2-user@ip-10-0-0-127%]$ sh Message_receive.sh 
1回目のメッセージ受信です。今は18:04:12です。
受信したメッセージは 3回目のメッセージ送信です。今は18:00:19です。 です。
キューのメッセージ数は 29 です。
2回目のメッセージ受信です。今は18:04:13です。
受信したメッセージは 4回目のメッセージ送信です。今は18:00:20です。 です。
キューのメッセージ数は 30 です。
3回目のメッセージ受信です。今は18:04:14です。
受信したメッセージは 13回目のメッセージ送信です。今は18:00:29です。 です。
キューのメッセージ数は 28 です。
4回目のメッセージ受信です。今は18:04:15です。
受信したメッセージは 1回目のメッセージ送信です。今は18:00:17です。 です。
キューのメッセージ数は 26 です。
5回目のメッセージ受信です。今は18:04:16です。
受信したメッセージは 15回目のメッセージ送信です。今は18:00:31です。 です。
キューのメッセージ数は 29 です。
6回目のメッセージ受信です。今は18:04:17です。
受信したメッセージは 6回目のメッセージ送信です。今は18:00:22です。 です。
キューのメッセージ数は 29 です。
7回目のメッセージ受信です。今は18:04:18です。
受信したメッセージは 20回目のメッセージ送信です。今は18:00:36です。 です。
キューのメッセージ数は 30 です。
8回目のメッセージ受信です。今は18:04:20です。
受信したメッセージは 21回目のメッセージ送信です。今は18:00:37です。 です。
キューのメッセージ数は 24 です。
9回目のメッセージ受信です。今は18:04:21です。
受信したメッセージは 7回目のメッセージ送信です。今は18:00:23です。 です。
キューのメッセージ数は 21 です。
10回目のメッセージ受信です。今は18:04:22です。
受信したメッセージは 10回目のメッセージ送信です。今は18:00:26です。 です。
キューのメッセージ数は 21 です。

-------中略-------

21回目のメッセージ受信です。今は18:04:34です。
受信したメッセージは 23回目のメッセージ送信です。今は18:00:39です。 です。
キューのメッセージ数は 18 です。
22回目のメッセージ受信です。今は18:04:35です。
受信したメッセージは 29回目のメッセージ送信です。今は18:00:45です。 です。
キューのメッセージ数は 15 です。
23回目のメッセージ受信です。今は18:04:36です。
受信したメッセージは 16回目のメッセージ送信です。今は18:00:32です。 です。
キューのメッセージ数は 11 です。
24回目のメッセージ受信です。今は18:04:37です。
受信したメッセージは 18回目のメッセージ送信です。今は18:00:34です。 です。
キューのメッセージ数は 11 です。
25回目のメッセージ受信です。今は18:04:38です。
受信したメッセージは 26回目のメッセージ送信です。今は18:00:42です。 です。
キューのメッセージ数は 5 です。
26回目のメッセージ受信です。今は18:04:39です。
受信したメッセージは 24回目のメッセージ送信です。今は18:00:40です。 です。
キューのメッセージ数は 5 です。
27回目のメッセージ受信です。今は18:04:40です。
受信したメッセージは 25回目のメッセージ送信です。今は18:00:41です。 です。
キューのメッセージ数は 14 です。
28回目のメッセージ受信です。今は18:04:41です。
受信したメッセージは 17回目のメッセージ送信です。今は18:00:33です。 です。
キューのメッセージ数は 6 です。
29回目のメッセージ受信です。今は18:04:42です。
受信したメッセージは 19回目のメッセージ送信です。今は18:00:35です。 です。
キューのメッセージ数は 9 です。
30回目のメッセージ受信です。今は18:04:43です。
受信したメッセージは 27回目のメッセージ送信です。今は18:00:43です。 です。
キューのメッセージ数は 13 です
[ec2-user@ip-10-0-0-127%]$
[ec2-user@ip-10-0-0-127%]$ 

ちょっと見づらい表示になってしまったが、表にまとめると以下のような結果になった。

受信回数 受信時刻 何回目の送信メッセージを受信したか ApproximateNumberOfMessages
1回目 18:04:12 3回目 29
2回目 18:04:13 4回目 30
3回目 18:04:14 13回目 28
4回目 18:04:15 1回目 26
5回目 18:04:16 15回目 29
6回目 18:04:17 6回目 29
7回目 18:04:18 20回目 30
8回目 18:04:20 21回目 24
9回目 18:04:21 7回目 21
10回目 18:04:22 10回目 21
11回目 18:04:23 22回目 24
12回目 18:04:24 30回目 26
13回目 18:04:25 14回目 18
14回目 18:04:26 8回目 19
15回目 18:04:27 9回目 21
16回目 18:04:28 2回目 23
17回目 18:04:29 5回目 28
18回目 18:04:30 28回目 15
19回目 18:04:31 11回目 19
20回目 18:04:32 12回目 13
21回目 18:04:34 23回目 18
22回目 18:04:35 29回目 15
23回目 18:04:36 16回目 11
24回目 18:04:37 18回目 11
25回目 18:04:38 26回目 5
26回目 18:04:39 24回目 5
27回目 18:04:40 25回目 14
28回目 18:04:41 17回目 6
29回目 18:04:42 19回目 9
30回目 18:04:43 27回目 13

こうして確認してみると、見事に順番がバラバラだった。受信と送信の順序が一致したのは30回中2回だけだった。「順序を保証しない」というから「多少ずれることもあるのかな?」くらいに思っていたが、「ほぼランダム」と言った方がしっくりくるような結果で意外だった。今回たまたま極端にずれたのだろうか?

また、ApproximateNumberOfMessagesは減ったが、送信時同様、キレイな減り方はしなかった。

なお、先述した通り、受信してもキューからメッセージが削除されるわけではないので、少し時間を空けてから再度キューの数を確認すると、想定通り30と表示された。

[ec2-user@ip-10-0-0-127%]$ date
Sat Jun 12 18:09:32 UTC 2021
[ec2-user@ip-10-0-0-127%]$ 
[ec2-user@ip-10-0-0-127%]$ 
[ec2-user@ip-10-0-0-127%]$ aws sqs get-queue-attributes \
>   --queue-url ${SQS_QUEUE_URL} \
>   --attribute-names ApproximateNumberOfMessages \
>   --query 'Attributes.ApproximateNumberOfMessages' \
>   --output text
30
[ec2-user@ip-10-0-0-127%]$ 

一時ファイルの確認

受信自体は問題なく出来たので、受信メッセージを格納した一時ファイルがちゃんと存在するか確認する。

[ec2-user@ip-10-0-0-127%]$ ls ./tmp-handson-cli-sqs/
2021-06-12-handson-cli-sqs-novice-queue.json  handson-cli-sqs-novice-queue-16.json  handson-cli-sqs-novice-queue-22.json  handson-cli-sqs-novice-queue-29.json  handson-cli-sqs-novice-queue-7.json
handson-cli-sqs-novice-queue-10.json          handson-cli-sqs-novice-queue-17.json  handson-cli-sqs-novice-queue-23.json  handson-cli-sqs-novice-queue-2.json   handson-cli-sqs-novice-queue-8.json
handson-cli-sqs-novice-queue-11.json          handson-cli-sqs-novice-queue-18.json  handson-cli-sqs-novice-queue-24.json  handson-cli-sqs-novice-queue-30.json  handson-cli-sqs-novice-queue-9.json
handson-cli-sqs-novice-queue-12.json          handson-cli-sqs-novice-queue-19.json  handson-cli-sqs-novice-queue-25.json  handson-cli-sqs-novice-queue-3.json
handson-cli-sqs-novice-queue-13.json          handson-cli-sqs-novice-queue-1.json   handson-cli-sqs-novice-queue-26.json  handson-cli-sqs-novice-queue-4.json
handson-cli-sqs-novice-queue-14.json          handson-cli-sqs-novice-queue-20.json  handson-cli-sqs-novice-queue-27.json  handson-cli-sqs-novice-queue-5.json
handson-cli-sqs-novice-queue-15.json          handson-cli-sqs-novice-queue-21.json  handson-cli-sqs-novice-queue-28.json  handson-cli-sqs-novice-queue-6.json
[ec2-user@ip-10-0-0-127%]$
[ec2-user@ip-10-0-0-127%]$ cat ./tmp-handson-cli-sqs/handson-cli-sqs-novice-queue-15.json
{
    "Messages": [
        {
            "MessageId": "14dd0d6e-9610-421a-9701-2e02e35d594c",
            "ReceiptHandle": "AQEBvvqm5ra499xjlsBW0ljchmxtHbBs7485HxIjhXbQ2JJw3ev/rFAT/GQqboUaIvLl+y6an6hyiKA5ww8WEOIqCdDJBKUYIb4r9Q07pY6jpYNbTwb3vrJL4dFFAzAYSqN2WRtIyj5zVg88V/b3w9OTqNjclZal6YzsXonLAiOUqfgiIWhe4+1xkfEOma04bUEJUKp6IOxan9L8UocXd4JO9GtUQ1ZXqN+uTQ+dzC9KP7TAAQGfuYM9V1TIRlwYGQnLrXllbho1OPMFYThD7nQMSKC1wl0491try1Btd9sSrfdNwHHk/A4SN4Y8xZBq5NM1a4ya32+9V1TmkDqr89SvFtLoutlTwVgQDSA6ApyYVVVEINEJGBg3APWNkrNk7HVS4uVKvbtkP1voINCbMAnJmIvXWqfkNz4LPeL8P9ug01g=",
            "MD5OfBody": "14ce526cc7ccda226024934d5f854684",
            "Body": "9回目のメッセージ送信です。今は18:00:25です。"
        }
    ]
}
[ec2-user@ip-10-0-0-127%]$

ちゃんとファイルは存在したし、メッセージもちゃんと入っているようで一安心。

メッセージを見ると、ReceiptHandleというやたら長い文字列があるが、今回はメッセージを削除する際にこれを指定する。

メッセージの削除

送受信が問題なく出来たので、30個分のメッセージを削除する。削除もスクリプトで実施する。

削除用スクリプト

#!/bin/bash

SQS_QUEUE_NAME="handson-cli-sqs-novice-queue"
SQS_QUEUE_URL=$(aws sqs get-queue-url \
    --queue-name ${SQS_QUEUE_NAME} \
    --output text)
    
DIR_SQS_MESSAGE="${HOME}/environment/tmp-handson-cli-sqs"


for ((i=1; i<=30; i++))
do
    FILE_SQS_MESSAGE="${DIR_SQS_MESSAGE}/${SQS_QUEUE_NAME}-${i}.json"

    echo "${i}回目のメッセージ削除です。今は$(date +%H:%M:%S)です。"

    SQS_MESSAGE_RECEIPT_HANDLE=$(cat ${FILE_SQS_MESSAGE} | jp.py 'Messages[].ReceiptHandle' | sed 's/[]\"\[]//g') \
    && echo ${SQS_MESSAGE_RECEIPT_HANDLE}
    
    aws sqs delete-message --queue-url "${SQS_QUEUE_URL}" --receipt-handle ${SQS_MESSAGE_RECEIPT_HANDLE}

    SQS_MESSAGE_NUMBER="キューのメッセージ数は \
    $(aws sqs get-queue-attributes \
    --queue-url ${SQS_QUEUE_URL} \
    --attribute-names ApproximateNumberOfMessages \
    --query 'Attributes.ApproximateNumberOfMessages' \
    --output text) \
    です。" \
    && echo ${SQS_MESSAGE_NUMBER}
done

受信時に作成した一時ファイルからReceiptHandleの値を抜き出し、aws sqs delete-messageコマンドでキューのURLとReceiptHandleを指定してメッセージを削除する。(メッセージ毎に一時ファイルを分けていたのは、その方がReceiptHandleを抜き出しやすそうだったため。)

また、今回もしつこくApproximateNumberOfMessagesの値を表示させる。今回はキューからメッセージを削除するので、値はドンドン減っていくのではないだろうか。

実際に削除してみた

[ec2-user@ip-10-0-0-127%]$ sh Message_delete.sh 
1回目のメッセージ削除です。今は18:12:53です。
AQEBPJze/hVJusVhMW1qezwrPBj+uP9ZS1yymJEDMepsYTNMrLxOR7uqN0ihCfSSgOE7c1k7wg06YzJ6XvyVyWSWdZFbu3sZ+ZW5maqMR8Af5v47ts7CK9FWItVFB3BcjcRXW1hdYFSQjhPU30b27Ux0T+/AgmTrWgUhzwley1/IOm4fkaXgJMS4bVPKezU0q79KGelXr3x8avoOGhb4Z15hjQh6d2l4YSW1rE5diDl557iiQBWMDMT1P3p0x3ppY7z65Vt1oTGmORV7XO/u/W0CYIfpDxUVxk+wo7AuyeZcrzKmfyw8NSBGIEzfLMsKocoLUwzcNgxq6Q+oRYrNrFiFq/lyf3tCUUwhRqdAqDrQ6sd278nXQemxt63f1hzpuxcLnt4Ri2TNRS13z8IlRIpiQPY32Ol1tHlsmJW094JxmEs=
キューのメッセージ数は 29 です。
2回目のメッセージ削除です。今は18:12:54です。
AQEBoB+hkt853aeqST1xsAERiO0Alu6g7jwUkE5JeRneSkgwWpA699LngmxqEBKf6FV1DWn8nvA38aaoyfaViV9yxj4C5/Snr6bi/KKxpL06tXFdrNZONh83pQIcDG5UFWNXEF1FAAKH2Avxh00KiHtLH6mnpJ/jPiAwo6HMMXVtgWWzpKY36rMjCJa0hAl/Qk176FX+Qlsk34+2qlra6wihdyakwfhpqtQ7E22JfBjlcYWWcvsUjmX6hNbYQACi+CIZHMA7WrDBTFsrjzLWj0wToT6c/beF/uMNNCe4jWtx5MHda95IQqtXhSrKefieMkrDVimX3qwpdmorl5ekA6mk/tfHBpfbsD0dsP1xWU0QwyPIpo/b++5ptGlbRviu/IAsQd4pz1goYqL4XykeR12X+8qJUdGTZ7SQiK2vIVT2Zl0=
キューのメッセージ数は 30 です。
3回目のメッセージ削除です。今は18:12:55です。
AQEBJ+FMrXQewt3Duf9B1HzvKBtH4GIe7iCxrBKSG3SOGWHfvy6ciwvfzEtN8OWrDpK3iZsEOZSK3HCOB+PLjS70dMoWxVnThf8Xg5OXBMRlumf/s0Z3U7x8ZlfCR0jItMpRCvURkjxFKROVgJMwZMdeNQ1r3Y/0r/9B32ckMbrkxMg880N+g7xxoQ6sWe0jVjrfMi15UfP6nJrAzPmcTqPi8LdETnY7w0IE5CrZscC3lPIn4TPXqns2QWnM55Gq1NXTzf2UEZP7YmORx213WavwAIwYhZumseJaUaiEYhQkv2T9eevp4+UqfpaEqjal+7e5xna7hyzB3L1nn0PM5v5x6yOzBBQvMROAddV+sJ2TyvDa/9ABMQAxnhaum0Vrd4jya0K3jlcbzmrpF1v3dkYNdPQqybcUTYmHQEW40QJgb6M=
キューのメッセージ数は 29 です。

-------中略-------

28回目のメッセージ削除です。今は18:13:22です。
AQEBVubFV8H/oQ3TYKeKhdk9pCO+f2KFdCeasVoGcj6vKhIIXb8cCm8FXiHBb+x9Ef3GEMXscH8NR20DDa2iQdglMzcVvuWkgzQ4DwfaA0qVdirpXj0OIX5tvuYLx6375eBGLObat3FOr9Emyc1bTvRu5QuXvyUK83ECoxnlqJh2hhqJEtMPuyg+n34deDfqNXUL9xNR3StDXRPz5ZaE9oJ2ic2XC5ELlqR5A7r7I2OGzD3UOzLF+CSpxbO9/KqrkOXWDZ0zcWLxYQEqg+WvrOFJpPh8mOjvWT91QAoaBO0uWGrwbxCx/UMNIMus6sTGp+rc/AZad6hHUuuXdcKigKsA22m0WBvsBnlMcplm2Rllo7Jcteuij7hSS2kYXjEJAe/5xbAhKC9O+GfEihUAM25QLXX5D/vLagZ028YZeYFAAns=
キューのメッセージ数は 4 です。
29回目のメッセージ削除です。今は18:13:23です。
AQEBFHWzCcY2bUBwkDKSrDvg7XSsIHJ1OAbiacEPa2jfSV6lUFhkDBfnHTdrpspmzn7TEJ57voH2L2E1AHI9WPENn0YUZc7TMZx7kkM42muIy9nNxvZNP8zAfnj1sNNCpdvUsku6RyIR/Rv9KDz27m3nBtgaiTjM+JV1GmG7KWCnJ5XAyXWJsxHihGs/kw3aBMLhBojUSjEb0/96ZzvN2A+yDQAfsvie1XmydB6tN1M0Iygy5r1Jx6HRli9EU9bx+4oBWTjJ11Bj0YmadfSBUR3g+blnJNsUdMuq3bOEKrk64DiZSNOHy2E3xjo6C3PJ8EZpnDH6aGL1rFtQSslAFdl5qNdj5JibPJT9dP0UutEhbeUBG0DI9vu573IJF+B1LpeY1sMWk7C9vqfsmHsV8Uo+TWjG4/D8Zir0MZjjiBG4FAQ=
キューのメッセージ数は 12 です。
30回目のメッセージ削除です。今は18:13:24です。
AQEB6vCTH+YGzL8eLisOjiHSJm/NoHCEmpFYcsBEypeFtW/xPjnuV53rReiuvaZlbq7SFcNs0YI5Sd5stVGSGI47aWRYx+osVCNHjXCe+K1fY+S+g47zrW0eZM1A+AmSTZPobfpl0C2YsQXyGonuEoKwBKS7hCHezdkX+bN5FiAXLbnd1wgJ+LG56aFXlDSWXhtOJR7ai7czbZT3hr6kbi3lucpml4ekHBUL6YooLVYDyh52DGFftVhGooxZJsbAo58bIj7L+6dTLMJfDqD6Ynwa3rqd7ERrewGqgTseZ6bpi4ubiLIXbeC1LVQtYWTBeRSl1TqodCMNBG6BukJKGmAslsJwlKnu8yWoZaackfZw0jn738na8rW3bxUg8rZtrkzwi3GrOxQ6iNOdrPgl4vgSOvDBYl9IiBnyx9Kd1NBdAfY=
キューのメッセージ数は 1 です。
[ec2-user@ip-10-0-0-127%]$
[ec2-user@ip-10-0-0-127%]$ 
[ec2-user@ip-10-0-0-127%]$ 
[ec2-user@ip-10-0-0-127%]$ 
[ec2-user@ip-10-0-0-127%]$ aws sqs get-queue-attributes \
>   --queue-url ${SQS_QUEUE_URL} \
>   --attribute-names ApproximateNumberOfMessages \
>   --query 'Attributes.ApproximateNumberOfMessages' \
>   --output text
0
[ec2-user@ip-10-0-0-127%]$

問題なく削除できた。ReceiptHandleがちゃんと取得できているか分かるようにechoで表示させていたが、文字列が多いので出さない方が良かったかな。あと、一時ファイルの削除もスクリプトに組み込めば良かった。

ApproximateNumberOfMessagesの値については、結局今回もキレイに減ることはなかった。

おわりに

ApproximateNumberOfMessagesについては改めて確認が必要なものの、標準キューの順序が想像以上にバラバラなのが確認できたので良かった。あと、スクリプトを書くのは楽しい。