AWSのSQSの使い方

AWSのSQSの使い方

AWS SQSは何気に便利です。時間がかかる処理はSQSにエンキューしておいて、バックエンドで処理して、フロントでは先に「処理終了しました。」みたいな感じのことができます。実際の処理はバックエンドでゆっくり別のLambdaとかBatchで処理しておく仕組みです。(非同期処理)

2019/4/21時点で東京リージョンでfifoキューが使えるようになっています。先入れ先出しが保証されるようになって、これはこれで大変便利です。

Amazon Web Services ブログ

AWSのSQSの使い方

fifoキューの命名規約は最後は.fifoが必要だそうです。

AWSのSQSの使い方

Lambda(node.js8.10)からエンキューしてみます。

const AWS = require('aws-sdk');
const SQS = new AWS.SQS({ apiVersion: '2012-11-05' });
exports.handler = async (event) => {
  const params = {
    MessageBody: "JSON.stringify({'userId': 'takahashi'})",
    QueueUrl: 'https://sqs.xxx.amazonaws.com/xxx/b.fifo',
    MessageGroupId:'465789',
    MessageDeduplicationId: 'fight1'
  };

  await SQS.sendMessage(params, (err, data)=>{
    if (err) console.log(err);
  }).promise();
};

AWSのSQSの使い方

エンキューされていることが確認できます。

以前、数分間隔でポーリングしておいてエンキューされていたらLambdaを実行するといったことを実装したことがあります。この時はポーリングするプログラムを別途作ったりしましたが、イベントソースにSQSがいつの間にか追加されているのでどうもSQSからLambdaを実行できるようです。

Amazon Web Services ブログ

SQSをトリガーにするLambdaには「AWSLambdaSQSQueueExecutionRole」をアタッチしておく必要があります。

イベントソースにするにはFIFOじゃなくて標準キューのみっぽいです。普通に考えたらイベントソースがFIFOである必要はない気もしますね。

AWSのSQSの使い方

こんなデザインになります。これはSQSにエンキューされたらLambdaが実行されるデザインです。

この前段で、LambdaがSQSをエンキューしたら、上のLambdaが実行されるというイメージです。

ちなみにSQSのLambdaトリガー欄は以下のように1つ追加されているはずです。

AWSのSQSの使い方

SQSのLambdaトリガーから✖印をクリックすればトリガー削除することが可能になっています。

こんな感じですが、とりあえずこれでLambdaA → SQS → LambdaBが実行できます。

デッドレターキュー

どうしてもキューが残ってしまったりします。

そういうときの為にデッドレターキューを設定しておくと便利です。この設定はマストでしておいた方が良いと思います。

普通のキューに対してデッドレターキューというのを設定します。

キュー名 種類
a キュー
b デッドレターキュー

設定したポーリング回数(最大受信数)キューを受信しようとしたらデッドレターキューに移動します。

再処理ポリシーにデッドレターキューが表示されるようになります。

AWSのSQSの使い方

キューを受信して処理中のメッセージに移動する

エンキューすると利用可能なメッセージにキュー数が表示されます。

これを受信すると処理中のメッセージに移動されます。処理中に移動する時間は「デフォルトの可視性タイムアウト」で指定した時間になります。処理中の間はこのメッセージを他のWorkerが取得することができなくなります。

以下は受信するLambda(node.js8.10)です。

const AWS = require('aws-sdk');
const SQS = new AWS.SQS({ apiVersion: '2012-11-05' });
exports.handler = async (event) => {
  const params = {
    QueueUrl: 'https://sqs.ap-northeast-1.amazonaws.com/xxxxxxxabc/a',
    MaxNumberOfMessages: 10,
    VisibilityTimeout: 10
  };
  await SQS.receiveMessage(params, (err, data) => {}).promise();
};

Lambdaを実行すると「処理中のメッセージ」に移動します。

AWSのSQSの使い方

「デフォルトの可視性タイムアウト」が経過したら「利用可能なメッセージ」に戻ります。

もう一度受信すると「処理中のメッセージ」に移動しますが、デッドレターキューを指定していると、最大受信数を超えるとデッドレターキューに移動されてしまいます。

Delayキュー(配信遅延)

キューの配信遅延を設定することによってエンキューされるメッセージを一定時間見えなくするようにしてくれます。(0秒から15分までの設定ができます)

これはキュー全体に対して設定します。

メッセージタイマー

キューにメッセージタイマーを設定してエンキューされるメッセージを一定時間見えなくすることができます。この設定はDelayキューの設定を上書きます。(メッセージタイマーが優先されます)

これはメッセージに対して設定します。

const AWS = require('aws-sdk');
const SQS = new AWS.SQS({ apiVersion: '2012-11-05' });
exports.handler = async (event) => {
  const params = {
    MessageBody: "JSON.stringify({'userId': 'takahashi'})",
    QueueUrl: 'https://sqs.ap-northeast-1.amazonaws.com/xxxxxxx/a',
    DelaySeconds: 30
  };

  await SQS.sendMessage(params, (err, data)=>{
    if (err) console.log(err);
  }).promise();
};

参考サイト

Amazon SQSメッセージタイマー - Amazon Simple Queue Service
Amazon SQSメッセージタイマーを使用して、キューのメッセージの初期非表示期間を指定する方法について説明します。

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

タイトルとURLをコピーしました