Amazon SQSチュートリアル (AWS CLI で一連の操作をしてみよう)

投稿者 : OSCA

[PR] "東野・岡村の旅猿"で登場したロケ地を紹介するファンサイト「あの場所へ行こう!」はこちら。

本稿は、フルマネージド型のメッセージキューイングサービス「Amazon SQS」をこれから初めて触れる方に向けて、AWS CLI で一連の基本操作を行い、Amazon SQSの基本的な機能を学習できるチュートリアルです。 本チュートリアルでは、基本的に全てデフォルトの設定で操作をおこないます。 設定のチューニングや意味については、本チュートリアルを終えた後に学習すれば良いと思います、まずは基本操作で概要を掴みましょう。

前提

チュートリアルを始めるにあたり、AWS CLI はコンピュータにインストールされていることとします。 もし、まだ AWS CLI のインストール, セットアップが完了していない方は、あらかじめ終わらせた上で進めてください。

学習すること

Amazon SQS は、メッセージをキューを介して送受信するためのサービスです。 メッセージの送信側を「プロデューサー」、キューからメッセージを消費する側を「コンシューマー」と呼びます。本チュートリアルでは、AWS CLI で次の操作を行い、Amazon SQS の機能を学習します。

  1. キューの作成
  2. メッセージの送信 (プロデューサー)
  3. メッセージの消費 (コンシューマー)

チュートリアル

それでは、ここから基本操作を体験するチュートリアルを開始します。

1. キューを作成する

まずはメッセージを送受信するために必要なキューの作成をしていきます。 キューを作成する前に、AWS上にあるキューの一覧を表示してみましょう。 初めてSQSを利用するのであれば、キューはまだ1つもないはずです。 コマンドは aws sqs list-queues で、ご利用のAWSアカウントのデフォルトリージョンのキューを取得することができます。 AWS 上にキューがなければ、コマンドを実行しても何も表示せずにコマンドが終了します。

$ aws sqs list-queues

それでは新しくキューを作成してみましょう。 キューの作成は aws sqs create-queue コマンドで行ます。 次の例のように –queue-name オプションでキューの名前を指定します。 ここではキューの名前を my-queue としました。

$ aws sqs create-queue --queue-name my-queue
{
    "QueueUrl": "https://sqs.us-west-1.amazonaws.com/123456789012/my-queue"
}

キューの作成ができたら、もう一度 aws sqs list-queues コマンドでキューの一覧を表示してみましょう。 新しく作成したキューのURLが表示されます。

$ aws sqs list-queues
{
    "QueueUrls": [
        "https://sqs.us-west-1.amazonaws.com/123456789012/my-queue"
    ]
}

作成したキューの詳細情報は aws sqs get-queue-attributes コマンドで表示することができます。 次の例のように –queue-url で作成したキューのURLを、キューの全ての情報を表示するために –attribute-names All オプションを指定します。

$ aws sqs get-queue-attributes --queue-url https://sqs.us-west-1.amazonaws.com/123456789012/my-queue --attribute-names All
{
    "Attributes": {
        "QueueArn": "arn:aws:sqs:us-west-1:123456789012:my-queue",
        "ApproximateNumberOfMessages": "0",
        "ApproximateNumberOfMessagesNotVisible": "0",
        "ApproximateNumberOfMessagesDelayed": "0",
        "CreatedTimestamp": "1633927421",
        "LastModifiedTimestamp": "1633927421",
        "VisibilityTimeout": "30",
        "MaximumMessageSize": "262144",
        "MessageRetentionPeriod": "345600",
        "DelaySeconds": "0",
        "ReceiveMessageWaitTimeSeconds": "0"
    }
}

なお、このキューの設定は aws sqs set-queue-attributes コマンドで変更することができますが、本チュートリアルではデフォルトのまま利用するため、ここでは説明を省略します。 このチュートリアルを終え、設定を変更して利用するときに調べてみてください。

2. メッセージをキューに送信する (プロデューサー)

それでは作成したキューにメッセージを送信してみましょう。 キューにメッセージを送信するには aws sqs send-message コマンドを、送信するメッセージを –message-body オプションで指定して実行します。 メッセージがキューに格納されると、レスポンスでメッセージIDとメッセージのハッシュ値が返却されます。

$ aws sqs send-message --queue-url "https://sqs.us-west-1.amazonaws.com/123456789012/my-queue" --message-body "hello world"
{
    "MD5OfMessageBody": "5eb63bbbe01eeed093cb22bb8f5acdc3",
    "MessageId": "194e4680-eee6-4c45-853c-db1f9061f3d7"
}

実際にメッセージがキューに格納されたか、キューにあるメッセージの数を確認してみます。 次の例のように aws sqs get-queue-attributes コマンドで –attribute-names ApproximateNumberOfMessages オプションと –query ‘Attributes.ApproximateNumberOfMessages オプションを指定します。 するとレスポンスで 1 と、キューに入っているメッセージの数が返却されます。 (この時、キューの数がカウントアップするのに少しだけ時間を要する場合があります、といっても大体数秒です。 カウントアップされなかった場合、もう一度コマンドを叩けば正しい数字が返却されます)

$ aws sqs get-queue-attributes --queue-url 'https://sqs.us-west-1.amazonaws.com/123456789012/my-queue' --attribute-names ApproximateNumberOfMessages --query 'Attributes.ApproximateNumberOfMessages'
"1"

キューにもう一つメッセージを追加してみます。 上記同様に aws sqs send-message コマンドでメッセージを追加し、キューに格納されたメッセージの数を確認します。 今度は 2 となるはずです。

$ aws sqs send-message --queue-url "https://sqs.us-west-1.amazonaws.com/123456789012/my-queue" --message-body "hello world (2)"
$ aws sqs get-queue-attributes --queue-url 'https://sqs.us-west-1.amazonaws.com/123456789012/my-queue' --attribute-names ApproximateNumberOfMessages --query 'Attributes.ApproximateNumberOfMessages'
"2"

3. メッセージをキューから消費する (コンシューマー)

続いてキューに入れたメッセージを取り出してみます。 キューからメッセージを取り出すには、次の例のように aws sqs receive-message コマンドを利用します。 実行するとキューに格納されたメッセージが1つだけ取得することができます。

$ aws sqs receive-message --queue-url 'https://sqs.us-west-1.amazonaws.com/123456789012/my-queue'
{
    "Messages": [
        {
            "MessageId": "194e4680-eee6-4c45-853c-db1f9061f3d7",
            "ReceiptHandle": "AQEBAYkiKUWFEOZyGH2EaeZVf+tz6HoChKWBFLK92bZMG3UgYZCeno4amafZtq49PeQ9oTfD4Oy3P5AjqR2El812UR90OzNuH1luJ5dqt8SR5MmPOeKlbqT5wy0naXTjEEJidpp2YvpR7Wn3BSCIJ9AM1K4krN73iVsUeTmhouUJzmX0V/ZVHIFZnFUvdBCfOCCa+ewoMkccNX/l2J/soyv+OTcn6mKldB8hPmBYvlRRYcGJjS/H2zBOOBQ3kIUnb0T8NwAgOSB8fY0xg6j64hMUr9m4dC0EG2W6iZ1jyl/oJl1RQDXHKJ/GDsuwKaMKYJuQla4UFy03ViqZW4Up3m7ZuoEGKLm5CjUyA1NhHsZp2TdeIpX3rKqVAcADxkGljv2X",
            "MD5OfBody": "5eb63bbbe01eeed093cb22bb8f5acdc3",
            "Body": "hello world"
        }
    ]
}

それではキューの中のメッセージの数を確認してみます。 すると 2 という数が返却され、キューのメッセージが減っていないことがわかります。

$ aws sqs get-queue-attributes --queue-url 'https://sqs.us-west-1.amazonaws.com/123456789012/my-queue' --attribute-names ApproximateNumberOfMessages --query 'Attributes.ApproximateNumberOfMessages'
"2"

メッセージはキューから削除するか、もしくは一定時間経過しないとなくなりません。 メッセージを削除するには aws sqs delete-message コマンドで、 –receipt-handle オプションに返却された ReceiptHandle の値を指定することでおこないます。 (レスポンスは何も返却されません)

$ aws sqs delete-message --queue-url 'https://sqs.us-west-1.amazonaws.com/123456789012/my-queue' --receipt-handle 'AQEBAYkiKUWFEOZyGH2EaeZVf+tz6HoChKWBFLK92bZMG3UgYZCeno4amafZtq49PeQ9oTfD4Oy3P5AjqR2El812UR90OzNuH1luJ5dqt8SR5MmPOeKlbqT5wy0naXTjEEJidpp2YvpR7Wn3BSCIJ9AM1K4krN73iVsUeTmhouUJzmX0V/ZVHIFZnFUvdBCfOCCa+ewoMkccNX/l2J/soyv+OTcn6mKldB8hPmBYvlRRYcGJjS/H2zBOOBQ3kIUnb0T8NwAgOSB8fY0xg6j64hMUr9m4dC0EG2W6iZ1jyl/oJl1RQDXHKJ/GDsuwKaMKYJuQla4UFy03ViqZW4Up3m7ZuoEGKLm5CjUyA1NhHsZp2TdeIpX3rKqVAcADxkGljv2X'

メッセージを削除後、改めて格納されているメッセージの数を確認してみると、次のように 1 と返却されました。

$ aws sqs get-queue-attributes --queue-url 'https://sqs.us-west-1.amazonaws.com/123456789012/my-queue' --attribute-names ApproximateNumberOfMessages --query 'Attributes.ApproximateNumberOfMessages'
"1"

なお、上で一定時間経過してもメッセージが消えると述べました。 その期間は、キューの情報の MessageRetentionPeriod の値の秒数で、上の例だと345600秒となっていますので、つまり4日たつとメッセージが自動的に消えます。

おわりに

ここまでで本チュートリアルはおしまいです。 キューの作成、メッセージの送信、メッセージの消費の概要を理解することはできましたか? 本チュートリアルが皆さんのお仕事のお役に立てれば幸いです。

著者 : OSCA

OSCA

Java, PHP 系のWEBエンジニア。 WEBエンジニア向けコミュニティ「WEBエンジニア勉強会」を主催。
個人として何か一つでも世の中の多くの人に使ってもらえるものを作ろうと日々奮闘中。
@engineer_osca