SQSではメッセージは10件までしか取得することはできない。
そのため、メッセージを全部取得する場合には、取得した10件のメッセージを取得するAPIをループで叩いて取得する必要がある。
また、SQSから取り出したメッセージは明示的に削除する必要があり、取り出したメッセージは処理中のメッセージとなり、取りだすることができないメッセージとなる。削除をしない場合、一定時間経過すると、取り出すことができるようになる。
ちなみにあ、処理中のメッセージは、SQS – 編集 – 可視性タイムアウト情報の設定を変更することで調整可能。

import boto3
def get_all_messages_from_sqs(
queue_url,
max_messages=10,
wait_time_seconds=20,
):
sqs_client = boto3.client("sqs")
all_messages = []
while True:
response = sqs_client.receive_message(
QueueUrl=queue_url,
MaxNumberOfMessages=max_messages,
WaitTimeSeconds=wait_time_seconds,
)
# メッセージがなくなったら終了
messages = response.get("Messages")
if not messages:
break
# メッセージを追加
all_messages.extend(messages)
# メッセージを削除(削除しない場合はコメントアウト)
entries = [
{"Id": msg["MessageId"], "ReceiptHandle": msg["ReceiptHandle"]}
for msg in messages
]
sqs_client.delete_message_batch(QueueUrl=queue_url, Entries=entries)
return all_messages
# Usage
queue_url = "QUE_URL"
messages = get_all_messages_from_sqs(queue_url)
# メッセージを表示
for message in messages:
print(message["ReceiptHandle"])
