Amazon QuickSightを使ってメール送信後のイベントデータを可視化する方法
- 2021年9月28日
- by 青木大将
- Category: 技術ネタ
SendGridサポートチームの青木です。
皆さんは、到達(Delivered)、開封(Open)、リンククリック(Click)などメール送信後のイベントデータの分析をどのように行っていますか?
SendGridでは、ActivityやStatsなどダッシュボード上でイベントデータを閲覧できる機能を提供していますが、このデータをカスタマイズして独自の分析や比較が行えればさらに便利になります。そこで今回は、ビジネスインテリジェンス(BI)サービスのひとつであるAmazon QuickSightを使って、Event Webhookで取得したイベントデータからダッシュボードを自分で作成してみました!
システム構成
QuickSightは、AWSの様々なサービスと連携してデータの分析や可視化などを行うことができるサービスです。今回は、Amazon API GatewayとAWS Lambdaを使ってイベントデータをAmazon S3に保存し、Amazon Athenaを介してデータをQuickSightに取り込み、ダッシュボードを作成します。
システムの構成は以下の通りです。
次の3つのパートに分けて実装手順を解説します。
- API GatewayとLambdaを使ってS3にイベントデータを保存する
- AWS Glueを使ってS3のイベントデータからテーブルを作成し、QuickSightからデータを参照できるようにする
- Athenaと連携し、QuickSight上でイベントデータを可視化する
必要なもの
- SendGridアカウント
- AWSアカウント
- QuickSightアカウント
SendGridはFreeプランのアカウントで構いません。QuickSightは有料サービスですが、30日間の無料トライアルが提供されています。
手順
1. S3へのイベントデータの保存
S3バケットの作成
API GatewayとLambdaを使って、S3にイベントデータを保存します。
まずは、データの保存先となるバケットをS3に作成しましょう。ここでは、バケット名を「sendgrid-event-data」とします。
Lambda関数の準備
API Gatewayで受けたイベントデータをS3に保存するために、Lambdaを利用します。ランタイムにはNode.js 14.xを用います。Lambda関数のコードは以下の通りです。
console.log('Loading function'); const aws = require('aws-sdk'); const s3 = new aws.S3(); require('date-utils'); function putObject(content, key) { const params = { Bucket: 'sendgrid-event-data', Key: key, Body: JSON.stringify(content) }; const putObjectPromise = s3.putObject(params).promise(); putObjectPromise.then(function(data) { console.log('Success to putObject to the S3'); }).catch(function(err) { console.log(err); }); } function unixtimeToJST(object) { let unix_timestamp = object['timestamp']; let JST_time = new Date(unix_timestamp*1000 + 9*60*60*1000); return JST_time; } exports.handler = async (event, context, callback) => { let promises = []; for (let object of event) { let time = unixtimeToJST(object); let key = object['event'] + '-' + time.toISOString() + '-' + object['sg_event_id'] + '.log'; promises.push(putObject(object, key)); } await Promise.all(promises).then(results => { callback(null, ''); }).catch(errors => { console.log(errors); callback(JSON.stringify({status: 500, message: 'Internal Server Error'})); }); };
AWS SDKパッケージに含まれるS3サービスオブジェクトの「putObject」メソッドを使って、S3にデータをアップロードします。「Bucket」パラメータには、S3で作成したバケット名(ここでは「sendgrid-event-data」)を指定してください。
オブジェクトを一意に識別するためのキー名(Key)は、イベントデータに含まれる「event」と「timestamp」、「sg_event_id」パラメータを使って生成しています。なお、「timestamp」はUnix時間で記録されるため、ここでは「Date-Utils」パッケージの「Date」インスタンスを使って日本時間(JST)に変換しています。
コードが準備できたら、手元の開発環境で依存関係を解決し、開発ディレクトリの中身を圧縮したZipファイルをLambdaにアップロードしてください。
作成したLambda関数には、S3に対するアクセス権限を与えるのを忘れないようにしましょう。
API Gatewayの設定
Event WebhookのPOST先となるエンドポイントを発行するため、API Gatewayを設定します。API Gatewayの設定はこちらの記事を参考に進めてください。
Event Webhookの設定(SendGrid)
SendGridダッシュボードの「Settings > Mail Settings > Event Webhook」に移動してください。「HTTP Post URL」に先ほど作成したAPI GatewayのエンドポイントURLを設定し、「Events to be POSTed to your URL」で受信するイベントを選択します。
設定が完了したら、「Test Your Integration」からテストイベントを送信し、S3にデータが保存されることを確認しましょう。
上のようにS3のバケット内にデータが保存されていれば、ここまでの設定は完了です。
2. Glueを使ったテーブルデータの準備
Glueを使ってS3のデータソースから参照用のテーブルを自動生成し、それをQuickSightから参照できるようにします。
Glueのコンソール画面を開き、「Include path」にS3バケットを指定してクローラを作成し、「Run crawler」からクローラを実行してください。
実行後、テーブルが1つ作成されていることを確認しましょう。
3. QuickSightでのイベントデータの可視化
QuickSightを使って、Glueで生成されるテーブルデータをもとにデータセットおよびダッシュボードを作成します。
S3へのアクセス権限の設定
QuickSightからAthenaを介してデータソースにアクセスするためには、データを保存しているS3バケットへのアクセス権限を設定する必要があります。
まずは、QuickSightのコンソール画面の右上にあるプルダウンから「Manage QuickSight」を選択し、アカウントの設定画面に移動しましょう。
「Security & Permissions」で「Add or remove」を選択します。
「Amazon Athena」の右側にあるチェックボックスをクリックし、表示されるポップアップで「Next」を選択してください。
イベントデータが保存されているS3バケットへのアクセスを有効にし、「Finish」をクリックします。
画面下の「Update」をクリックして、設定を更新しましょう。
データセットの作成
QuickSightのコンソール画面で「New dataset」から新しいデータセットを作成します。
「FROM NEW DATA SOURCES」セクションから「Athena」を選択します。
「Data source name」に適当な名前を入力し「Validate connection」で接続を検証したら、「Create data source」でデータソースを作成してください。
「Choose your table」のポップアップでは下の画像のように設定し、データの編集画面に移動します。
「Edit/Preview data」を選択すると、以下のようなデータ編集画面が表示されます。
編集画面ではAthenaを介して読み取ったイベントデータを閲覧でき、計算フィールドを追加することで、データに新たな要素(フィールド)を加えることが可能です。
例えば以下のように、イベントデータに含まれている「bounce」と「processed」の値からバウンス率(bounce_rate)を算出し、新たなフィールドとして追加することができます。
計算フィールドの追加が完了したら、「Save & visualize」をクリックして設定を保存し、分析画面に移動しましょう。
以上で、データセットの準備は完了です。次は分析画面でダッシュボードを作成します。
ダッシュボードの作成
分析画面に移動すると、以下のような画面が表示されます。
ここでは、イベント発生数の時間変化を示すグラフを作成してみます。
「Fields list」で「event」を、「Visual types」で「Area line chart」を選択し、自動的に折れ線グラフが作成されることを確認します。次に、「Field wells」をクリックしてグラフ軸の設定を行いましょう。
「X axis」に「date」フィールドを、「Color」と書かれたディメンションフィールドに「event」フィールドを指定すると、横軸を日時、縦軸をイベント発生数としたグラフが作成されます。
ここまで紹介した機能を使って、以下のようなダッシュボードを作ることができました!
まとめ
今回は、QuickSightを使ってEvent Webhookのデータを可視化する方法を紹介しました。これを活用することで、目的に応じたデータの分析や比較を自由に行うことが可能になります。イベントデータの活用例としてぜひ参考にしてみてください。実際に分析を試した結果は、後日紹介できればと思います!
今回紹介しきれなかったQuickSightの機能や設定については、AWSの公式ドキュメントをご覧ください。