AWS CLI で Amazon SQS の機能を試す

AWS CLI から Amazon SQS のキューを作ったりメッセージを送ったり受信したりしてみます。シンプルなサービスなので、CLI からの操作も簡単ですね。

以下ではメッセージを受信して何かの仕事をするサービスをワーカー、メッセージを送信して何かの仕事を依頼するサービスをクライアントと表記して例示します。

AWS CLI 環境のセットアップ

AWS CLI をインストールし、Amazon SQS へのアクセス権のあるクレデンシャルを用意する必要があります。

キューの作成

メッセージ受信待機時間を最大の20秒に設定してキューを作成します。これはあとでロングポーリングを試すためです。

$ aws sqs create-queue --queue-name my-test-queue --attributes ReceiveMessageWaitTimeSeconds=20
{
    "QueueUrl": "https://ap-northeast-1.queue.amazonaws.com/000000000000/my-test-queue"
}

作成したキューを含むキューの一覧を確認する

$ aws sqs list-queues
{
    "QueueUrls": [
        "https://ap-northeast-1.queue.amazonaws.com/000000000000/my-test-queue"
    ]
}

できているようです。URL を取得しておきます。

$ QUEUE_URL=$(aws sqs get-queue-url --queue-name my-test-queue |  npx jqf --raw-string-output 'x => x.QueueUrl')

メッセージを受信する

メッセージが空の状態で受信してみます。ワーカーがメッセージの受信を待っている状況を想定しています。

$ aws sqs receive-message --queue-url $QUEUE_URL

20秒待って、何も表示せずに終わります。メッセージの受信を待っている状態なので、期待通りの挙動です。

メッセージを送信する

作成したキューにメッセージを送信します。クライアントが仕事を依頼する状況を想定しています。

$ aws sqs send-message --queue-url $QUEUE_URL --message-body '{"hello":"SQS"}'
{
    "MD5OfMessageBody": "23759ae80d00f2b3e9c5eb026b74fdd8",
    "MessageId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

メッセージを受信する

作成したメッセージを受信してみます。ワーカーが実際に仕事の依頼を受け付ける状況を想定しています。

$ aws sqs receive-message --queue-url $QUEUE_URL
{
    "Messages": [
        {
            "MessageId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
            "ReceiptHandle": "<base 64 value>",
            "MD5OfBody": "23759ae80d00f2b3e9c5eb026b74fdd8",
            "Body": "{\"hello\":\"SQS\"}"
        }
    ]
}

送信ずみのメッセージが受信できました。コンソールで確認すると、メッセージのステータスが「利用可能」から「処理中」になっています。

メッセージを削除する

メッセージの受信の際に得られた ReceptHandle の値を送信すると削除できます。ワーカーが仕事を終えた状況を想定しています。

$ aws sqs delete-message --receipt-handle "<base 64 value>" --queue-url $QUEUE_URL

ロングポーリング中にメッセージを受信する

それでは 2つのターミナルを開いて、メッセージの送信と受付をシミュレートしてみます。メッセージを通してクライアントがワーカーに仕事を依頼する一般的なシチュエーションを想定しています。

それぞれのターミナルで、QUEUE_URL 正しい URL の値が代入されていることを確認してください。

$ QUEUE_URL=$(aws sqs get-queue-url --queue-name my-test-queue |  npx jqf --raw-string-output 'x => x.QueueUrl')
$ echo $QUEUE_URL
https://ap-northeast-1.queue.amazonaws.com/000000000000/my-test-queue

以下の2つのコマンドをそれぞれのターミナルに順番に入力します。

# ターミナルA
$ aws sqs receive-message --queue-url $QUEUE_URL

# 数秒待つ。20秒待つとポーリングが終わってしまうので注意

# ターミナルB
$ aws sqs send-message --queue-url $QUEUE_URL --message-body '{"hello":"SQS"}'

正しく入力できていれば、ターミナルB にコマンドを入力した瞬間にターミナルA でメッセージが受信されるはずです。

Animated GIF - Find & Share on GIPHY

キューを削除する

最後に CLI からキューを削除します。

$ aws sqs delete-queue --queue-url $QUEUE_URL