【AWS】CLIによるAmazon SQSに対する操作メモ

キュー内のメッセージ数取得

$ aws sqs get-queue-attributes \
  --queue-url {キューのURL} \
  --attribute-names ApproximateNumberOfMessages
オプション名概要
–queue-urlメッセージ数を取得するキューのURL
–attribute-namesメッセージ数を表すApproximateNumberOfMessagesを指定する

キュー内のメッセージ一覧取得

$ aws sqs receive-message \
  --queue-url {キューのURL} \
  --max-number-of-messages 10 \
  --visibility-timeout 10 \
  --wait-time-seconds 0
オプション名概要
–queue-urlメッセージ一覧を取得するキューのURL
–max-number-of-messages取得するメッセージの最大数、10より大きい値は指定できない
–visibility-timeout可視性タイムアウトの値、メッセージ受信後に指定した秒数間はメッセージが他のコンシューマーから見えなくなる。最大値は43,200秒(12時間)
–wait-time-secondsキュー内にメッセージが存在しない場合に待つ秒数、最大値は20秒

キューへメッセージ送信

$ aws sqs send-message \
  --queue-url {キューのURL} \
  --message-body {メッセージ本文} \
  --message-group-id {メッセージグループID}  \
  --message-deduplication-id {メッセージ重複排除ID}

# 例
$ aws sqs send-message \
  --queue-url https://sqs.xxxx \
  --message-body '{"type":"notification","user":"alice","status":"active"}' \
  --message-group-id "test"  \
  --message-deduplication-id "test1"
オプション名概要
–queue-urlメッセージを送信するキューのURL
–message-bodyメッセージ本文
–message-group-id FIFOキュー内でメッセージ順序が保証される単位であるメッセージグループを識別するためのID
–message-deduplication-idメッセージを一意に識別するためのID、5分以内に同一のmessage-deduplication-idを持つメッセージがキューへ送信された場合、そのメッセージはキューに入らない。5分を超えてから送信された場合はキューへ入る

キューからメッセージ削除

$ aws sqs delete-message \
      --queue-url {キューのURL} \
      --receipt-handle {識別子} \
オプション名概要
–queue-urlメッセージを削除するキューのURL
–receipt-handle削除対象のメッセージを特定するための一時的な識別し、receive-messageで取得できる

キュー内のメッセージを1つ削除するワンライナーは以下のように書ける。receive-messageで取得した識別子を変数へ保存し、delete-messageへ渡す。

bash -c 'HANDLE=$(aws sqs receive-message \
    --queue-url {キューのURL} \
    --max-number-of-messages 1 \
    --query "Messages[0].ReceiptHandle" \
    --output text) && \
    aws sqs delete-message \
    --queue-url {キューのURL} \
    --receipt-handle "$HANDLE"'

キュー内の全てのメッセージを削除したい場合、上記の処理をメッセージ内にキューが存在している間ループすればよいので以下のように書ける。

bash -c 'while HANDLE=$(aws sqs receive-message \
      --queue-url {キューのURL} \
      --max-number-of-messages 1 \
      --query "Messages[0].ReceiptHandle" \
      --output text) && [ "$HANDLE" != "None" ]; do \
      aws sqs delete-message \
      --queue-url {キューのURL} \
      --receipt-handle "$HANDLE"; \
    done'