使用 Amazon SES 通过单个电子邮件地址注册多个 Amazon Web Services account - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Amazon SES 通过单个电子邮件地址注册多个 Amazon Web Services account

由 Joe Wozniak(AWS) 和 Shubhangi Vishwakarma(AWS) 编写

代码存储库:GitHub aws-account-factory-email

环境:PoC 或试点

技术:基础设施、管理和治理、消息和通信

Amazon Web Services:AWS Lambda、Amazon SES、Amazon DynamoDB

Summary

此示例介绍了如何将真实电子邮件地址与与 Amazon Web Services account 关联的电子邮件地址分离。Amazon Web Services account 需要在创建账户时提供唯一的电子邮件地址。在某些组织中,管理 Amazon Web Services account 的团队必须承担与其消息传递团队一起管理许多唯一电子邮件地址的负担。对于管理多个 Amazon Web Services account 的大型组织来说,这可能很困难。

此模式提供了一种独特的电子邮件地址自动售货解决方案,让 Amazon Web Services account 拥有者能够将一个电子邮件地址与多个 Amazon Web Services account 关联起来。然后,Amazon Web Services account 拥有者的真实电子邮件地址将与表格中生成的这些电子邮件地址相关联。该解决方案处理唯一电子邮件账户的所有传入电子邮件,查找每个账户的拥有者,然后将收到的所有邮件转发给拥有者。 

先决条件和限制

先决条件

  • Amazon Web Services account 的管理权限。

  • 访问开发环境。我们建议您使用 AWS Cloud9,以免自己设置所需工具和访问密钥。

  • (可选)熟悉 AWS Cloud Development Kit (AWS CDK) 工作流和 Python 编程语言将帮助您解决任何问题或进行修改。

限制

  • 出售的电子邮件地址的总长度为 64 个字符。有关详细信息,请参阅 AWS O CreateAccountrganizations API 参考中。

产品版本

  • Node.js 版本 12.7.0 或更高版本

  • Python 3.9 或更高版本

  • Python 软件包 pipvirtualenv

  • AWS CDK 版本 2.23.0 或更高版本

  • Docker 20.10.x 或更高版本

架构

目标技术堆栈

  • AWS CloudFormation 堆栈

  • AWS Lambda 函数

  • Amazon Simple Email Address (Amazon SES) 规则和规则集

  • AWS Identity and Access Management (IAM) 角色和策略

  • Amazon Simple Storage Service (Amazon S3) 存储桶和存储桶策略

  • AWS Key Management Service(AWS KMS) 密钥和密钥政策

  • Amazon Simple Notification Service(Amazon SNS) 主题和主题策略

  • Amazon DynamoDB 表

目标架构

使用单个电子邮件地址注册多个 Amazon Web Services account 目标架构

此图显示了两个流程:

  • 电子邮件地址自动售货流程:在图中,电子邮件地址自动售货流程(下部分)通常从账户自动售货解决方案或外部自动化开始,或者手动调用。在请求中,使用包含所需元数据的负载调用 Lambda 函数。该函数使用此信息生成唯一的账户名和电子邮件地址,将其存储在 DynamoDB 数据库,然后将值返回给调用方。然后,可以使用这些值来创建新 Amazon Web Services account (通常使用 AWS Organizations)。

  • 电子邮件转发流程:此流程如上图的上半部分所示。当使用从电子邮件地址销售流程生成的账户电子邮件创建 Amazon Web Services account 时,AWS 会向该电子邮件地址发送各种电子邮件,例如账户注册确认和定期通知。按照此模式中的步骤操作,您可使用 Amazon SES 配置您的 Amazon Web Services account,以接收整个域的电子邮件。此解决方案配置了转发规则,允许 Lambda 处理所有传入的电子邮件,检查该 TO 地址是否在 DynamoDB 表中,然后将邮件转发到账户拥有者的电子邮件地址。使用此流程,账户拥有者可以将多个账户与一个电子邮件地址相关联。

自动化和扩缩

此模式使用 AWS CDK 完全自动化部署。该解决方案使用 AWS 托管服务,这些服务将(或可以配置为)自动扩缩以满足您的需求。Lambda 函数可能需要额外配置才能满足您的扩缩需求。有关更多信息,请参见 Lambda 文档中的 Lambda 函数扩缩

工具

Amazon Web Services

  • AWS Cloud9 是一种集成式开发环境(IDE),可帮助您编写、构建、运行、测试和调试软件。它还可以帮助您将软件发布到 Amazon Web Services Cloud。

  • AWS CloudFormation 可帮助您设置 AWS 资源,快速一致地配置这些资源,并在 AWS 账户和区域的整个生命周期中对其进行管理。

  • AWS 命令行界面(AWS CLI)是一种开源工具,它可帮助您通过命令行 Shell 中的命令与 Amazon Web Services 交互。

  • Amazon DynamoDB 是一项完全托管的 NoSQL 数据库服务,可提供快速、可预测和可扩展的性能。

  • AWS Identity and Access Management (AWS IAM) 通过控制验证和授权使用您 AWS 资源的用户,帮助您安全地管理对您 AWS 资源的访问。

  • AWS Key Management Service (AWS KMS) 可帮助您创建和控制加密密钥,以帮助保护您的数据。

  • AWS Lambda 是一项计算服务,可帮助您运行代码,而无需预置或管理服务器。它仅在需要时运行您的代码,并且能自动扩缩,因此您只需为使用的计算时间付费。

  • Amazon Simple Email Service (Amazon SES) 帮助您通过使用您自己的电子邮件地址和域发送和接收电子邮件。

  • Amazon Simple Notification Service (Amazon SNS) 可帮助您协调和管理发布者与客户端(包括 Web 服务器和电子邮件地址)之间的消息交换。

  • Amazon Simple Storage Service (Amazon S3) 是一项基于云的对象存储服务,可帮助您存储、保护和检索任意数量的数据。

部署所需工具

  • 使用 AWS CLI 和 IAM 访问您的 Amazon Web Services account 的开发环境。 有关详细信息,请参阅相关资源部分中的链接。我们建议您使用 AWS Cloud9 简化设置过程。 

  • 如果您使用 AWS Cloud9,则将为您配置以下内容。 如果您选择不使用 AWS Cloud9,则需安装以下内容:

    • 用于为 AWS CDK 配置访问凭证的 AWS CLI。有关更多信息,请参阅 AWS CLI 文档

    • Python 版本 3.9 或更高版本

    • Python 软件包 pipvirtualenv

    • Node.js 版本 12.7.0 或更高版本

    • AWS CDK 版本 2.23.0 或更高版本

    • Docker 版本 20.10.x 或更高版本

代码

此模式的代码可在 GitHub AWS 账户工厂电子邮件存储库中找到。

操作说明

任务描述所需技能

确定或创建 Amazon Web Services account。

确定您拥有完全管理访问权限的现有或新 Amazon Web Services account,以部署电子邮件解决方案。  

AWS 管理员、云管理员

设置部署环境。

按照以下步骤配置易于使用的部署环境并设置依赖项:

  1. 将 AWS Cloud9 实例部署为专用部署环境。有关说明,请参见 AWS Cloud9 入门

  2. 使用以下命令 GitHub 将 AWS 账户工厂电子邮件存储库代码库克隆到 AWS Cloud9 实例:

    git clone https://github.com/aws-samples/aws-account-factory-email
  3. requirements.txt 文件(在存储库的根目录中),更新以 aws-cdk-lib== 开头的行,使其与您的环境中运行的 AWS CDK 版本相匹配。要识别版本,请使用 cdk --version 命令。

AWS DevOps,应用程序开发者
任务描述所需技能

识别和分配域。

电子邮件转发功能需要专用域。识别并分配您可以使用 Amazon SES 验证的域或子域。该域应该可用于接收部署了电子邮件转发解决方案的 Amazon Web Services account 内的传入电子邮件。

域要求:

  • 该域应该是标准域或子域。

  • 该域应该是外部 DNS 可解析的,因为它将用于接收来自组织外部的电子邮件。

云管理员、网络管理员、DNS 管理员

验证域。

验证所识别的域是否可用于接受传入电子邮件。

完成 Amazon SES 文档中的验证您的域以接收 Amazon SES 电子邮件中的说明。这需要与负责域的 DNS 记录人员或团队进行协调。

AWS 应用程序开发人员 DevOps

设置 MX 记录。

使用指向您的 Amazon Web Services account 和区域中的 Amazon SES 端点的 MX 记录设置您的域。有关更多信息,请参阅 Amazon SES 文档中的发布 Amazon SES 电子邮件接收的 MX 记录

云管理员、网络管理员、DNS 管理员
任务描述所需技能

修改 cdk.json 中的默认值。

编辑 cdk.json 文件中的一些默认值(位于存储库的根目录),以便解决方案在部署后能够正常运行。

  1. 修改 SES_DOMAIN_NAME 值以匹配您之前验证的域名。

  2. 修改 ADDRESS_FROM 值以包含中的相同域 SES_DOMAIN_NAME。地址的本地部分应由您的云团队决定。该地址将成为通过解决方案转发的每封电子邮件的 FROM 地址。

  3. 修改 ADDRESS_ADMIN 值,以匹配任何不匹配的传入邮件将被转发到的电子邮件地址。此值必须是有效的电子邮件地址。

AWS 应用程序开发人员 DevOps

部署电子邮件自动售卖与转发解决方案。

  1. 创建 Python 虚拟环境:

    python -m venv .venv
  2. 激活 Python 虚拟环境:

    source .venv/bin/activate

    或者在 Windows 平台上,使用:

    % .venv\Scripts\activate.bat
  3. 准确无误安装所有 Python 要求:

    pip install -r requirements.txt
  4. 合成 CloudFormation 模板:

    cdk synth

    确认没有错误,并且完整 CloudFormation 模板包含预期的输出。

  5. (可选)如果您是首次将 AWS CDK 代码部署至当前 Amazon Web Services account 或区域,请引导环境。有关更多信息,请参阅 AWS CDK 文档中的引导

    cdk bootstrap aws://AWS-ACCOUNT-NUMBER/REGION

    AWS-ACCOUNT-NUMBERREGION 替换为实际值。

  6. 部署解决方案:

    cdk bootstrap cdk deploy

    命令应该没有错误地完成。

AWS 应用程序开发人员 DevOps

验证解决方案是否已部署。

开始测试之前,验证解决方案是否成功部署:

  1. 打开 A WS CloudFormation 控制台并查找包含该名称的 CloudFormation 堆栈AwsMailFwdStack

  2. 确认 AwsMailFwdStack 堆栈具有以下资源:

    • Lambda 函数

    • Amazon SES 规则和规则集

    • IAM 角色和策略

    • Amazon S3 存储桶和存储桶策略

    • AWS KMS 密钥和密钥政策

    • Amazon SNS 主题和主题策略

    • DynamoDB 表

AWS 应用程序开发人员 DevOps
任务描述所需技能

验证该 API 是否正常运行。

在此步骤中,您将测试数据提交到解决方案的 API,并确认解决方案产生预期输出并且后端操作已按预期执行。

使用测试输入,手动运行 Vend Email Lambda 函数。(有关示例,请参阅 sample_vend_request.json 文件。) 对于 OwnerAddress,请使用有效的电子邮件地址。API 应返回账户名和账户电子邮件以及预期的值。

AWS 应用程序开发人员 DevOps

确认电子邮件已转发。

在此步骤中,您通过系统发送测试电子邮件并验证电子邮件是否转发给预期收件人。

  1. 获取上一步中的账户电子邮件。

  2. 向此地址发送一封包含测试主题和正文的电子邮件。

  3. 确认您已通过账户拥有者的电子邮件地址收到电子邮件。

  4. 确认您收到的电子邮件中的 FROM 地址与 cdk.json 中的 ADDRESS_FROM 设置相匹配。

  5. 确认收到的电子邮件的主题和正文与原始发送邮件相同。

AWS 应用程序开发人员 DevOps

故障排除

问题解决方案

系统无法按预期转发电子邮件。

验证您的设置是否正确:

  1. 您应该已经完成域 Amazon SES 验证流程

  2. 您的域名应正确设置,MX 记录指向您的 Amazon Web Services account 和地区中的 Amazon SES 端点。有关更多信息,请参阅 Amazon SES 文档中的发布 Amazon SES 电子邮件接收的 MX 记录

验证域设置后,请按下列步骤操作:

  1. 打开您部署解决方案的账户和区域的 AWS CloudWatch 控制台,然后在导航窗格中导航到 CloudWatch 日志组。

  2. 在日志组列表中搜索 SesMailForwardLogGroup

  3. 调查此组中的日志,以查看在电子邮件销售和转发过程中是否生成了任何错误。

尝试部署 AWS CDK 堆栈时,以下类似错误信息:

“模板格式错误:无法识别的资源类型”

在大多数情况下,此错误消息意味着您所定位的区域没有所有可用的 Amazon Web Services。如您使用 AWS Cloud9 部署解决方案,则您的目标区域可能与运行 AWS Cloud9 实例的区域不同。

注意:默认情况下,AWS CDK 会部署至您在 AWS CLI 中配置的区域和账户。

可能的解决方案:

  1. 通过查看按区域划分的 Amazon Web Services,调查此解决方案所需所有服务 (参见此模式前面的目标技术堆栈部分) 是否都在您目标的 AWS 区域

  2. 如果您使用的是 AWS Cloud9,并且目标区域与运行 AWS Cloud9 实例的区域不同,请务必在部署解决方案之前设置 AWS_DEFAULT_REGION 环境变量或使用 AWS CLI 设置区域。有关更多信息,请参阅 AWS CLI 文档中的用于配置 AWS CLI 的环境变量。或者,您可按照 AWS CDK 环境文档中的说明修改存储库根目录中的 app.py 文件,使其包含硬编码的账户 ID 和区域。

部署此解决方案时,您会收到错误消息:

“部署失败:错误:: 找不到 SSM 参数 /cdk- AwsMailFwdStack bootstrap/hnb659fds/版本。是否已引导环境? 请运行 'cdk bootstrap'

如您从未将任何 AWS CDK 资源部署到目标的 Amazon Web Services account 和区域,则必须先按照错误提示运行 cdk bootstrap 命令。如果您在运行引导命令后继续收到此错误,则您可能正在尝试将解决方案部署到与运行 AWS Cloud9 实例的区域不同的区域。

若要解决此问题,请在部署解决方案之前使用 AWS CLI 设置 AWS_DEFAULT_REGION 环境变量或设置区域。或者,您可按照 AWS CDK 环境文档中的说明修改存储库根目录中的app.py文件,使其包含硬编码的账户 ID 和区域。

相关资源

其他信息

成本

当您部署此解决方案时,Amazon Web Services account 持有者可能会产生与使用以下服务相关的费用。 对您来说,了解这些服务的计费方式非常重要,这样您就可以了解任何潜在的费用。有关定价信息,请参阅以下页面: