LoginSignup
11
11

More than 1 year has passed since last update.

【AWS】SQSの使い方を知る

Last updated at Posted at 2021-12-17

image.png

はじめに

どーも、のぶこふです。
この記事はGFAMアドベントカレンダー2021の18日目の記事です。

なんか好きなんですよね、SQS。
試験では、SNSとか、SESとか、MQとかと一緒に出題されることが多いですね。
良いですよねー、SQS。
まぁ、全く使ったこともないので、完全な片思い状態ですがっ!

ということで、今回はSQSとの馴れ初め回です。

概要とかを書いていると、全然「触ってみた」に辿り着けないので、やってみるファーストを意識していこうと思います。

何がしたいのか?

  • Amazon SQS の使い方を知る。使ってみる。

今回のサービス一覧

Service名とか 概要
SQS1 フルマネージド型のメッセージキューイングサービス

AWSが提供するメッセージサービス

  • Amazon Simple Notification Service(SNS)
  • Amazon Simple Queue Service(SQS)
  • Amazon MQ

大分類で3つ。
ストリーミングなら、Kinesisの名前が挙がりますね。

image.png

SQS

参考:Blackbelt
image.png

image.png

やってみる

キューの作成

なにはともあれ、マネジメントコンソールからアクセスして、「キューを作成」します
image.png
image.png

  • タイプや名前等を設定します。
    • 可視性タイムアウトやショート・ロングポーリング(メッセージ受信待機時間)などの設定もここで行います
    • 暗号化やDLQ(デッドレターキュー)と言った設定もここで行います

メッセージ登録スクリプトを作成する

sendMessage.js
const AWS = require("aws-sdk")
// 利用するリージョンを指定する
const SQS = new AWS.SQS({ region: "ap-northeast-1" })

// アカウントIDとキューの名前は各人の値を設定してください
const QueueUrl = "https://sqs.ap-northeast-1.amazonaws.com/123456789012/my_queue"

async function sendMessage(message) {
  try {
    const MessageBody = JSON.stringify({ message })
    const result = await SQS.sendMessage({ MessageBody, QueueUrl }).promise()
    console.log(result)
  } catch (e) {
    console.error(e)
  }
}

sendMessage("こんにちは")

メッセージ登録スクリプトを実行する

先程作成したスクリプトを実行します。
CloudShellからなら、Nodeが入っているので楽です。

$ node sendMessage.sh
{
  ResponseMetadata: { RequestId: 'af4da524-bd5b-55c0-ba7f-ff12a66fe0d1' },
  MD5OfMessageBody: '04366f504cabfb9b64545bd8f0a6012b',
  MessageId: '65f6c3eb-8076-4e9a-adbb-22b4b0bd6f96'
}

「利用可能なメッセージ」が増えていますね。
image.png

お試しでもう一度実行しておきます。

image.png

増えました。

メッセージ取得スクリプトを作成する

登録が終わったので、メッセージを取得するスクリプトを作成します。
CloudShellなら、SDKga・・・

processingMessage.js
const AWS = require("aws-sdk")
const SQS = new AWS.SQS({ region: "ap-northeast-1" })

const QueueUrl = "https://sqs.ap-northeast-1.amazonaws.com/123456789012/my_queue"

async function processingMessage() {
  try {
    const params = {
      QueueUrl,
      MaxNumberOfMessages: 10, // 最大取得メッセージ
      WaitTimeSeconds: 20 // ロングポーリング
    }
    const messages = await SQS.receiveMessage(params).promise() // メッセージを取得
    for (message of messages.Messages) {
      const body = JSON.parse(message.Body)
      console.log(message)
      console.log(body.message) //メッセージの実態
      //重い処理
      await new Promise((resolve, reject) => {
        setTimeout(resolve, 1000)
      })
      const params =  {
        QueueUrl,
        ReceiptHandle: message.ReceiptHandle
      }
      // キューの削除箇所を、あえてコメントアウト
      // const deleteResult = await SQS.deleteMessage(params).promise()
      // console.log(deleteResult)
    }

  } catch (e) {
    console.error(e)
  }
}

processingMessage()

キューを削除する処理の箇所を、あえてコメントアウトしてみました。
どのように動くのか確認してみます。

メッセージ取得スクリプトを実行する

実行してみると・・・

$ node processingMessage.js
{
  MessageId: 'e190dd19-a4f0-4af3-b9b3-152ef436bc09',
  ReceiptHandle: 'AQEB5C01TO0OtrOpCBn7ahixSm9Ou3AEPGVlsE31lPIY8AZF/hZZO+ZW80QdloS333cUNQF22tO9PNaIvZg7634XyYeHjhaXKFr7N/PKpZOqt/BGmHXFH2AvlipX/K32TJmUunjy+ab6C4MM/L3nZp/9dqG8lkQp44K7JyvykDVrd6axFOCaTVfJCFEiil5F4OBZkGQ6ASM7jfevmxSONoQzWTzVstzvv56FY3lEW0RCSwMCO5oie3UiokC/UyVTOFvWBvGuOf4hP4jhJ2uhsa5igMpN7V6l7lKwk5CEAYT9UOZ3vH1jLAGD06wi8louybjRreh+sYwfi007HE+H0g0GWsTe8iC/T/EmmtIKN4ZHGCZwnT0qilC4tQ59dJL471FEbIuDKc+tp6kha7jDoVJBIA==',
  MD5OfBody: '04366f504cabfb9b64545bd8f0a6012b',
  Body: '{"message":"こんにちは"}'
}
こんにちは

登録していた内容が返ってきました。
マネジメントコンソールを見てみると・・・?

image.png

変わりないですね。

削除処理を入れて、再実行する

先程のスクリプトから、コメントアウトしていた箇所を取り外し、削除処理を戻します。

processingMessage.js
      const params =  {
        QueueUrl,
        ReceiptHandle: message.ReceiptHandle
      }
-      // const deleteResult = await SQS.deleteMessage(params).promise()
-      // console.log(deleteResult)
+      const deleteResult = await SQS.deleteMessage(params).promise()
+      console.log(deleteResult)
    }

実行してみると・・・?

$ node processingMessage.js
{
  MessageId: '65f6c3eb-8076-4e9a-adbb-22b4b0bd6f96',
  ReceiptHandle: 'AQEBfGADqsygPEpBpuU0HYxYd0/qaYk2E8VbOXjv9YjVM8n+CTmMNGQwPuEsMbD3SZmG1r4k6nXy5tjOp/8gmCn+uYtMMbywgt9rcJonzut/u0LbAK84sIV7UHGBbkLTRM25+iomwL72gN5qJXcFiAXwXrIyX+MJmMcyrXWkvE24Sac0z3viPbcquqxFUKBqK38UbBiRJnguFYq2xrlQXEgulT9t8D2Co8OcjkpQHOvoA5fTq68jq4gh0BUDG1VtHpivn+RUWEm4z9F/ZE9oAlABnKWv74RmAn9//tjsiGFYczBPUsIoPjIL6fnY/e2MbuVXxb1V91n14wR40ttUvYTBOG8KN+zENNl7oPxVXFyA/QOSOp6ETqNcSs5k2EV1TXz8XREXw7x58300z6LbRT12NA==',
  MD5OfBody: '04366f504cabfb9b64545bd8f0a6012b',
  Body: '{"message":"こんにちは"}'
}
こんにちは
{
  ResponseMetadata: { RequestId: '236ddd31-5701-529d-815e-8707488bbf4c' }
}

image.png

利用可能なメッセージも減っていますね!

メッセージが無い時に、取得するとどうなるのか?

気になったので、利用可能メッセージが0の状態で叩いてみました。
どうやら、エラーが返ってくるようですね。

image.png

おわりに

今回は、SQSを使ってみました。
お友達にもなれてませんが、一歩近づくことができました。
使ってみて、「やっぱり、なんか良いな」という思いは深まった気がします。

Lambdaからだと、正常処理の場合はメッセージ削除をしてくれるそうなので、どこで使うかを意識してスクリプトを作成する必要がありそうですね。

今回はここまでです。
ありがとうございました。

11
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11