Blog#104: AWS SQS: 初心者開発者のための究極ガイド

image.png

こんにちは、私は東京からのフルスタックWebデベロッパーであるTUANです。

今後の便利で面白い記事を見逃さないように、私のブログをフォローしてください。

「AWS SQS」は完全に管理されたメッセージキューサービスで、マイクロサービス、分散システム、サーバーレスアプリケーションを解きほぐし、スケールアップさせることができます。SQSはメッセージ指向ミドルウェアの管理や運用に関連する複雑さやオーバーヘッドを取り除き、開発者が差別化された作業に集中することができます。

「Node.js」は、Chromeの「V8」JavaScriptエンジン上に構築されたJavaScriptランタイムです。開発者は、サーバーサイドでJavaScriptを実行して、高速かつスケーラブルなネットワークアプリケーションを作成することができます。Node.jsはバックエンドサービスの作成、リアルタイムアプリの開発、オートメーションタスクの実行などに広く使用されています。

SQSとNode.jsを一緒に使用することで、大量のデータを処理し、複数のタスクを同時に実行することができる、強力で柔軟なアプリケーションを作成することができます。

AWSでSQSキューを設定する

Node.jsでSQSを使う前に、AWSで新しいキューを作成する必要があります。以下の手順に従って行えば作成できます:

  1. AWS管理コンソール内のSQSのホームページにアクセスします。
  2. 「新しいキューを作成」ボタンをクリックします。
  3. キューに名前を付け、「標準キュー」オプションを選択します。
  4. 「新しいキューを作成」ボタンをクリックして新しいキューを作成します。

キューが設定されたら、そこにメッセージを送受信することができます。

Node.jsでSQSキューにメッセージを送信する

Node.jsアプリケーションからSQSキューにメッセージを送信するには、Node.js用のAWS SDK for JavaScript(aws-sdk)を使用する必要があります。このSDKは、Node.jsを使用してSQSとやり取りするためのクライアントを提供します。

SQSキューにメッセージを送信するSDKの使用例

const AWS = require('aws-sdk');
const sqs = new AWS.SQS();

// Create the message to send to the SQS queue
const message = {
  message: 'Hello, SQS!'
};

// Set the parameters for sending the message to the SQS queue
const params = {
  MessageBody: JSON.stringify(message),
  QueueUrl: 'https://sqs.us-east-1.amazonaws.com/1234567890/MyQueue'
};

// Send the message to the SQS queue
sqs.sendMessage(params, (err, data) => {
  if (err) {
    console.log(`Error sending message to SQS: ${err}`);
  } else {
    console.log(`Successfully sent message to SQS: ${data}`);
  }
});

Node.jsでSQSキューからメッセージを受信して処理する

SQSキューにメッセージを送信したら、Node.jsアプリケーションでそれらを受信し処理することができます。それにはNode.js用のAWS SDK for JavaScript(aws-sdk)を使用します

SQSキューから新しいメッセージを取得して受信したメッセージを処理する例:

const AWS = require('aws-sdk');
const sqs = new AWS.SQS();

// Set the parameters for receiving messages from the SQS queue
const params = {
  QueueUrl: 'https://sqs.us-east-1.amazonaws.com/1234567890/MyQueue',
  MaxNumberOfMessages: 10
};

// Poll the SQS queue for new messages
setInterval(() => {
  sqs.receiveMessage(params, (err, data) => {
    if (err) {
      console.log(`Error receiving message from SQS: ${err}`);
    } else {
      console.log(`Successfully received message from SQS: ${data}`);
      // Process the message
      // ...
    }
  });
}, 5000);

この例では、setInterval関数を使用して、5秒ごとにSQSキューから新しいメッセージを取得します。メッセージを受信したら、それはコンソールに記録され、アプリケーションによって処理されます。

ユースケース

1.バックグラウンドジョブ処理

SQSはNode.jsアプリケーションで非同期にバックグラウンドジョブを処理するために使用できます。例えば、電子メールを送信したり、レポートを生成したり、古いデータを消去したりします。

この用途では、SQSを使用してNode.jsアプリケーションで非同期にバックグラウンドジョブを処理できます。例えば、電子メールを送信する場合:

const AWS = require('aws-sdk');
const sqs = new AWS.SQS();
const ses = new AWS.SES();

// Create the message to send to the SQS queue
const message = {
  email: 'example@example.com',
  subject: 'Hello, SQS!',
  body: 'This is a background job processed by SQS'
};

// Set the parameters for sending the message to the SQS queue
const params = {
  MessageBody: JSON.stringify(message),
  QueueUrl: 'https://sqs.us-east-1.amazonaws.com/1234567890/emailQueue'
};

// Send the message to the SQS queue
sqs.sendMessage(params, (err, data) => {
  if (err) {
    console.log(`Error sending message to SQS: ${err}`);
  } else {
    console.log(`Successfully sent message to SQS: ${data}`);
  }
});

setInterval(() => {
  sqs.receiveMessage({
    QueueUrl: 'https://sqs.us-east-1.amazonaws.com/1234567890/emailQueue',
    MaxNumberOfMessages: 10
  }, (err, data) => {
    if (err) {
      console.log(`Error receiving message from SQS: ${err}`);
    } else {
      const emailParams = {
        Destination: {
          ToAddresses: [data.Messages[0].email]
        },
        Message: {
          Body: {
            Text: {
              Charset: "UTF-8",
              Data: data.Messages[0].body
            }
          },
          Subject: {
            Charset: 'UTF-8',
            Data: data.Messages[0].subject
          }
        },
        Source: 'example@example.com',
      };
      ses.sendEmail(emailParams, (err, data) => {
        if (err) {
          console.log(`Error sending email: ${err}`);
        } else {
          console.log(`Successfully sent email: ${data}`);
        }
      });
      sqs.deleteMessage({
        QueueUrl: 'https://sqs.us-east-1.amazonaws.com/1234567890/emailQueue',
        ReceiptHandle: data.Messages[0].ReceiptHandle
      }, (err, data) => {
        if (err) {
          console.log(`Error deleting email from SQS: ${err}`);
        } else {
          console.log(`Successfully deleted email from SQS: ${data}`);
        }
      });
    }
  });
}, 5000);

2.マイクロサービスを解きほぐす

SQSはNode.jsアプリケーションで、SQSをメッセージングバスとして使用してマイクロサービスを解きほぐすことができます。これにより、サービスが独立して動作し、アプリケーション全体のスケーラビリティや可用性が向上します。

この用途では、Node.jsアプリケーション内の異なるマイクロサービス間にSQSをメッセージングバスとして使用できます。これにより、マイクロサービスが独立して動作し、アプリケーション全体のスケーラビリティや可用性が向上します。 例えば、1つのマイクロサービスがSQSを使用して別のマイクロサービスにメッセージを送信する方法:

const AWS = require('aws-sdk');
const sqs = new AWS.SQS();

// Create the message to send to the SQS queue
const message = {
  message: 'This is a message from Microservice 1 to Microservice 2'
};

// Set the parameters for sending the message to the SQS queue
const params = {
  MessageBody: JSON.stringify(message),
  QueueUrl: 'https://sqs.us-east-1.amazonaws.com/1234567890/microserviceQueue'
};

// Send the message to the SQS queue
sqs.sendMessage(params, (err, data) => {
  if (err) {
    console.log(`Error sending message to SQS: ${err}`);
  } else {
    console.log(`Successfully sent message to SQS: ${data}`);
  }
});

3. リアルタイム通知

SQSは、特定のイベントが発生したときにNode.jsアプリケーションにリアルタイム通知を送信するために使用できます。例えば、新しいユーザーがサインアップしたときや、支払いが受け取られたときに通知を送信する場合。

この用途では、特定のイベントが発生したときにSQSを使用してNode.jsアプリケーションにリアルタイム通知を送信できます。例えば、新しいユーザーがサインアップしたときに通知を送信する場合:

const AWS = require('aws-sdk');
const sqs = new AWS.SQS();

// Create the message to send to the SQS queue
const message = {
  message: 'A new user has signed up: John Doe'
};

// Set the parameters for sending the message to the SQS queue
const params = {
  MessageBody: JSON.stringify(message),
  QueueUrl: 'https://sqs.us-east-1.amazonaws.com/1234567890/notificationQueue'
};

// Send the message to the SQS queue
sqs.sendMessage(params, (err, data) => {
  if (err) {
    console.log(`Error sending message to SQS: ${err}`);
  } else {
    console.log(`Successfully sent message to SQS: ${data}`);
  }
});

// Poll the SQS queue for new messages
setInterval(() => {
  sqs.receiveMessage({
    QueueUrl: 'https://sqs.us-east-1.amazonaws.com/1234567890/notificationQueue',
    MaxNumberOfMessages: 10
  }, (err, data) => {
    if (err) {
      console.log(`Error receiving message from SQS: ${err}`);
    } else {
      console.log(`Received notification: ${data.Messages[0].message}`);
      // send this notification  to client
      //...
      sqs.deleteMessage({
        QueueUrl: 'https://sqs.us-east-1.amazonaws.com/1234567890/notificationQueue',
        ReceiptHandle: data.Messages[0].ReceiptHandle
      }, (err, data) => {
        if (err) {
          console.log(`Error deleting notification from SQS: ${err}`);
        } else {
          console.log(`Successfully deleted notification from SQS: ${data}`);
        }
      });
    }
  });
}, 5000);

4. 自動ワークフロー

SQSはNode.jsアプリケーションで自動ワークフローを作成するために使用できます。例えば、ユーザーの画像を処理して分析用の他のサービスに送信する場合。

この用途では、SQSを使用してNode.jsアプリケーションで自動ワークフローを作成できます。例えば、ユーザーの画像を処理して分析用の他のサービスに送信する場合:

const AWS = require('aws-sdk');
const sqs = new AWS.SQS();
const rekognition = new AWS.Rekognition();

// Create the message to send to the SQS queue
const message = {
  imageUrl: 'https://example.com/image.jpg'
};

// Set the parameters for sending the message to the SQS queue
const params = {
  MessageBody: JSON.stringify(message),
  QueueUrl: 'https://sqs.us-east-1.amazonaws.com/1234567890/imageQueue'
};

// Send the message to the SQS queue
sqs.sendMessage(params, (err, data) => {
  if (err) {
    console.log(`Error sending message to SQS: ${err}`);
  } else {
    console.log(`Successfully sent message to SQS: ${data}`);
  }
});

setInterval(() => {
  sqs.receiveMessage({
    QueueUrl: 'https://sqs.us-east-1.amazonaws.com/1234567890/imageQueue',
    MaxNumberOfMessages: 10
  }, (err, data) => {
    if (err) {
      console.log(`Error receiving message from SQS: ${err}`);
    } else {
      const imageUrl = data.Messages[0].imageUrl;
      rekognition.detectLabels({
        Image: {
          S3Object: {
            Bucket: 'imageBucket',
            Name: imageUrl
          }
        },
        MinConfidence: 90
      }, (err, data) => {
        if (err) {
          console.log(`Error processing image: ${err}`);
        } else {
          console.log(`Image labels: ${data.Labels}`);
        }
      });
      sqs.deleteMessage({
        QueueUrl: 'https://sqs.us-east-1.amazonaws.com/1234567890/imageQueue',
        ReceiptHandle: data.Messages[0].ReceiptHandle
      }, (err, data) => {
        if (err) {
          console.log(`Error deleting image from SQS: ${err}`);
        } else {
          console.log(`Successfully deleted image from SQS: ${data}`);
        }
      });
    }
  });
}, 5000);

5. ロードバランシング

SQSは、Node.jsアプリケーションに対するインバウンドリクエストを複数のアプリケーションインスタンスにルーティングすることで、ロードバランサーとして使用できます。これにより、アプリケーションは大量のトラフィックを処理するために自動的にスケールアップできます。

この用途では、SQSを使用してNode.jsアプリケーションで、インバウンドリクエストを複数のアプリケーションインスタンスにルーティングすることでロードバランサーとして使用できます。これにより、アプリケーションは大量のトラフィックを処理するために自動的にスケールアップできます。インバウンドリクエストを異なるNode.jsアプリケーションインスタンスにルーティングする方法の例:

const AWS = require("aws-sdk");
const sqs = new AWS.SQS();

// Create the SQS queue
sqs.createQueue(
  {
    QueueName: "requestQueue",
  },
  (err, data) => {
    if (err) {
      console.log(`Error creating SQS queue: ${err}`);
    } else {
      console.log(`Successfully created SQS queue: ${data}`);
    }
  }
);

// Send a request to the SQS queue
const request = {
  requestUrl: "/example",
  requestMethod: "GET",
};

const params = {
  MessageBody: JSON.stringify(request),
  QueueUrl: "https://sqs.us-east-1.amazonaws.com/1234567890/requestQueue",
};

sqs.sendMessage(params, (err, data) => {
  if (err) {
    console.log(`Error sending request to SQS: ${err}`);
  } else {
    console.log(`Successfully sent request to SQS: ${data}`);
  }
});

// Poll the SQS queue for new requests
setInterval(() => {
  sqs.receiveMessage(
    {
      QueueUrl: "https://sqs.us-east-1.amazonaws.com/1234567890/requestQueue",
      MaxNumberOfMessages: 10,
    },
    (err, data) => {
      if (err) {
        console.log(`Error receiving request from SQS: ${err}`);
      } else {
        // Route request to a free instance of the application
        //...
        sqs.deleteMessage(
          {
            QueueUrl: "https://sqs.us-east-1.amazonaws.com/1234567890/requestQueue",
            ReceiptHandle: data.Messages[0].ReceiptHandle,
          },
          (err, data) => {
            if (err) {
              console.log(`Error deleting request from SQS: ${err}`);
            } else {
              console.log(`Successfully deleted request from SQS: ${data}`);
            }
          }
        );
      }
    }
  );
}, 5000);

上記のコードサンプルから分かるように、AWS Simple Queue Service(SQS)は、バックグラウンドジョブ処理、マイクロサービスを解きほぐす、リアルタイム通知、自動ワークフロー、ロードバランシングなどのさまざまな用途で使用できます。私が提供したコードサンプルは、あくまでスタート地点に過ぎず、アプリケーションの特定の要件を満たすためにカスタマイズすることができます。

結論

この記事では、AWS Simple Queue Service (SQS)とNode.jsを組み合わせて強力で柔軟なアプリケーションを作成する方法について説明しました。AWSでSQSキューを作成する方法、Node.jsを使ってキューからメッセージを送受信する方法を示し、SQSが解決する一般的な問題に使用できる実際の例も提供しました。SQSは完全に管理されたサービスであり、マイクロサービスやスケーラブルなアプリケーションを構築するのに役立ちます。

この情報がSQSとNode.jsを一緒に使う基本を理解するのに役立ち、自分自身のアプリケーションを作成するための基盤を与えることを願っています。もしSQSやNode.jsについてもっと学びたい場合は、公式のAWS SQSおよびAWS SDK for Node.jsのドキュメンテーションをチェックアウトすることをお勧めします。

いつものように、この記事を楽しんで新しいことを学んでいただけたと思います。

ありがとうございました。次の記事でお会いしましょう!

この記事が気に入ったら、いいねをして購読してサポートしてください。ありがとうございます。

NGUYỄN ANH TUẤN

Xin chào, mình là Tuấn, một kỹ sư phần mềm đang làm việc tại Tokyo. Đây là blog cá nhân nơi mình chia sẻ kiến thức và kinh nghiệm trong quá trình phát triển bản thân. Hy vọng blog sẽ là nguồn cảm hứng và động lực cho các bạn. Hãy cùng mình học hỏi và trưởng thành mỗi ngày nhé!

Đăng nhận xét

Mới hơn Cũ hơn