Amazon SQSデッドレターキューにメッセージが入ったらSlackに通知するしくみをAWS CDKで構築する

こんにちは。サービスグループの武田です。Amazon SQSやAWS Lambdaに設定するDLQにメッセージが入った際、Slackに通知されるしくみをAWS CDKを利用して構築してみました。
2021.03.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。サービスグループの武田です。

Amazon SQSやAWS Lambdaなどには、処理が失敗した際にメッセージを退避させるしくみとしてデッドレターキュー(以下、DLQ)というものが用意されています。DLQを用意しておくことで無制限のリトライを防止したり、デバッグに役立てることができます。

とはいえ、肝心のDLQにメッセージが入ったことを検知できなければ何の意味もありません。今回はDLQにメッセージが入った際に、Slackに通知されるしくみをAWS CDKを利用して構築してみました。

なお、ソースコードはGitHubに上がっています。

TAKEDA-Takashi/aws-cdk-sqs-dlq-alert-slack

環境

今回は次のような環境で検証しました。

$ node -v
v10.19.0

$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.7
BuildVersion:	19H15

やってみた

CDkでAWS環境を作っていくわけですが、その前にAWS ChatbotとSlackの連携設定を済ませておく必要があります。これは手動で行う必要があります。設定手順についてはmeのエントリを参考にしてください。

それではCDKのプロジェクトを作成していきましょう。

$ mkdir aws-cdk-sqs-dlq-alert-slack && cd $_
$ npx cdk init --language typescript
$ npm install @aws-cdk/aws-sqs @aws-cdk/aws-sns @aws-cdk/aws-chatbot @aws-cdk/aws-cloudwatch @aws-cdk/aws-cloudwatch-actions

プロジェクトが作成できたら環境を定義します。今回は検証用にTestQueueおよびそれのDLQを定義します。検証を用意にするためmaxReceiveCount1にしています。またSlackChannelのスペースIDなどは使用するIDに変更してください。

lib/aws-cdk-sqs-dlq-alert-slack-stack.ts

// SQS
const testQueueDlq = new Queue(this, 'TestQueue-DLQ', {
  queueName: 'TestQueue-DLQ',
});

const testQueue = new Queue(this, 'TestQueue', {
  queueName: 'TestQueue',
  deadLetterQueue: {
    maxReceiveCount: 1,
    queue: testQueueDlq,
  },
});

// SNS
const chatbotNotificationTopic = new Topic(this, 'ChatbotNotificationTopic', {
  topicName: 'ChatbotNotificationTopic',
});

// CloudWatch
const alarm = new Alarm(this, `TestQueue-DLQ-Alarm`, {
  metric: testQueueDlq.metricApproximateNumberOfMessagesVisible(),
  evaluationPeriods: 1,
  threshold: 1,
  treatMissingData: TreatMissingData.NOT_BREACHING,
});

alarm.addAlarmAction(new SnsAction(chatbotNotificationTopic));
alarm.addOkAction(new SnsAction(chatbotNotificationTopic));

// Chatbot
new SlackChannelConfiguration(this, 'SlackChannel', {
  slackChannelConfigurationName: 'sandbox',
  slackWorkspaceId: 'T03XXXXXX',
  slackChannelId: 'CFG000000',
  notificationTopics: [chatbotNotificationTopic],
});

準備ができたらデプロイします。

$ npx cdk deploy

リソースが作成されるとSlackにOK通知が飛んできます。

SQSのページを見てみるとキューが2つ作られています。

TestQueueに新しいメッセージを送信します。

ポーリングしてメッセージを受信します。この時点で受信回数が1回とカウントされるため、メッセージを削除しなければDLQに移されます。

無事にDLQにメッセージが移されました。

しばらくするとSlackにアラートが飛んできました!

まとめ

サーバーレスアーキテクチャなどでは何かとお世話になるDLQですが、しっかりと通知まで構築することで運用負荷が下がります。Slack連携も含めてこんな簡単に構築できてすばらしいの一言ですね。活用していきましょう!

参考URL