[AWS入門]Amazon SQS触ってみた

5 min read読了の目安(約5000字

こんにちは、べこです。
AWS認定資格を取ったものの、実際に触ってないサービス多いなぁ〜と思ったので触っていきます。
皆さんもこの記事をきっかけに軽率に触っていきましょう。
今回は記念すべき第一回目、Amazon Simple Queue Service (以下、SQS) です。

対象読者

  • AWS認定資格を取ったものの、実際にSQSを触ったことが無い人
  • AWSに興味がある人
  • AWSを気軽に触ってみたい人

そもそもSQSって何?

Amazon Simple Queue Service (SQS) は、完全マネージド型のメッセージキューイングサービスで、マイクロサービス、分散システム、およびサーバーレスアプリケーションの切り離しとスケーリングが可能です。

SQS を使用すると、あらゆる量のソフトウェアコンポーネント間でメッセージを送信、保存、受信できます。

(引用元:https://aws.amazon.com/jp/sqs/)

とのこと。

AWS環境構築のベストプラクティスである「コンポーネントの疎結合化」に一役買ってくれるサービス、それがSQSです。
こちらの記事 が非常に分かりやすいので、詳細はこちらをご覧ください。

また、SQSには「標準キュー」と「FIFOキュー」があります。
それぞれの特徴は下記の通り。

  • 標準キュー
    • 送信メッセージの順番がバラバラ
    • 送信メッセージに重複あり
    • 秒間リクエストの制限なし
  • FIFO(First-In-First-Out)キュー
    • 送信メッセージの順番が保証
    • 送信メッセージは1回のみ(重複なし)
    • 秒間スループットの制限あり[1]
    • 標準キューに比べると少し割高

触ってみる

SQSを触るにあたり、下記ブログの確認用ソースコードをほぼそのまま使わせて頂きました。
クラスメソッド様、いつもありがとうございます。。。(ここで土下座をする)
AWS再入門ブログリレー SQS編
(記事を書いていたら2020年版の記事も見つけました。AWS再入門ブログリレー Amazon SQS編

前提条件

  • AWSアカウントを作成済みであること

キューの作成

まずは標準キュー

コンソールをぽちぽちして、標準キューを作成します。
タイプは標準キューを選択し、好きな名前を入力しましょう。

あとはデフォルトで、「キューを作成」!
簡単ですね。

続いてFIFOキュー

こちらもコンソールをポチポチしていきます。
FIFOキューの場合、名前の最後に「.fifo」というsuffixを付ける必要があるようです。

「コンテンツに基づく重複排除」を有効にしておきましょう。

あとはデフォルトで大丈夫です。

それぞれのキューにメッセージを送信&受信

今回はCloud9で実行しましたが、お好きな環境から実行して下さい。

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

const QueueUrl = "https://sqs.ap-northeast-1.amazonaws.com/xxxxxxxxxxxx/queue";

const wait = () =>
  new Promise(resolve => {
    setTimeout(() => resolve(""),1000);
  });

function order(burger, amount) {
  const MessageBody = JSON.stringify({ burger, amount })
  // const MessageGroupId = "Group1"
  SQS.sendMessage({
    MessageBody,
    QueueUrl,
    // MessageGroupId,
  }, (err, data) => {
    if (err) return console.error(err, err.stack);
    console.log(data)
  });
}

async function main() {
  order("ハンバーガー", 1);
  await wait();
  order("チーズバーガー", 2);
  await wait();
  order("テリヤキバーガー", 3);
  await wait();
  order("チキンバーガー", 4);
  await wait();
  order("フィッシュバーガー", 5);
}

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

const QueueUrl = "https://sqs.ap-northeast-1.amazonaws.com/xxxxxxxxxxxx/queue";

const receiveMessage = QueueUrl =>
  new Promise((resolve, reject) => {
    const params = {
      QueueUrl,
      MaxNumberOfMessages: 10,
      WaitTimeSeconds: 10
    };
    sqs.receiveMessage(params, (err, data) => {
      if (err || !data.Messages) return reject(err);
      return resolve(data);
    });
  });

const deleteMessage = (ReceiptHandle, QueueUrl) => {
  const params = {
    QueueUrl,
    ReceiptHandle
  };
  sqs.deleteMessage(params, (err, data) => {
    if (err) return console.error(err);
    console.log("delete queue");
    console.log(data);
  });
};

const createBurger = burger =>
  new Promise(resolve => {
    setTimeout(() => resolve("へい、お待ち!"), 100);
  });

async function main() {
  while (true) {
    const data = await receiveMessage(QueueUrl).catch(console.error);
    if (!data) continue;
    for (const message of data.Messages) {
      // ハンバーガーを作る
      const order = JSON.parse(message.Body);
      // 重い処理
      console.log(order.burger, order.amount + "個")
      const result = await createBurger(order.burger);
      console.log(result)
      deleteMessage(message.ReceiptHandle, QueueUrl);
    }
  }
}

main();

メッセージの順番が確実に分かるようにするため、orderの間に待機処理を挟んでます。
また、FIFOキューの場合は cashier.js の下記箇所のコメントアウトを外して下さい。

  // const MessageGroupId = "Group1"
    // MessageGroupId,

cashier.js → chef.js の順で実行します。

標準キューの実行結果

重複は無いものの、順番はバラバラですね。

FIFOキューの実行結果

おお!ちゃんと順番通りに受信出来てます。いいですね。

まとめ

今回はSQSを触ってみました。
実際に触ってみて気づいたことを含め、改めて標準キューとFIFOキューについてまとめてみます。

  • 標準キュー
    • 送信メッセージの順番がバラバラ
    • 送信メッセージに重複あり
    • 秒間リクエストの制限なし
  • FIFO(First-In-First-Out)キュー
    • 送信メッセージの順番が保証
    • 送信メッセージは1回のみ(重複なし)
    • 秒間スループットの制限あり
    • 標準キューに比べると少し割高
    • 重複を排除する値が特に無い場合、作成時に「コンテンツに基づく重複排除」を有効にする必要がある
    • 送信メッセージには MessageGroupID が必要

今回気付けることも多く、非常に楽しかったです。
元々好きなサービスだったSQSがより好きになりました。

皆さんも是非SQSを触ってみて下さい。

脚注
  1. FIFOのスループットは秒間300メッセージでしたが、2021年5月27日のアップデートで、秒間3,000メッセージまで処理出来るようになったらしいです。10倍!!!ただ、本記事執筆時点(2021年6月1日)では期間限定のプレビュー機能としての提供とのこと。 ↩︎