Amazon QuickSightを使ってメール送信後のイベントデータを可視化する方法

Amazon QuickSightを使ってメール送信後のイベントデータを可視化する方法

SendGridサポートチームの青木です。

皆さんは、到達(Delivered)、開封(Open)、リンククリック(Click)などメール送信後のイベントデータの分析をどのように行っていますか?
SendGridでは、ActivityやStatsなどダッシュボード上でイベントデータを閲覧できる機能を提供していますが、このデータをカスタマイズして独自の分析や比較が行えればさらに便利になります。そこで今回は、ビジネスインテリジェンス(BI)サービスのひとつであるAmazon QuickSightを使って、Event Webhookで取得したイベントデータからダッシュボードを自分で作成してみました!

システム構成

QuickSightは、AWSの様々なサービスと連携してデータの分析や可視化などを行うことができるサービスです。今回は、Amazon API GatewayAWS Lambdaを使ってイベントデータをAmazon S3に保存し、Amazon Athenaを介してデータをQuickSightに取り込み、ダッシュボードを作成します。

システムの構成は以下の通りです。

システムの構成

次の3つのパートに分けて実装手順を解説します。

  1. API GatewayとLambdaを使ってS3にイベントデータを保存する
  2. AWS Glueを使ってS3のイベントデータからテーブルを作成し、QuickSightからデータを参照できるようにする
  3. Athenaと連携し、QuickSight上でイベントデータを可視化する

必要なもの

  • SendGridアカウント
  • AWSアカウント
  • QuickSightアカウント

SendGridはFreeプランのアカウントで構いません。QuickSightは有料サービスですが、30日間の無料トライアルが提供されています。

手順

1. S3へのイベントデータの保存

S3バケットの作成

API GatewayとLambdaを使って、S3にイベントデータを保存します。
まずは、データの保存先となるバケットをS3に作成しましょう。ここでは、バケット名を「sendgrid-event-data」とします。

S3バケットの作成

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」で受信するイベントを選択します。

Event Webhookの設定

設定が完了したら、「Test Your Integration」からテストイベントを送信し、S3にデータが保存されることを確認しましょう。

S3にデータが保存されることを確認

上のようにS3のバケット内にデータが保存されていれば、ここまでの設定は完了です。

2. Glueを使ったテーブルデータの準備

Glueを使ってS3のデータソースから参照用のテーブルを自動生成し、それをQuickSightから参照できるようにします。
Glueのコンソール画面を開き、「Include path」にS3バケットを指定してクローラを作成し、「Run crawler」からクローラを実行してください。

Glueを使ったテーブルデータの準備

実行後、テーブルが1つ作成されていることを確認しましょう。

テーブルが1つ作成されていることを確認

3. QuickSightでのイベントデータの可視化

QuickSightを使って、Glueで生成されるテーブルデータをもとにデータセットおよびダッシュボードを作成します。

S3へのアクセス権限の設定

QuickSightからAthenaを介してデータソースにアクセスするためには、データを保存しているS3バケットへのアクセス権限を設定する必要があります。
まずは、QuickSightのコンソール画面の右上にあるプルダウンから「Manage QuickSight」を選択し、アカウントの設定画面に移動しましょう。

「Manage QuickSight」を選択

「Security & Permissions」で「Add or remove」を選択します。

「Security & Permissions」で「Add or remove」を選択

「Amazon Athena」の右側にあるチェックボックスをクリックし、表示されるポップアップで「Next」を選択してください。

「Amazon Athena」の右側にあるチェックボックスをクリック

イベントデータが保存されているS3バケットへのアクセスを有効にし、「Finish」をクリックします。

イベントデータが保存されているS3バケットへのアクセスを有効にし、「Finish」をクリック

画面下の「Update」をクリックして、設定を更新しましょう。

「Update」をクリックして、設定を更新

データセットの作成

QuickSightのコンソール画面で「New dataset」から新しいデータセットを作成します。

「New dataset」から新しいデータセットを作成

「FROM NEW DATA SOURCES」セクションから「Athena」を選択します。

「FROM NEW DATA SOURCES」セクションから「Athena」を選択

「Data source name」に適当な名前を入力し「Validate connection」で接続を検証したら、「Create data source」でデータソースを作成してください。

「Create data source」でデータソースを作成

「Choose your table」のポップアップでは下の画像のように設定し、データの編集画面に移動します。

データの編集画面に移動

「Edit/Preview data」を選択すると、以下のようなデータ編集画面が表示されます。
編集画面ではAthenaを介して読み取ったイベントデータを閲覧でき、計算フィールドを追加することで、データに新たな要素(フィールド)を加えることが可能です。

データ編集画面

例えば以下のように、イベントデータに含まれている「bounce」と「processed」の値からバウンス率(bounce_rate)を算出し、新たなフィールドとして追加することができます。

バウンス率(bounce_rate)を算出

計算フィールドの追加が完了したら、「Save & visualize」をクリックして設定を保存し、分析画面に移動しましょう。

「Save & visualize」をクリックして設定を保存し分析画面に移動

以上で、データセットの準備は完了です。次は分析画面でダッシュボードを作成します。

ダッシュボードの作成

分析画面に移動すると、以下のような画面が表示されます。
ここでは、イベント発生数の時間変化を示すグラフを作成してみます。

イベント発生数の時間変化を示すグラフを作成

「Fields list」で「event」を、「Visual types」で「Area line chart」を選択し、自動的に折れ線グラフが作成されることを確認します。次に、「Field wells」をクリックしてグラフ軸の設定を行いましょう。

折れ線グラフの作成とグラフ軸の設定

「X axis」に「date」フィールドを、「Color」と書かれたディメンションフィールドに「event」フィールドを指定すると、横軸を日時、縦軸をイベント発生数としたグラフが作成されます。

横軸を日時、縦軸をイベント発生数としたグラフが作成される

ここまで紹介した機能を使って、以下のようなダッシュボードを作ることができました!

作成されたダッシュボード

まとめ

今回は、QuickSightを使ってEvent Webhookのデータを可視化する方法を紹介しました。これを活用することで、目的に応じたデータの分析や比較を自由に行うことが可能になります。イベントデータの活用例としてぜひ参考にしてみてください。実際に分析を試した結果は、後日紹介できればと思います!
今回紹介しきれなかったQuickSightの機能や設定については、AWSの公式ドキュメントをご覧ください。

メールを成功の原動力に

開発者にもマーケターにも信頼されているメールサービスを利用して、
時間の節約、スケーラビリティ、メール配信に関する専門知識を手に入れましょう。