🦷

node.js で Amazon SQS のメッセージキューを受信する

2022/12/29に公開

Amazon SQS のメッセージキューから最大10個のメッセージを受け取ってきて処理するプログラムを書いていました。

tooteater.js
#!/usr/bin/env node --trace-warnings
const JSONBig = require('json-bigint')

/// Amazon SQS のクライアントをセットアップする
const AWS = require('aws-sdk')
AWS.config.loadFromPath('./aws-credential.json')
const sqs = new AWS.SQS({ apiVersion: '2012-11-05' })
const queueUrl = 'https://sqs.ap-northeast-1.amazonaws.com/xxxxxxxxxxxxxxx/QueueName'

var run = async () => {
  while (true) {
    try {
      const data = await sqs.receiveMessage({
        QueueUrl: queueUrl,
        MaxNumberOfMessages: 10,
        WaitTimeSeconds: 20
      }).promise()

      if (!data.Messages) {
        continue
      }

      for (let i = 0; i < data.Messages.length; ++i) {
        const message = data.Messages[i]

        /// メッセージの中の ID が 32bit 整数を超えていることがあるので JSON.parse で失敗したときは JSONBig.parse でリトライする
        const msg = JSON.parse(message.Body)
        let payload = {}
        if (msg.Payload.id) {
          payload = msg.Payload
        } else {
          payload = JSONBig.parse(msg.Payload)
        }

        /// SQS の中身のメッセージ種別ごとの処理に分岐する
        switch (msg.Type) {
          case 'update':
            /// Updateの処理をする
            break

          case 'delete':
            /// Delete の処理をする
            break
        }

        /// 正常に処理が完了したら SQS からメッセージを削除する
        await sqs.deleteMessage({
          QueueUrl: queueUrl,
          ReceiptHandle: message.ReceiptHandle
        }).promise()
      }

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

run()

Discussion