Amazon SQS

Amazon Simple Queue Service (SQS) memungkinkan Anda untuk mengirim, menyimpan, dan menerima pesan antarkomponen perangkat lunak berapa pun volumenya, tanpa kehilangan pesan atau memerlukan layanan lain agar dapat tersedia

Create queue

Queue type Standard

aws sqs create-queue --queue-name my-queue

Queue type FIFO

aws sqs create-queue --queue-name my-queue.fifo --attributes FifoQueue=true

List queues

aws sqs list-queues

Send message

Untuk send message menggunakan nodejs. Pertama install module berikut

npm install @slack/web-api
npm install aws-sdk

Standard

Buat dan edit file standard.js

const AWS = require('aws-sdk');
const sqs = new AWS.SQS({ region: 'ap-southeast-1', accessKeyId: 'XXX', secretAccessKey: 'XXXXXX' });

const queueUrl = 'https://sqs.ap-southeast-1.amazonaws.com/XXXXXX'; //ganti queueUrl dengan URL antrian SQS yang digunakan
//const messageGroupId = '54321'; //ganti YOUR_MESSAGE_GROUP_ID dengan ID grup pesan yang digunakan

const params = {
  MessageBody: 'Coba SQS Standard', //ganti pesan dengan pesan yang ingin dikirim
  QueueUrl: queueUrl,
  //MessageGroupId: messageGroupId,
  //MessageDeduplicationId: `${Date.now()}` //tambahkan parameter ini untuk menghindari pesan duplikat
};

sqs.sendMessage(params, (err, data) => {
  if (err) {
    console.log("Error", err);
  } else {
    console.log("Pesan berhasil dikirim", data.MessageId);
  }
});

Selanjutnya jalankan dengan perintah node

node standard.js

FIFO

Buat dan edit file fifo.js

const AWS = require('aws-sdk');
const sqs = new AWS.SQS({ region: 'ap-southeast-1', accessKeyId: 'XXX', secretAccessKey: 'XXXXXX' });

const queueUrl = 'https://sqs.ap-southeast-1.amazonaws.com/XXXXXX.fifo'; //ganti queueUrl dengan URL antrian SQS yang digunakan
const messageGroupId = '1234'; //ganti YOUR_MESSAGE_GROUP_ID dengan ID grup pesan yang digunakan

const params = {
  MessageBody: 'Coba SQS FIFO', //ganti pesan dengan pesan yang ingin dikirim
  QueueUrl: queueUrl,
  MessageGroupId: messageGroupId,
  MessageDeduplicationId: `${Date.now()}` //tambahkan parameter ini untuk menghindari pesan duplikat
};

sqs.sendMessage(params, (err, data) => {
  if (err) {
    console.log("Error", err);
  } else {
    console.log("Pesan berhasil dikirim", data.MessageId);
  }
});

Cek queues

Jika output pada saat menjalankan perintah node tidak muncul error seharusnya queue message berhasil terkirim atau masuk kedalam antrian

send queue

Receive message

Untuk receive message menggunakan Web Slack API untuk implementasinya

Standard queue

Buat dan edit file bacastandard.js

const AWS = require('aws-sdk');
const { WebClient } = require('@slack/web-api');

// Konfigurasi AWS SDK
const sqs = new AWS.SQS({
  region: 'ap-southeast-1',
  accessKeyId: 'XXX',
  secretAccessKey: 'XXXXXX'
});

// Konfigurasi Slack Web API
const slackWebClient = new WebClient('XXX');

// Nama antrian SQS
const queueUrl = 'https://sqs.ap-southeast-1.amazonaws.com/XXXXXX';

// Fungsi untuk mengambil pesan dari SQS dan mengirimkannya ke Slack
async function processMessages() {
  const params = {
    QueueUrl: queueUrl,
    MaxNumberOfMessages: 10,
    WaitTimeSeconds: 20
  };
  try {
    const data = await sqs.receiveMessage(params).promise();
    if (data.Messages) {
      for (const message of data.Messages) {
        // Kirim pesan ke Slack
        const result = await slackWebClient.chat.postMessage({
          channel: '#general',
          text: message.Body
        });
        console.log(`Message sent to Slack: ${result.ts}`);
      }
    }
  } catch (err) {
    console.log(err);
  }
}

// Panggil fungsi setiap 10 detik
setInterval(processMessages, 10000);

Jalankan dengan perintah node

node bacastandard.js

Queue FIFO

const AWS = require('aws-sdk');
const { WebClient } = require('@slack/web-api');

// Konfigurasi AWS SDK
const sqs = new AWS.SQS({
  region: 'ap-southeast-1',
  accessKeyId: 'XXX',
  secretAccessKey: 'XXXXXX'
});

// Konfigurasi Slack Web API
const slackWebClient = new WebClient('XXX');

// Nama antrian SQS
const queueUrl = 'https://sqs.ap-southeast-1.amazonaws.com/XXXXXX.fifo';

// Fungsi untuk mengambil pesan dari SQS dan mengirimkannya ke Slack
async function processMessages() {
  const params = {
    QueueUrl: queueUrl,
    MaxNumberOfMessages: 10,
    WaitTimeSeconds: 20
  };
  try {
    const data = await sqs.receiveMessage(params).promise();
    if (data.Messages) {
      for (const message of data.Messages) {
        // Kirim pesan ke Slack
        const result = await slackWebClient.chat.postMessage({
          channel: '#general',
          text: message.Body
        });
        console.log(`Message sent to Slack: ${result.ts}`);
        // Tandai pesan sebagai terlihat dengan menetapkan 'visibility timeout'
        const changeVisibilityParams = {
          QueueUrl: queueUrl,
          ReceiptHandle: message.ReceiptHandle,
          VisibilityTimeout: 0 // tetapkan ke 0 untuk menandai pesan sebagai terlihat
        };
        await sqs.changeMessageVisibility(changeVisibilityParams).promise();
      }
    }
  } catch (err) {
    console.log(err);
  }
}

// Panggil fungsi setiap 10 detik
setInterval(processMessages, 10000);

Cek message

test msg

Cek jumlah queue message

Buat dan edit file jumlahsqs.js

const AWS = require('aws-sdk');
const { WebClient } = require('@slack/web-api');

const region = 'ap-southeast-1';
const accessKeyId = 'XXX';
const secretAccessKey = 'XXXXXX';
const slackBotToken = 'XXX';
const slackChannel = '#general';

const sqs = new AWS.SQS({ region, accessKeyId, secretAccessKey });
const slackWebClient = new WebClient(slackBotToken);

const getQueueAttributes = async (queueUrl) => {
  const { Attributes } = await sqs.getQueueAttributes({
    QueueUrl: queueUrl,
    AttributeNames: ['ApproximateNumberOfMessages', 'ApproximateNumberOfMessagesNotVisible'],
  }).promise();
  return Attributes;
};

const processMessages = async (minMessageCount) => {
  try {
// Ganti `QueueNamePrefix` sesuai nama queue
    const { QueueUrls } = await sqs.listQueues({ QueueNamePrefix: 'slack' }).promise();
    for (const queueUrl of QueueUrls) {
      const queueName = queueUrl.split('/').pop();
      const { ApproximateNumberOfMessages, ApproximateNumberOfMessagesNotVisible } = await getQueueAttributes(queueUrl);

      if (ApproximateNumberOfMessages >= minMessageCount) {
      const message = `Messages available in ${queueName}: ${ApproximateNumberOfMessages}, messages in flight: ${ApproximateNumberOfMessagesNotVisible}`;
      await slackWebClient.chat.postMessage({ channel: slackChannel, text: message });
     }
    }
  } catch (error) {
    console.error(error);
  }
};

setInterval(() => processMessages(1), 60000);

Jalankan dengan perintah node

node jumlahsqs.js
jumlah queue

Hapus queue messages

Menghapus antrian pada queue standard dan fifo

Standard

Buat dan edit file hapusstandard.js

const { WebClient } = require("@slack/web-api");
const AWS = require("aws-sdk");

// Konfigurasi AWS SQS
const sqs = new AWS.SQS({
  region: "us-east-1",
  accessKeyId: "ACCESS_KEY_ID",
  secretAccessKey: "SECRET_ACCESS_KEY",
});

// URL SQS
const queueUrl = "SQS_QUEUE_URL";

// Konfigurasi Slack API
const slackBotToken = "SLACK_BOT_TOKEN";
const slackChannel = "#general";
const slackWebClient = new WebClient(slackBotToken);

// Fungsi untuk menghapus pesan dari SQS
async function deleteMessagesFromQueue(receiptHandles) {
  const deleteParams = {
    Entries: receiptHandles.map((handle, index) => ({
      Id: `${index}`,
      ReceiptHandle: handle,
    })),
    QueueUrl: queueUrl,
  };

  try {
    const response = await sqs.deleteMessageBatch(deleteParams).promise();
    console.log(`${response.Successful.length} messages deleted`);
  } catch (error) {
    console.error("Error deleting messages from SQS", error);
  }
}

// Fungsi untuk mengirim notifikasi ke Slack
async function sendSlackNotification(message) {
  try {
    const response = await slackWebClient.chat.postMessage({
      channel: slackChannel,
      text: message,
    });
    console.log("Slack notification sent: ", response.ts);
  } catch (error) {
    console.error("Error sending Slack notification", error);
  }
}

// Fungsi utama
async function main() {
  // Ambil pesan dari SQS
  const receiveParams = {
    QueueUrl: queueUrl,
    MaxNumberOfMessages: 10,
    VisibilityTimeout: 30,
    WaitTimeSeconds: 20,
  };

  try {
    const response = await sqs.receiveMessage(receiveParams).promise();
    const messages = response.Messages || [];
    console.log(`${messages.length} messages received`);

    if (messages.length > 0) {
      // Proses pesan
      const receiptHandles = messages.map((message) => message.ReceiptHandle);
      await deleteMessagesFromQueue(receiptHandles);
      await sendSlackNotification(
        `Successfully deleted ${messages.length} messages from SQS`
      );
    }
  } catch (error) {
    console.error("Error receiving messages from SQS", error);
  }
}

// Panggil fungsi utama
main();

Jalankan dengan perintah node

node hapusstandard.js

FIFO

Buat dan edit file hapusfifo.js

const AWS = require('aws-sdk');
const { WebClient } = require('@slack/web-api');

const sqs = new AWS.SQS({
  region: 'ap-southeast-1',
  accessKeyId: 'YOUR_ACCESS_KEY_ID',
  secretAccessKey: 'YOUR_SECRET_ACCESS_KEY'
});

const web = new WebClient('SLACK_BOT_TOKEN');

const queueUrl = 'YOUR_QUEUE_URL';

async function deleteMessage() {
  try {
    const { Messages } = await sqs.receiveMessage({
      QueueUrl: queueUrl,
      MaxNumberOfMessages: 1,
      VisibilityTimeout: 30,
      WaitTimeSeconds: 20,
      AttributeNames: ['All'],
      MessageAttributeNames: ['All']
    }).promise();

    if (!Messages) {
      console.log('No message to process');
      return;
    }

    const message = Messages[0];

    // Do something with the message here, e.g. send it to Slack
    const slackResponse = await web.chat.postMessage({
      channel: '#general',
      text: `Received a message from SQS: ${message.Body}`
    });

    console.log('Slack response:', slackResponse);

    // Delete the message from the queue
    const deleteParams = {
      QueueUrl: queueUrl,
      ReceiptHandle: message.ReceiptHandle
    };

    await sqs.deleteMessage(deleteParams).promise();

    console.log(`Message ${message.MessageId} deleted from the queue`);
  } catch (error) {
    console.error(error);
  }
}

setInterval(() => {
  deleteMessage();
}, 5000);

Setelah script dijalankan dengan perintah node seharusnya total message akan berkurang

Hapus queue

aws sqs delete-queue --queue-url https://sqs.us-east-1.amazonaws.com/80398EXAMPLE/MyNewerQueue