🎉
SendGridのEmailActivityをCloudWatchLogsに保存して、CloudWatchLogsInsightsで分析する
前置き
SendGrid の EmailActivity はアドオンを利用しても最大30日の期間しか利用できません。
対策としては、Event Webhookを利用してイベントデータをPOSTし、データ蓄積する仕組みを自身で構築する必要があります。例えばクラスメソッドの記事では、Lambda
+APIGateway
+S3
+Athena
の組み合わせで実現しています。
2022年4月頃にLambdaが、HTTPSエンドポイントを介して利用できるようになったので、API Gatewayを利用しなくても実現できるようになりました。
やりたいこと
・EmailActivityのイベントを永続的に保持したい
・イベントを分析したい
設定してみる
Lambda
Lambdaに関数URLの項目があるので、画面の指示に従って設定していきます。
作成し終わると、関数URLという項目が表示されているかと思います。
実行コード
exports.handler = function(event, context) {
console.log(event["body"]);
};
sendgrid
下記の記事に従い、PostURLにLambdaで発行したURLを設定します。
CloudWatchLogs
Lambda
> モニタリング
> ログ
> CloudWatchのログを表示
を選択。
CloudWatchLogsのログはデフォルトでは、ログは無制限に保持され、失効しません。
なお保持期間はロググループ単位で設定できます。
ログの保持期間 – デフォルトでは、ログは無制限に保持され、失効しません。ロググループごとに保持ポリシーを調整し、無制限の保持期間を維持するか、1 日間~10 年間の保持期間を選択することができます。
CloudWatchLogsInsights
CloudWatchのログを表示
> Logs Insightsで表示
を選択。
下記のようなサンプルクエリでイベントログを分析することができます。
fields @timestamp, @message
# see https://sendgrid.kke.co.jp/docs/Tutorials/A_Transaction_Mail/manage_bounces.html
# see https://sendgrid.kke.co.jp/docs/API_Reference/Webhooks/event.html#-Event-Types
| parse @message "[{*}]" as info
| parse info 'email":"*",' as email
| parse info 'event":"*",' as event
| parse info 'response":"*",' as response
| sort @timestamp desc
| display datefloor(@timestamp, 1h) as date, email, category, event, response
Discussion