亚马逊AWS官方博客

关于 Amazon SES 你需要知道的一些事 – Tracking 篇 02

一. 前言

上一篇我们已经详述过什么是 Amazon SES,Amazon SES 邮件追踪为什么重要以及如何监控 Amazon SES 发送活动。其中我们详细介绍了如何使用 Amazon CloudWatch 监控发送活动,那么这篇我们会着重介绍和演示如何使用 Amazon Kinesis Data Firehose(下文统一使用 Amazon KDF 来替代)来监控发送活动。

二. Amazon KDF 是什么?

Amazon KDF 是一项完全托管的服务,用于将实时流数据传输到目标位置,比如 Amazon Simple Storage Service(Amazon S3)、Amazon Redshift、Amazon OpenSearch Service、Amazon OpenSearch 无服务器、Splunk,以及任何自定义 HTTP 端点或受支持的第三方服务提供商拥有的 HTTP 端点,包括 Datadog、Dynatrace、LogicMonitor、MongoDB、New Relic、Coralogix 和 Elastic。

三. 为什么要使用 Amazon KDF 发送活动?

使用 Amazon KDF 监控 Amazon SES 发送活动有以下优势:

  • 近实时跟踪发送数据。Amazon KDF 可以实时传输 Amazon SES 发送数据到其他 AWS 服务进行分析。这使得可以近实时监控发送情况,比如发送量、各个事件类型数量等;
  • 数据分析。通过 Amazon KDF 可以将 Amazon SES 的数据导入 AWS 服务,比如 Amazon Redshift,Amazon OpenSearch 等,利用其分析功能对发送数据做报表、建模等分析工作。这有助于更深入理解邮件发送情况,做出更好的业务决策;
  • 数据存档。Amazon KDF 支持传输数据到 Amazon S3 做持久化存储,这使得 Amazon SES 的历史发送数据可以长期存档,随时查询与分析;
  • 成本优化。相比自建服务,使用托管服务 Amazon KDF 和配套的亚马逊云科技大数据分析服务能够显著降低成本和运维工作量。

综上,使用 Amazon KDF 结合相关亚马逊云科技服务实现 Amazon SES 发送流程的监控,可以带来数据实时性、丰富的分析功能、成本优化等多方面好处。这对于送达能力与用户体验的持续优化是很有必要的。

四. 使用 Amazon Kinesis Data Firehose 监控发送活动

目前笔者查阅到的,使用 Amazon KDF 监控 Amazon SES 有以下方案:

对于方案一,可以参考 Link。对于方案二,可以参考 Link。今天我们主要演示方案三,使用 Amazon KDF & Amazon OpenSearch 来监控 Amazon SES 发送活动。其中的 Amazon OpenSearch 我们使用 Serverless 版本,详细可以参考此文档

4.1 创建配置集

此步骤可以参考此系列第一篇博客的 4.1 章节。

4.2 创建 IAM Roles

此方案涉及到的 IAM Roles 如下:

其中 Amazon SES 使用 Role1 将相关发送活动明细发送至 Amazon KDF,Amazon KDF 再使用 Role2 将发送活动明细传输至 Amazon OpenSearch Serverless。接下来我们创建 Role1。

将以下内容复制到名为 ses-role-trust-policy.json 的文件中

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "ses.amazonaws.com"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": {
          "AWS:SourceAccount": "account-id",
          "AWS:SourceArn": "arn:aws:ses:region-code:account-id:configuration-set/my-poc-cs"
        }
      }
    }
  ]
}

创建角色

aws iam create-role \
--role-name my-poc-ses2kdf-role \
--assume-role-policy-document file://"ses-role-trust-policy.json"

将以下内容复制到名为 ses-role-policy.json 的文件中

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Action": [
        "firehose:PutRecordBatch"
      ],
      "Resource": [
        "arn:aws:firehose:region-code:account-id:deliverystream/my-poc-kdf"              
      ]
    }
  ]
}

创建策略

aws iam create-policy \
    --policy-name my-poc-ses2kdf-policy \
    --policy-document file://"ses-role-policy.json"

附加策略到 Role1

aws iam attach-role-policy \
  --policy-arn arn:aws:iam::account-id:policy/ my-poc-ses2kdf-policy \
  --role-name my-poc-ses2kdf-role

关于 Role2,我们直接使用 Console 上自动创建出来的角色。

4.3 创建 OpenSearch Serverless

创建 Collection,name 输入 my-poc-oss

选择 Standard create

Access type 选择 Public,并且勾选 Enable access to OpenSearch Dashboards

选择 Skip and configure later

最后选择 Submit。

4.4 创建 Kinesis Data Firehose

Source 选择 Direct,Destination 选择 Amazon OpenSearch Serverless

Source 选择 Direct PUT,Destination 选择 Amazon OpenSearch Serverless。Index 填写 ses,剩下的保持默认

S3 backup bucket 选择一个自己创建的 S3 Bucket,具体创建步骤可以参考此 Link

打开 Advanced Setting,在 Service access 部分选择 Create or update IAM role,并且需要记住这里的 Role Name

最后创建该 Kinesis Data Firehose。

4.5 配置 OpenSearch Serverless 的 Data Access

点击 Create access policy

填写 Access policy name 和 Description

为刚才创建的 Kinesis Data Firehose 所关联的 Role 授权

为自己的 IAM User 授权,便于接下来进入 OpenSearch Serverless Dashboard 查看

4.6 创建 Configuration set 的 Event destination

点击 Add destination

选择所有事件

Destination options 选择 Amazon Kinesis Data Firehose,Name 填入my-poc-kdf,Delivery stream 选择 4.4 部分创建的 my-poc-kdf,IAM Role 选择 my-poc-ses2kdf-role

点击 Add destination,完成创建

五. 在 OpenSearch Serverless Dashboard 中查看 Tracking Event

5.1 模拟发送事件

分别间隔一段时间多次运行测试代码

import boto3

fromAddress = 'sender@example.com'
toAddresses = 'receiver@example.com'
htmlBody = """\
<html>
<body>
<h1>Hello!</h1>
<p>This is a test email for tracking event.</p>
</body>
</html>
"""


client = boto3.client('sesv2', region_name = 'ap-northeast-1')

response = client.send_email(
    FromEmailAddress=fromAddress,
    Destination={
        'ToAddresses': [
            toAddresses,
        ]
    },
    Content={
        'Simple': {
            'Subject': {
                'Data': 'SES Open Track Test',
                'Charset': 'UTF-8'
            },
            'Body': {
                'Html': {
                    'Data': htmlBody,
                    'Charset': 'UTF-8'
                }
            }
        }
    },
    ConfigurationSetName='my-poc-cs'
)

收到邮件后,打开测试邮件

5.2 设置 OpenSearch Serverless Dashboard

点击 Dashboard

打开左边菜单栏,点击 Discover

输入 ses,选择出现的 ses 索引

Time field 选择 mail.timestamp,点击 Create index pattern

接下来我们可以看到该索引的全部 Fields

再次点击左边菜单栏的 Discover,可以看到已经有一些事件数据了

5.3 使用 filter 完成查询

先使用时间 Filter,过滤一遍

可以发现过滤后只有 4 条了

再使用事件类型为 Open 的 Filter,再过滤一遍

可以发现,只有 2 条了

读者可以在自己的环境中根据需求自由组合多种 Filter。

六.结束语

通过本篇博客,我们主要演示和解读了如何使用 Amazon Kinesis Data Firehose 配合 Amazon OpenSearch 来追踪 Amazon SES 的发送事件,接下来我们还会继续探讨如何降低邮件退回率的最佳实践,相信也会帮助到各位读者。

本篇作者

杨探

亚马逊云科技解决方案架构师,负责互联网行业云端架构咨询和设计。