📮

Amazon SESのメールログを簡単に分析する、AWS AthenaでSQLを使う方法

に公開

Amazon SESのメールログを簡単に分析する、AWS AthenaでSQLを使う方法

Amazon SESから出力されるメール送信ログは、そのままでは分析しにくいJSON形式で保存されます。AWS Athenaを使って、このログをSQLで検索できるようにして、バウンス率の分析やメール開封数の確認を簡単にします。

ログをAthenaで読み込むための「テーブル」を作る

Athenaでログを扱うには、まずログの構造をテーブルを作成して、Athenaに教えてあげます。

SESのログはJSON形式なので、ROW FORMAT SERDE org.openx.data.jsonserde.JsonSerDeと指定して、JSONを読み込めるように指定します。

CREATE EXTERNAL TABLEというコマンドで、ログが保存されているS3バケットを「外部テーブル」として定義します。

CREATE EXTERNAL TABLE ses_logs (
  eventType string,
  bounce struct<
    feedbackId:string,
    bounceType:string,
    bounceSubType:string,
    bouncedRecipients:array<
      struct<
        emailAddress:string,
        action:string,
        status:string,
        diagnosticCode:string
      >
    >,
    timestamp:string,
    remoteMtaIp:string,
    reportingMTA:string
  >,
  delivery struct<
    timestamp:string,
    processingTimeMillis: int,
    recipients: array<string>,
    smtpResponse: string,
    remoteMtaIp: string,
    reportingMTA: string
  >,
  mail struct<
    timestamp:string,
    source:string,
    sourceArn:string,
    sendingAccountId:string,
    messageId:string,
    destination:array<string>,
    headersTruncated:boolean,
    headers:array<
      struct<
        name:string,
        value:string
      >
    >,
    tags:map<string,array<string>>
  >
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://[SESのログのあるバケット名]'
TBLPROPERTIES ('has_encrypted_data'='false');

ses_logs: テーブルの名前です。自由に設定できます。
eventType: イベントの種類(Bounce, Deliveryなど)が入るカラムです。
bounce struct<...>: bounceイベントの詳細情報を格納するための構造体(struct)です。
delivery struct<...>: deliveryイベントの詳細情報を格納するための構造体です。
mail struct<...>: メール自体の情報(送信元、送信先など)を格納する構造体です。
LOCATION 's3://[SESのログのあるバケット名]': SESのログが保存されているS3バケットのパスを指定します。

bouncedeliveryのように、イベントごとに中身が異なるJSONの階層構造を、このようにstructを使って定義することで、SQLでアクセスできるようになります。

作成したテーブルをSQLで検索する

テーブルの作成が終われば、あとは普通のデータベースのようにSELECT文を使ってデータを検索できます。

bounce構造体の中のbounceTypeを取得したい場合は、bounce.bounceTypeのように.(ドット)でつなげて指定します。

また、tagsのようにキーと値のペアで構成されたmap形式のデータは、mail.tags['キー名']のように角括弧 [] を使ってアクセスします。

SELECT
 eventType
 ,bounce.bounceType    as bounce_bounceType
 ,bounce.bounceSubType as bounce_bounceSubType
 ,delivery.timestamp   as delivery_timestamp
 ,delivery.recipients  as delivery_recipients
 ,mail.source          as mail_source
 ,mail.destination     as mail_destination
 ,mail.tags['ses:source-tls-version']  as ses_source_tls_version
 ,mail.tags['ses:from-domain']         as ses_from_domain
FROM
  ses_logs;

結果

SESのJSONログをSQLで簡単に扱い、分析が可能になります。

Discussion