あめがえるのITブログ

頑張りすぎない。ほどほどに頑張るブログ。

Amazon SQSをCLIを使って操作してみた

AWSの資格の勉強でたびたび出てきたAmazon SQSですがなんとなくイメージはわくものの いざ使うとなるとどう使ってよいのかわからなかったので遊んでみることにしました。 ヾ(o´∀`o)ノワァーィ♪

Amazon SQSとは

Amazon SQS(Simple Queue Service)は、分散されたソフトウェアシステムと コンポーネントを統合と分離ができる安全性、耐久性があり利用可能なホストキューを提供します。

(-ω-;)ウーン まぁ、キューを管理してくれるということで。。。

やること

AWS CLIでSQSのキュー作成から処理しキューの削除まで実施

構成

CloudShellからAmazon SQSを操作 ※SQSは標準キューで作成
標準キューとは: ベストエフォートで順番を保持する。

実践!

1.CloudShellへログインしまずは変数設定

$ uname -r
4.14.255-291-231.527.amzn2.x86_64

$ SQS_QUEUE_NAME=Orders
$ SQS_MESSAGE_BODY="test"

2.キュー作成

$ aws sqs create-queue --queue-name ${SQS_QUEUE_NAME}
$ aws sqs list-queues
{
    "QueueUrls": [
        "https://sqs.ap-northeast-1.amazonaws.com/xxxxxxxxx/Orders"
    ]
}

3.メッセージ送信(5つ作成)

$ SQS_QUEUE_URL=$( aws sqs get-queue-url \
    --queue-name ${SQS_QUEUE_NAME} --output text )
$ for i in {1..5}; do
aws sqs send-message --queue-url "${SQS_QUEUE_URL}" --message-body "${SQS_MESSAGE_BODY}${i}"
done

4.メッセージ受信

$ aws sqs receive-message --queue-url "${SQS_QUEUE_URL}"
{
    "Messages": [
        {
            "MessageId": "baa1bd8d-7c4c-4ebf-aefb-8ddf89de27e5",
            "ReceiptHandle": "AQEBlUgOXC4bZPWaIdA/m4pKh4/3vhZwh8VMV+upW2QaVn+rm1GDiikQNhTfh3N/hnLxB2LzIPQpCWKla9BiLAaeY4N9hoF/0e4TjX7lc3sqo2aDSlIKdpQ6o3VZj3FtM2ihfpzZXJl5UCMeKZ1SANizFTY5iG6dZZS3ZKjg4yYnkPXh7cOLabJUtvw0CQvTsK3e80q8MzhmeOXLreV9bFJR/BdXE5hU7QWnrTSRpxrVRegxDvrgmEkb77lxM5cWrQAhj63PFLLluNfBYItPpIhOXmFywACMV9wwZ0xH26nANDTQb/rYuv/Jj59rEoJIYOcCmpS9fPk9C1EidioiGWqw+uNTXHWAnZdmPQZfN+mU2rYjlIBQ5/ieIUaJRHnpoRdzxYu5fH1BLLAodny9obyGNA==",
            "MD5OfBody": "86985e105f79b95d6bc918fb45ec7727",
            "Body": "test4"
        }
    ]
}
※今回はtest4を受信。標準キューのため先に入れたものが最初に取り出されるわけではない。

5.メッセージを受信した場合のキューの状態推移を確認

$ aws sqs get-queue-attributes --queue-url ${SQS_QUEUE_URL} --attribute-names All | jq '.Attributes.ApproximateNumberOfMessages'
"5""ApproximateNumberOfMessages": "5"となっている。

$ aws sqs receive-message --queue-url "${SQS_QUEUE_URL}"
[cloudshell-user@ip-10-6-62-198 ~]$ aws sqs receive-message --queue-url "${SQS_QUEUE_URL}"
{
    "Messages": [
        {
            "MessageId": "176153ab-e408-4cce-87f3-8cd3059473e7",
            "ReceiptHandle": "AQEB/y6TOmT9dfe4NG0tNwP5ZxHy8FK8YDQyIwAV7MpI3vhYk/LcuqhtiESz/+j4cnC0Nv5J2axdRfAnI7vKgo+eor5O33ApbMDpTDxS2Fp2pG4yb5Oyd7Vo/QvjkXKl4UT4brZFf3uYWjAeQWbRWQ0/QSmiJl50+0lRBmLdxoMgtDHxG0UeR0rXavajNh+0RV2avbnk4WTGvuZe8CIAucpsjj/1f+3dS3zisuw56BfvZsC6vxSsguQZM2jHr0VsjKywz3IBFVIBWftQ8ujlgbJTR6XURq9p+rHrqrdEY3Pnnejbb7V9VFQTfjxTlaIvXrVQYZrIXebhN+htU2gEWiFwWwjsz1khqVPPBPaxbpoKXq2yPZ6ksvdQG2VFX55SqQ5gM80mTdb9GPmjb1BIliRBzQ==",
            "MD5OfBody": "5a105e8b9d40e1329780d62ea2265d8a",
            "Body": "test1"
        }
    ]
}

$ aws sqs get-queue-attributes --queue-url ${SQS_QUEUE_URL} --attribute-names All | jq '.Attributes.ApproximateNumberOfMessages'
"4"
$ aws sqs get-queue-attributes --queue-url ${SQS_QUEUE_URL} --attribute-names All | jq '.Attributes.ApproximateNumberOfMessagesNotVisible'"1""ApproximateNumberOfMessages": "4"となり、"ApproximateNumberOfMessagesNotVisible": "1"が増える。しかし、可視性タイムアウトにより一定時間後元の状態に戻る。

$ aws sqs get-queue-attributes --queue-url ${SQS_QUEUE_URL} --attribute-names All | jq '.Attributes.ApproximateNumberOfMessages'
"5"

※可視性タイムアウトとは 処理可能なメッセージは[利用可能なメッセージ]に入り、メッセージが受信された直後は、 メッセージはキューに保留されたままとなり、[処理中のメッセージ]に入る。 ほかのコンシューマーが同じメッセージを再び処理しないようにSQSは可視性タイムアウトを設定する。 デフォルトでは30秒、可視性タイムアウトを経過すると再び[利用可能なメッセージ]に入り、コンシューマーが受信できる状態となる。

GUIでは下記の項目
 ・Attributes.ApproximateNumberOfMessages:利用可能なメッセージ
 ・Attributes.ApproximateNumberOfMessagesNotVisible:処理中のメッセージ

6.メッセージ削除

$ SQS_MESSAGE_RECEIPT_HANDLE=$( aws sqs receive-message --queue-url "${SQS_QUEUE_URL}" | jq '.Messages[].ReceiptHandle' )

$ SQS_MESSAGE_RECEIPT_HANDLE1=${SQS_MESSAGE_RECEIPT_HANDLE//\"/}

$ echo $SQS_MESSAGE_RECEIPT_HANDLE1
AQEB1hedox4AeRWD7uvm+afbkCdy2Q+3hEZE5p4trWzzjYB4E2FlbgjptjJodhggKrmfzucP+a3RnkicentgQyjgWk3Myb90U+tPVWWhG6rMroo8bQdwGam04yglwdebLBfHflfvKtX3B+DC6abrrnpR4dRjRw2D8KJeYK3PQfWm8xWVMMTfiajOyIYTtIQWA18KivyCIjPzhEOhT6Pvm2InDRlsTj0nE6Gbo0CycuKO/t4+UtbPFXez9X6qLD9HTMJ/9oAETBfaLRo5AMIvLOHH00bIFhPY22RvTOvQXiCKiMkzAwGLX6f3nIrhHhAeTfuLk3drbXQVN9J35UNc3q0TGbEwylcxuT0aA1Vy+V3rF0gDWOmT5Sgc566OhJBuLroHFvhGH3bWETWg0jhACGdaCA==

$ aws sqs delete-message --queue-url "${SQS_QUEUE_URL}" \
  --receipt-handle ${SQS_MESSAGE_RECEIPT_HANDLE1}

$ aws sqs get-queue-attributes --queue-url ${SQS_QUEUE_URL} --attribute-names All | jq '.Attributes.ApproximateNumberOfMessages'
"4"
※Attributes.ApproximateNumberOfMessagesが1つ減ったことを確認

後処理

1.キュー削除

$ aws sqs delete-queue --queue-url "${SQS_QUEUE_URL}"
$ aws sqs list-queues

感想

これだけだとやっぱりイメージがわきづらいので、次はアプリを絡めて何かしたいと思います。ヾ(´∀`)ノキャッキャ