SKYPCEの「ニュースメディア連携」機能で用いられるAWSのデッドレターキュー(DLQ)について、その仕組みと具体的な設定例、Amazon SNSとAWS Lambdaにおける役割の違い、そして活用の際の注意点を解説します。システムの信頼性を高めるための重要なポイントが分かります。
はじめに
SKYPCEの「ニュースメディア連携」機能についてご存知でしょうか?
「ニュースメディア連携」機能では、名刺登録されている顧客企業の最新ニュースを自動で一覧表示し、いつでも閲覧できます。
営業で訪問する企業の話題を事前にピンポイントで確認したり、日頃から担当顧客の最新情報を効率的にチェックするのに役立ちます。
SKYPCEの「ニュースメディア連携」機能では、デッドレターキュー(DLQ)という技術を用いて、確実にお客様にニュースが配信できるよう対策が取られています。
本記事では、AWSのデッドレターキュー(DLQ)について、具体的な設定例を交えながら、その仕組みと活用の際の注意点をご紹介します。
デッドレターキュー(DLQ)とは
デッドレターキュー(DLQ)は、AWSのメッセージングサービスにおいて、処理に失敗したメッセージを保存するための特別なキューです。
これにより、失敗したメッセージを後で確認し、問題を特定して対処することができます。また、システムの信頼性とメンテナンス性が向上します。
デッドレターキュー(DLQ)の設定例
こちらのシステム構成図は特定の通知を E メールへの送信と AWS Lambda の関数呼び出すものとなります。
下記システム構成図のように、 Amazon SNS と AWS Lambda にデッドレターキュー(DLQ)を設定することができます。
※なお、この構成図はデッドレターキュー(DLQ)の動作を説明するための架空の例であり、実際の「ニュースメディア連携」機能の構成とは異なります。
デッドレターキュー(DLQ)に積まれる条件について
上記の Amazon SNS と AWS Lambda に設定されているデッドレターキュー(DLQ)について、どのタイミングでキューが送信されるかの理解が必要です。
Amazon SNS に設定されているデッドレターキュー(DLQ)
Amazon SNS に設定されているデッドレターキュー(DLQ)は、SNS がサブスクライバー(今回の例では AWS Lambda)へメッセージを配信できなかった場合に、メッセージが送信されます。
ここで注意すべき点は、 Amazon SNS と AWS Lambda の連携は 非同期呼び出し であるという点です。
Amazon SNS は AWS Lambda 関数そのものの処理結果(成功・失敗)までは判定しておらず、 「AWS Lambda サービスへの起動リクエストが正常に受け付けられたか」のみをもって配信成功と判断します。
そのため、以下のようなケースでは Amazon SNS 側の デッドレターキュー(DLQ) にはメッセージは送信されません。
- AWS Lambda 関数が正常に起動したが、処理途中でエラーが発生した
- AWS Lambda 関数内のロジックエラーや外部サービス連携失敗により処理が失敗した
一方で、以下のように SNS が配信自体に失敗した場合には、SNS に設定された デッドレターキュー(DLQ) にメッセージが送信されます。
- AWS Lambda のエンドポイントが存在しない
- 権限不足などにより AWS Lambda を起動できない
- 一定回数のリトライ後も配信に失敗した
AWS Lambda に設定されているデッドレターキュー(DLQ)
AWS Lambda に設定されているデッドレターキュー(DLQ)は、AWS Lambda 関数の実行が失敗した場合 に、イベントデータが送信されます。 特に Amazon SNS からの呼び出しは非同期実行となるため、AWS Lambda 側では以下のような条件で失敗と判定され、デッドレターキュー(DLQ) へ送信されます。
- 関数の実行中に例外が発生した
- タイムアウトが発生した
- 非同期実行における再試行(最大回数)後も処理が成功しなかった
このように、「 AWS Lambda の処理結果に起因する失敗」を検知してメッセージを保持したい場合は、AWS Lambda 側に デッドレターキュー(DLQ) を設定する必要があります。
SNS 側の デッドレターキュー(DLQ) と AWS Lambda 側の デッドレターキュー(DLQ) は役割が異なるため、「どのレイヤーでの失敗を検知・再処理したいのか」を明確にした上で、適切なサービスにデッドレターキュー(DLQ)を設定することが重要です。
おわりに
今回デッドレターキュー(DLQ)に送信される条件について、ご説明させていただきました。
このように、一口にデッドレターキュー(DLQ)と言っても、設定するサービスによってその役割は大きく異なります。
どの段階で発生しうる問題を検知したいのかを明確にし、適切な場所に設定することが、システムの信頼性を高める鍵となります。
SKYPCEの開発チームでは、今回ご紹介したような仕組みを適切に活用し、お客様が便利で安心してサービスをご利用いただけるよう、日々開発に取り組んでおります。
これからも、お客様のご要望に1つでも多くお応えできるよう精進してまいりますので、どうぞSKYPCEをよろしくお願いいたします。
