Amazon Web Services ブログ
AWS の分析サービスを活用した Amazon SES イベントデータの解析
このブログでは、Amazon Kinesis Firehose、Amazon Athena、Amazon QuickSight などの AWS サービスを使用して、お客様のメール閲覧状況などの詳細を把握するために必要な粒度の Amazon SES のメール送信イベントを監視する方法を説明します。
現在、E メールマーケターはニュースレターやプロモーションコンテンツなど、キャンペーンやコミュニケーション方法を作るために内部アプリケーションに依存しています。
これらの活動から、顧客とのより良いインタラクションを得るためにワークフローを分析して改善し、より多くの情報を収集する必要があります。
バウンス、拒否、受信成功、配信遅延、苦情、開封率などのデータは顧客を理解するための強力なツールとなります。
通常のアプリケーションは、キャンペーンの効果をより高めるための詳細なログやデータを提供していないため、高レベルの情報しか扱えません。
Amazon Simple Email Service (SES) は自身の製品に簡単に統合でき、コスト効率の良い柔軟でスケーラブルなメールサービスソリューションを求める企業向けのツールです。
Amazon SES は、Amazon CloudWatch Metrics との組み込み統合により送信活動を管理できる機能を提供し、メール送信イベントデータを収集するメカニズムも提供します。
このブログでは、送信、配信、開封、クリック、バウンス、苦情、拒否、レンダリング失敗、配信遅延などさまざまな種類のメール送信イベントに対して詳細にメール送信アクティビティを追跡するためのアーキテクチャと段階的なガイドを提案します。
Amazon SES の設定セット機能を使用して、詳細なログを分析サービスに送信し、そこでデータを保存、クエリ、詳細なビューのダッシュボードを作成します。
ソリューションの概要
このアーキテクチャでは、Amazon SES の組み込み機能と AWS の分析サービスを利用して、メール追跡の要件に対する迅速かつ低コストのソリューションを提供します。
以下のサービスから構成されます。
- Amazon Simple Email Service (SES)
- Amazon Simple Storage Service (S3)
- Amazon Kinesis Data Firehose
- Amazon Athena
- AWS Glue データカタログ
- Amazon QuickSight
次の図はこのソリューションのアーキテクチャを示しています。
お客様が Amazon SES を使用してメールを送信すると、イベントのフローが開始されます。それらの送信イベントはすべて、設定セット機能によってキャプチャされ、Kinesis Firehose 配信ストリームに転送されます。そこでイベントがバッファされ、Amazon S3 バケットに保存されます。
イベントを保存した後、Amazon Athena が S3 上のそれらのイベントを適切にクエリできるように、データベースとテーブルスキーマを作成し、AWS Glue Data Catalog に格納する必要があります。
最後に、Amazon QuickSight を使用して、インタラクティブなダッシュボードを作成し、メールごとの詳細情報を示して、送信アクティビティ全体を検索および可視化します。
前提条件
このウォークスルーを行うには、以下の前提条件を満たしている必要があります:
- AWS アカウント
- 本番稼働アクセスの SES ドメイン
- Amazon S3、Amazon Athena、AWS Glue Data Catalog、Amazon Kinesis Firehose、Amazon QuickSight を構成するための適切な IAM の権限
- Author ユーザーが作成した QuickSight インスタンス
ウォークスルー
ステップ 1: AWS CloudFormation を使用して、追加の前提条件をデプロイする
AWS CloudFormation のサンプルテンプレートを使えば、前提条件をいくつか含めて始められます。
このテンプレートは、Amazon S3 バケットと、Amazon SES から Amazon Kinesis Data Firehose にアクセスするために必要な IAM ロールを作成します。
CloudFormation テンプレートをダウンロードするには、お使いの OS に応じて以下のコマンドのいずれかを実行してください:
Windows の場合:
curl https://raw.githubusercontent.com/aws-samples/amazon-ses-analytics-blog/main/SES-Blog-PreRequisites.yml -o SES-Blog-PreRequisites.yml
MacOS の場合:
wget https://raw.githubusercontent.com/aws-samples/amazon-ses-analytics-blog/main/SES-Blog-PreRequisites.yml
テンプレートをデプロイするには、次のAWS CLIコマンドを使用します:
aws cloudformation deploy --template-file ./SES-Blog-PreRequisites.yml --stack-name ses-dashboard-prerequisites --capabilities CAPABILITY_NAMED_IAM
テンプレートがリソースの作成を完了すると、スタックの出力タブに IAM サービスロールと配信ストリームが表示されます。
これらのリソースは次の手順で使用します。
ステップ 2: SES で設定セットを作成し、検証済みの ID のデフォルト設定セットを設定する
SES は、送信したメールごとに送信、配信、開封、クリック、バウンス、苦情のイベント数を追跡できます。イベントパブリッシングを使用すると、これらのイベントに関する情報を他の AWS サービスに送信できます。今回は、イベントを Kinesis Firehose に送信します。そのためには、設定セットが必要です。
設定セットを作成するには、以下の手順を実行してください:
- AWS コンソールで、Amazon Simple Email Service を選択します。
- Configuration sets を選択します。
- Create set をクリックします。
- Configuration set name を設定します。
- 他の設定はデフォルトのままにしておきます。
- 設定セットが作成されたら、Event destinationsを選択します。
- Add destination をクリックします。
- 分析したいイベントタイプを選択し、nextをクリックします。
- 宛先として Amazon Kinesis Data Firehose を選択し、前に作成した配信ストリームと IAM ロールを選択し、next をクリックします。レビューページで Add destination をクリックします。
- 設定セットとイベント宛先を作成したら、検証済みの ID (ドメインまたはメールアドレス) のデフォルトの設定セットを定義できます。SES コンソールで Verified identities を選択します。
- イベントを収集する検証済みの ID を選択し、Configuration set を選択します。Edit をクリックします。
- デフォルトの設定セットを割り当てるチェックボックスをオンにし、前に作成した設定セットを選択します。
- 前の手順を完了すると、イベントが Amazon S3 に送信されます。Kinesis 配信ストリームのバッファ設定により、データは 5 分ごとまたは 5 MiB ごとに Amazon S3 にロードされます。バケットに作成された構造を確認し、SES イベントデータの JSON ログを確認できます。
ステップ 3: Amazon Athena を使用して SES イベントログをクエリする
Amazon SES は、メール送信イベントレコードを JSON 形式で Amazon Kinesis Data Firehose に公開します。
トップレベルの JSON オブジェクトには、eventType 文字列、mail オブジェクト、およびイベントの種類に応じて Bounce、Complaint、Delivery、Send、Reject、Open、Click、Rendering Failure、DeliveryDelay オブジェクトが含まれています。
- メール送信イベントの分析を簡素化するために、次のスクリプトを Amazon Athena で実行して sesmaster テーブルを作成します。次のスクリプトの
LOCATION
をメール送信イベントのデータを含む自分のバケットに変更することを忘れないでください。CREATE EXTERNAL TABLE sesmaster ( eventType string, complaint struct < arrivaldate: string, complainedrecipients: array < struct < emailaddress: string >>, complaintfeedbacktype: string, feedbackid: string, `timestamp`: string, useragent: string >, bounce struct < bouncedrecipients: array < struct < action: string, diagnosticcode: string, emailaddress: string, status: string >>, bouncesubtype: string, bouncetype: string, feedbackid: string, reportingmta: string, `timestamp`: string >, mail struct < timestamp: string, source: string, sourcearn: string, sendingaccountid: string, messageid: string, destination: string, headerstruncated: boolean, headers: array < struct < name: string, value: string >>, commonheaders: struct < `from`: array < string >, to: array < string >, messageid: string, subject: string >, tags: struct < ses_source_tls_version: string, ses_operation: string, ses_configurationset: string, ses_source_ip: string, ses_outgoing_ip: string, ses_from_domain: string, ses_caller_identity: string >>, send string, delivery struct < processingtimemillis: int, recipients: array < string >, reportingmta: string, smtpresponse: string, `timestamp`: string >, open struct < ipaddress: string, `timestamp`: string, userAgent: string >, reject struct < reason: string >, click struct < ipAddress: string, `timestamp`: string, userAgent: string, link: string > ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ( "mapping.ses_caller_identity" = "ses:caller-identity", "mapping.ses_configurationset" = "ses:configuration-set", "mapping.ses_from_domain" = "ses:from-domain", "mapping.ses_operation" = "ses:opeation", "mapping.ses_outgoing_ip" = "ses:outgoing-ip", "mapping.ses_source_ip" = "ses:source-ip", "mapping.ses_source_tls_version" = "ses:source-tls-version" ) LOCATION 's3://aws-s3-ses-analytics-<aws-account-number>/'
sesmaster テーブルは、org.openx.data.jsonserde.JsonSerDe SerDe ライブラリを使用して JSON データを逆シリアル化します。
JSON 配列とマップのサポート、およびネストされたデータ構造のサポートを活用しています。これらの機能により、データの準備と可視化のプロセスが容易になります。
sesmaster テーブルでは、次のマッピングが適用されており、コロンを含む JSON フィールド名によるエラーを回避しています。
- “mapping.ses_configurationset”=”ses:configuration-set”
- “mapping.ses_source_ip”=”ses:source-ip”
- “mapping.ses_from_domain”=”ses:from-domain”
- “mapping.ses_caller_identity”=”ses:caller-identity”
- “mapping.ses_outgoing_ip”=”ses:outgoing-ip”
- sesmaster テーブルが準備できたら、そのデータの整理されたビューを作成するのが良い戦略です。最初のビュー vwSESMaster には、メール送信イベントのすべてのレコードと、各イベントで一意のすべてのフィールドが含まれています。次のスクリプトを Amazon Athena で実行して、vwSESMaster ビューを作成します。
CREATE OR REPLACE VIEW vwSESMaster AS SELECT eventtype as eventtype , mail.messageId as mailmessageid , mail.timestamp as mailtimestamp , mail.source as mailsource , mail.sendingAccountId as mailsendingAccountId , mail.commonHeaders.subject as mailsubject , mail.tags.ses_configurationset as mailses_configurationset , mail.tags.ses_source_ip as mailses_source_ip , mail.tags.ses_from_domain as mailses_from_domain , mail.tags.ses_outgoing_ip as mailses_outgoing_ip , delivery.processingtimemillis as deliveryprocessingtimemillis , delivery.reportingmta as deliveryreportingmta , delivery.smtpresponse as deliverysmtpresponse , delivery.timestamp as deliverytimestamp , delivery.recipients[1] as deliveryrecipient , open.ipaddress as openipaddress , open.timestamp as opentimestamp , open.userAgent as openuseragent , bounce.bounceType as bouncebounceType , bounce.bouncesubtype as bouncebouncesubtype , bounce.feedbackid as bouncefeedbackid , bounce.timestamp as bouncetimestamp , bounce.reportingMTA as bouncereportingmta , click.ipAddress as clickipaddress , click.timestamp as clicktimestamp , click.userAgent as clickuseragent , click.link as clicklink , complaint.timestamp as complainttimestamp , complaint.userAgent as complaintuseragent , complaint.complaintFeedbackType as complaintcomplaintfeedbacktype , complaint.arrivalDate as complaintarrivaldate , reject.reason as rejectreason FROM sesmaster
sesmaster テーブルには、ネストされた配列で表されているフィールドがいくつかあるため、それらを複数の行にフラット化する必要があります。次に、イベントタイプとフラット化が必要なフィールドを示します。
- イベントタイプ SEND: フィールド mail.commonHeaders
- イベントタイプ BOUNCE: フィールド bounce.bouncedrecipients
- イベントタイプ COMPLAINT: フィールド complaint.complainedrecipients
これらの配列を複数の行にフラット化するために、CROSS JOIN と UNNEST 演算子を次の戦略で使用しました。
- mail.messageID とフラット化するフィールドを含む一時ビューを作成します。
- 配列を複数の行にフラット化した別の一時ビューを作成します。
- sesmaster テーブルと 2 番目の一時ビューをイベントタイプと mail.messageID で結合して、最終ビューを作成します。
これらのビューを作成するには、次の手順に従ってください。
- 次のスクリプトを Amazon Athena で実行して、SEND イベントタイプの mail.commonHeaders 配列をフラット化します。
CREATE OR REPLACE VIEW vwSendMailTmpSendTo AS SELECT mail.messageId as messageid , mail.commonHeaders.to as recipients FROM sesmaster WHERE eventtype='Send'
CREATE OR REPLACE VIEW vwsendmailrecipients AS SELECT messageid , recipient FROM ("vwSendMailTmpSendTo" CROSS JOIN UNNEST(recipients) t (recipient))
CREATE OR REPLACE VIEW vwSentMails AS SELECT eventtype as eventtype , mail.messageId as mailmessageid , mail.timestamp as mailtimestamp , mail.source as mailsource , mail.sendingAccountId as mailsendingAccountId , mail.commonHeaders.subject as mailsubject , mail.tags.ses_configurationset as mailses_configurationset , mail.tags.ses_source_ip as mailses_source_ip , mail.tags.ses_from_domain as mailses_from_domain , mail.tags.ses_outgoing_ip as mailses_outgoing_ip , dest.recipient as mailto FROM sesmaster as sm ,vwsendmailrecipients as dest WHERE sm.eventtype = 'Send' and sm.mail.messageid = dest.messageid
- 次のスクリプトを Amazon Athena で実行して、BOUNCE イベントタイプの bounce.bouncedrecipients 配列をフラット化します。
CREATE OR REPLACE VIEW vwbouncemailtmprecipients AS SELECT mail.messageId as messageid , bounce.bouncedrecipients FROM sesmaster WHERE (eventtype = 'Bounce')
CREATE OR REPLACE VIEW vwbouncemailrecipients AS SELECT messageid , recipient.action , recipient.diagnosticcode , recipient.emailaddress FROM (vwbouncemailtmprecipients CROSS JOIN UNNEST(bouncedrecipients) t (recipient))
CREATE OR REPLACE VIEW vwBouncedMails AS SELECT eventtype as eventtype , mail.messageId as mailmessageid , mail.timestamp as mailtimestamp , mail.source as mailsource , mail.sendingAccountId as mailsendingAccountId , mail.commonHeaders.subject as mailsubject , mail.tags.ses_configurationset as mailses_configurationset , mail.tags.ses_source_ip as mailses_source_ip , mail.tags.ses_from_domain as mailses_from_domain , mail.tags.ses_outgoing_ip as mailses_outgoing_ip , bounce.bounceType as bouncebounceType , bounce.bouncesubtype as bouncebouncesubtype , bounce.feedbackid as bouncefeedbackid , bounce.timestamp as bouncetimestamp , bounce.reportingMTA as bouncereportingmta , bd.action as bounceaction , bd.diagnosticcode as bouncediagnosticcode , bd.emailaddress as bounceemailaddress FROM sesmaster as sm ,vwbouncemailrecipients as bd WHERE sm.eventtype = 'Bounce' and sm.mail.messageid = bd.messageid
- 次のスクリプトを Amazon Athena で実行して、COMPLAINT イベントタイプの complaint.complainedrecipients 配列をフラット化します。
CREATE OR REPLACE VIEW vwcomplainttmprecipients AS SELECT mail.messageId as messageid , complaint.complainedrecipients FROM sesmaster WHERE (eventtype = 'Complaint')
CREATE OR REPLACE VIEW vwcomplainedrecipients AS SELECT messageid , recipient.emailaddress FROM (vwcomplainttmprecipients CROSS JOIN UNNEST(complainedrecipients) t (recipient))
メール送信イベントを分析するために Amazon QuickSight で使用できる以下の 4 つのテーブルと 1 つのビューがあります。
- テーブル: sesmaster
- ビュー: vwSESMaster
- ビュー: vwSentMails
- ビュー: vwBouncedMails
- ビュー: vwComplainedemails
ステップ 4: Amazon QuickSight を使用してデータを分析し、可視化する
Amazon QuickSight を使用して、上述した sesmaster テーブル と 4 つのビューからメール送信イベントを分析し、可視化します。
Amazon QuickSight は Athena を通じてデータに直接アクセスできます。
セッションごとの課金体系であり、組織内の全員に分析のインサイトを提供できます。
まずはセットアップしましょう。最初に Athena で新しいデータソースを作成するためのテーブルとビューを選択しましょう。そして、これらのデータソースを使って可視化していきましょう。ここでは可視化の例を作成します。情報ニーズに基づいて、独自の可視化を作成してください。
Amazon QuickSight でデータを使用する前に、まず基盤となる S3 バケットへのアクセスを許可する必要があります。他の分析でまだ行っていない場合は、その方法についてのドキュメントを参照してください。
- Amazon QuickSight のホームページで、左側のメニューから Datasets を選択し、右上の New dataset を選択します。データソースとして Athena を設定し選択します。次のダイアログボックスで、データソースに分かりやすい名前を付けて、データソースの作成を選択します。
- 次のダイアログボックスで、sesmaster と加工済みビューを含む Catalog と Database を選択します。基本的な KPI (Key Performance Indicators) を作成するために、sesmaster テーブルを選択し、Select をクリックします。
- sesmaster テーブルが Amazon QuickSight のデータソースになりました。次はデータの可視化に移ります。
- 左側にフィールドのリストが表示されています。右側のキャンバスはまだ空白です。データを追加する前に、利用可能なビジュアルタイプから KPI を選択します。
- グラフにデータを追加するには、左側のフィールドリストからフィールドをドラッグ&ドロップして、それぞれの領域に配置します。今回は、フィールド send を値の領域に配置し、集計に count を使用します。
- 左上から新しいビジュアルを追加し、ビジュアルタイプに KPI を選択します。
- フィールド Delivery を値の領域に配置し、集計に count を使用します。
- 同様の手順 (ステップ 1 から 4) を繰り返し、Open、Click、Bounce、Complaint、Reject イベントの数をカウントします。最後に、次のような可視化が表示されるはずです。ビジュアルのサイズを変更して並べ替えると、下の画像のような分析結果が得られます。
- 現在のデータセットの右側にある鉛筆アイコンをクリックして、新しいデータセットを追加します。
- 次のダイアログボックスで Add Dataset を選択します。
- vwsesmaster と呼ばれるビューを選択し、Select をクリックします。
vwsesmaster ビューの利用可能なフィールドがすべて表示されます。
- 新しいビジュアルを作成し、ビジュアルタイプに表を選択します。
- 左側のフィールドリストからフィールドをドラッグ&ドロップして、それぞれの領域に配置します。今回は、フィールド eventtype、mailmessageid、mailsubject を グループ化の領域に配置しますが、必要に応じてさらにフィールドを追加できます。
- 次に、このビジュアルにイベントタイプでフィルタリングするフィルターを作成します。まず、テーブルを選択し、左側のメニューからフィルターを選択します。
- Create One をクリックし、ポップアップウィンドウでフィールド eventtype を選択します。次に、eventtype フィルターを選択すると、次のオプションが表示されます。
- eventtype フィルターの右側の点をクリックし、Add to Sheet を選択します。
- すべてのデフォルト値をそのままにして、下にスクロールして Apply を選択します。
図 30. デフォルト値でフィルターを適用 - これで、vwsesmaster ビューを eventtype でフィルターできます。
図 31. eventtype で vwsesmasterview をフィルター - sesmaster テーブル、vwsesmaster ビューで利用可能なすべてのデータを使用して可視化をカスタマイズし続けることができます。さらに、vwSentMails、vwBouncedMails、vwComplainedemails ビューのデータを含めるためにデータセットを追加することもできます。以下に、これらのビューから作成された他の可視化をいくつか示します。
図 32. 最終的な視覚化 1
図 33. 最終的な視覚化 2
図 34. 最終的な視覚化 3
クリーンアップ
このブログで作成したリソースを削除して、継続的な課金を避けてください。
- Amazon QuickSight で作成した可視化を削除する。
- 他のプロジェクトで Amazon QuickSight を使用していない場合は、サブスクリプションを解除する。
- Amazon Athena で作成したビューとテーブルを削除する。
- Amazon SES の設定セットを削除する。
- S3 バケットにログとして保存されている Amazon SES のイベントを削除する。
- Amazon Kinesis Delivery Stream を削除するために、CloudFormation スタックを削除する。
結論
このブログでは、Amazon SES イベントに基づいてメール追跡ソリューションを迅速に作成する方法を、AWS のサービスおよび機能を使って示しました。
このソリューションは、サーバーレスアーキテクチャを完全に採用しているため、インフラを管理する必要がなく、Amazon SES の使用量が少なくても多くても、サーバーを気にすることなく柔軟にソリューションを利用できます。
我々は、ほとんどのお客様の要件に対応したダッシュボードと分析のサンプルをいくつか紹介しました。しかし、このソリューションを発展させ、ダッシュボードにチャートやフィルター、イベントを追加したり削除したりするなど、ニーズに合わせてカスタマイズすることができます。Amazon SES の利用可能なイベント、その構造、および Amazon QuickSight でのダッシュボードと分析の作成方法については、次のドキュメントを参照してください。
パフォーマンスとコスト効率の観点から、この解決策を改善するための設定がいくつかあります。
たとえば、parquet などの列形式のファイルフォーマットを使用したり、Snappy で圧縮したり、メール送信の使用状況に応じて S3 のパーティション戦略を設定したりすることができます。
別の改善点として、Amazon QuickSight でデータを読み取るために SPICE にデータをインポートすることが考えられます。
SPICE を使用すると、Athena からデータが 1 回だけロードされ、手動で更新するかスケジュールを使用して自動的に更新されるまでキャッシュされます。
このウォークスルーを使用して、最初の SES ダッシュボードを構成し、イベントの詳細を可視化することができます。このブログで説明されているサービスは要件に応じて調整できます。
著者について
Oscar Mendoza is a Solutions Architect at AWS based in Bogotá, Colombia. Oscar works with our customers to provide guidance in architectural best practices and to build Well Architected solutions on the AWS platform. He enjoys spending time with his family and his dog and playing music. | |
Luis Eduardo Torres is a Solutions Architect at AWS based in Bogotá, Colombia. He helps companies to build their business using the AWS cloud platform. He has a great interest in Analytics and has been leading the Analytics track of AWS Podcast in Spanish. | |
Santiago Benavídez is a Solutions Architect at AWS based in Buenos Aires, Argentina, with more than 13 years of experience in IT, currently helping DNB/ISV customers to achieve their business goals using the breadth and depth of AWS services, designing highly available, resilient and cost-effective architectures. |
本記事は、Analyzing Amazon SES event data with AWS Analytics Services を翻訳したものです。翻訳は Solutions Architect の 松岡勝也 が担当しました。