この記事は公開されてから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を定義します。検証を用意にするためmaxReceiveCount
は1
にしています。また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連携も含めてこんな簡単に構築できてすばらしいの一言ですね。活用していきましょう!