非同期キュー処理でお世話になる SQS 入門です。 SQS は使っているけど、自分で構築したことがなかったので受講しました。 資料は connpass からリンクされている こちら 。
AWS 全般の説明
- AWSの勉強は公式ドキュメントが基本
- ただし、サービスごとに書いているチームが違うので差はある
- サポートも質の割には値段が安いのでぜひとも契約を
- 注意としては特定事象の問合せは契約アカウントのみに限るところ
ハンズオン
CLI での操作とあわせて、マネジメントコンソールで出来上がったキューを見ながらやるのがおすすめとのこと。 以下、記載内容はハンズオン資料を自分でやり直したメモ。 もとの資料のほうが丁寧なので基本的にはそちらを参照ください。
新しいキューの作成
適当なキューの名前 SQS_QUEUE_NAME="handson-cli-sqs-queue"
を環境変数に設定して新しいキューを作る。
$ aws sqs create-queue --queue-name ${SQS_QUEUE_NAME} { "QueueUrl": "https://queue.amazonaws.com/XXXXXXXXXXXX/handson-cli-sqs-queue" }
作ったキューを確認する。
$ aws sqs list-queues --queue-name-prefix ${SQS_QUEUE_NAME} --query "QueueUrls[?contains(@, \`${SQS_QUEUE_NAME}\`)]" --output text https://queue.amazonaws.com/XXXXXXXXXXXX/handson-cli-sqs-queue
キュー属性の変更
VisibilityTimeout
は、不可視属性(処理中に見えなくなる)時間の設定。
1分にする場合 VisibilityTimeout=60
をパラメータにわたす。
先程作ったキューのURLも SQS_QUEUE_URL
に取り出して処理をすると楽。
set-queue-attributes
で設定を行う。
$ SQS_QUEUE_URL=$( aws sqs get-queue-url --queue-name ${SQS_QUEUE_NAME} --output text ) $ aws sqs set-queue-attributes --queue-url ${SQS_QUEUE_URL} --attributes VisibilityTimeout=60
確認は、 get-queue-attributes
。
$ aws sqs get-queue-attributes --queue-url ${SQS_QUEUE_URL} --attribute-names VisibilityTimeout --query "Attributes.VisibilityTimeout" --output text 60
メッセージの送信
send-message
でメッセージ送信
$ aws sqs send-message --queue-url "${SQS_QUEUE_URL}" --message-body "Hello World!" { "MD5OfMessageBody": "b10a8db164e0754105b7a99be72e3fe5", "MessageId": "0a0ac318-9fd7-4590-9f28-XXXXXXXXXX" }
MD5 と MessageId がとれる。SQS は、重複して送信される可能性があるから MessageId は大事。
AWS コンソールで確認すると 利用可能なメッセージ
が増えているのが確認できるはず。
CLI で取得する場合はこう。
$ aws sqs get-queue-attributes --queue-url ${SQS_QUEUE_URL} --attribute-names ApproximateNumberOfMessages --query 'Attributes.ApproximateNumberOfMessages' --output text 1
メッセージの受信
receive-message
でメッセージ受信。
$ aws sqs receive-message --queue-url "${SQS_QUEUE_URL}" { "Messages": [ { "MessageId": "0a0ac318-9fd7-4590-9f28-XXXXXXXXXX", "ReceiptHandle": "XXXXXXXXXX, "MD5OfBody": "b10a8db164e0754105b7a99be72e3fe5", "Body": "Hello World!" } ] }
繰り返して receive-message
すれば、メッセージが存在する数だけ取得できる。
不可視属性の時間の間は、同じメッセージは基本取得できない。
不可視属性の時間を経過すると再度取得できる。
重複を考えて、 MessageId
に注意して処理をする必要がある。
処理したメッセージは、キューから削除。 SQS_MESSAGE_RECEIPT_HANDLE
に receive-message
で取得したハンドルが必要。
$ aws sqs delete-message --queue-url "${SQS_QUEUE_URL}" --receipt-handle ${SQS_MESSAGE_RECEIPT_HANDLE}
キューの削除
本番運用では不要の項目。テストでキューを作った場合は削除する。
aws sqs delete-queue --queue-url ${SQS_QUEUE_URL}
所感
ハンズオン後のコメントで「SNS のほうがもっとわかりやすい。」「AWS は IAM に始まって IAM に終わる。」と言ってました。 SQS は、メッセージの重複や順番が保証されないなど、デフォルトの設定では気にする点もありますが、複数のサービスを非同期で処理するときには便利な印象です。 SNS では難しい場合に利用を検討すればいいかな。