Amazon Simple Notification Service
开发人员指南 (API 版本 2010-03-31)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

教程:从 Amazon VPC 私下发布 Amazon SNS 消息

在本教程中,您将了解如何发布到 Amazon SNS 主题,同时保护消息在私有网络中的安全性。您从托管在 Amazon Virtual Private Cloud (Amazon VPC) 中的 Amazon EC2 实例发布消息。消息保持在 AWS 网络内部,不会通过公有 Internet 传输。通过从 VPC 私下发布消息,您可以提高应用程序与 Amazon SNS 之间的流量的安全性。这种安全性在您发布有关客户的个人身份信息 (PII) 或当您的应用程序受市场规定约束时至关重要。例如,如果您有一个必须符合健康保险可携性与责任法 (HIPAA) 的医疗保健系统或有一个必须符合支付卡行业数据安全标准 (PCI DSS) 的金融系统,则私下发布会很有用。

要完成此教程,您需要:

  • 使用 AWS CloudFormation 模板在您的 AWS 账户中自动创建一个临时私有网络。

  • 创建一个用于连接 VPC 与 Amazon SNS 的 VPC 终端节点。

  • 登录 Amazon EC2 实例并将消息私下发布到 Amazon SNS 主题。

  • 验证消息是否已成功发送。

  • 删除您为此教程创建的资源,以便它们不会保留在您的 AWS 账户中。

下图描述了您在完成本教程时在 AWS 账户中创建的私有网络:

 您在本教程中创建的私有网络的架构。

此网络包含一个包含 Amazon EC2 实例的 VPC。该实例通过接口 VPC 终端节点 连接到 Amazon SNS。这种类型的终端节点连接到由 AWS PrivateLink 提供技术支持的服务。在建立此连接后,您可以登录 Amazon EC2 实例并将消息发布到 Amazon SNS 主题,即使该网络已从公共 Internet 断开连接。主题会将其收到的消息扇出至两个订阅的 AWS Lambda 函数。这些函数会记录其在 Amazon CloudWatch Logs 中收到的消息。

完成本教程需要大约 20 分钟。

开始前的准备工作

在开始本教程之前,您需要一个 Amazon Web Services (AWS) 账户。在您注册时,您的账户会自动注册到 AWS 中的所有服务,包括 Amazon SNS 和 Amazon VPC。如果您尚未创建账户,请转到 http://amazonaws.cn/,然后选择 Create a Free Account (创建免费账户)

步骤 1:创建 Amazon EC2 键前缀

密钥对 用于登录 Amazon EC2 实例。它包含一个用于加密您的登录信息的公有密钥和一个用于解密该信息的私有密钥。创建密钥对时,下载该私有密钥的副本。在本教程的后面,您将使用该密钥对来登录 Amazon EC2 实例。要登录,请指定密钥对的名称,然后提供密钥对。

创建密钥对

  1. 登录 AWS 管理控制台并通过以下网址打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在左侧导航菜单中,找到 Network & Security (网络与安全) 部分。然后,选择 Key Pairs (密钥对)

  3. 选择 Create Key Pair

  4. Create Key Pair (创建密钥对) 窗口中,对于 Key pair name (密钥对名称),键入 VPCE-Tutorial-KeyPair。然后选择 Create

     “创建密钥对”窗口。
  5. 您的浏览器会自动下载私有密钥文件。将该文件保存至安全位置。Amazon EC2 会为该文件提供 .pem 的扩展名。

  6. (可选) 如果您在 Mac 或 Linux 计算机上使用 SSH 客户端连接到您的实例,请使用 chmod 命令设置您的私有密钥文件的权限,以确保只有您可以读取该文件。

    1. 打开终端并导航到包含该私有密钥的目录:

      $ cd /filepath_to_private_key/
    2. 使用以下命令设置权限:

      $ chmod 400 VPCE-Tutorial-KeyPair.pem

步骤 2:创建 AWS 资源

要设置支持本教程的基础设施,请使用 AWS CloudFormation 模板。模板是一种充当用于构建 AWS 资源的蓝图的文件,例如 Amazon EC2 实例和 Amazon SNS 主题。GitHub 上提供有适用于本教程的模板,供您下载。

您向 AWS CloudFormation 提供该模板,而且 AWS CloudFormation 会将您所需的资源预配置为 AWS 账户中的堆栈。堆栈是可作为单个单元管理的一系列资源。完成本教程后,您可以使用 AWS CloudFormation 一次性删除该堆栈中的所有资源。这些资源不会保留在您的 AWS 账户中,除非您希望它们保留。

本教程的堆栈包括以下资源:

  • VPC 和关联的网络资源,包括子网、安全组、Internet 网关和路由表。

  • 在 VPC 中的子网中启动的 Amazon EC2 实例。

  • Amazon SNS 主题。

  • 两个 AWS Lambda 函数。这些函数接收发布到 Amazon SNS 主题的消息,并且在 CloudWatch Logs 中记录事件。

  • Amazon CloudWatch 指标和日志。

  • 允许 Amazon EC2 实例使用 Amazon SNS 的 IAM 角色及允许 Lambda 函数写入 CloudWatch 日志的 IAM 角色。

创建 AWS 资源

  1. 从 GitHub 网站下载 AWS CloudFormation 模板

  2. 通过以下网址打开 AWS CloudFormation 控制台:https://console.amazonaws.cn/cloudformation

  3. 选择 Create Stack

  4. Select Template (选择模板) 页面上,上传该模板:

    1. 选择将模板上传到 Amazon S3

    2. 选择 Choose File (选择文件),然后提供您已下载的模板文件。

       上传模板的选项。
    3. 选择 Next

  5. Specify Details (指定详细信息) 页面上,指定堆栈和密钥名称:

    1. 对于 Stack name (堆栈名称),键入 VPCE-Tutorial-Stack

    2. 对于 KeyName,选择 VPCE-Tutorial-KeyPair

    3. 对于 SSHLocation,保留默认值 0.0.0.0/0

       “指定详细信息”页面。
    4. 选择 Next

  6. Options (选项) 页面上,保留所有默认值,然后选择 Next (下一步)

  7. Review (审核) 页面上,验证堆栈详细信息。

  8. Capabilities (功能) 下,选中确认 AWS CloudFormation 可使用自定义名称创建 IAM 资源的复选框。

  9. 选择 Create

    AWS CloudFormation 控制台将打开 Stacks (堆栈) 页面。VPCE-Tutorial-Stack 的状态为 CREATE_IN_PROGRESS。在创建过程完成后的几分钟内,该状态将变为 CREATE_COMPLETE

     状态为 CREATE_COMPLETE 的 AWS CloudFormation 堆栈。

    提示

    单击 Refresh (刷新) 按钮以查看最新堆栈状态。

步骤 3:确认您的 Amazon EC2 实例缺少 Internet 访问

上一步中在您的 VPC 中启动的 Amazon EC2 实例缺少 Internet 访问。它不允许出站流量,而且无法将发布到 Amazon SNS。通过登录该实例验证此项。然后,尝试连接到公共终端节点,并尝试向 Amazon SNS 发布消息。

本教程到目前为止,发布操作尝试失败。在后面的步骤中,在您为 Amazon SNS 创建 VPC 终端节点后,您的发布尝试成功。

连接到您的 Amazon EC2 实例

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在左侧导航菜单中,找到 Instances (实例) 部分。然后,选择 Instances (实例)

  3. 在实例列表中,选择 VPCE-Tutorial-EC2Instance

  4. 复制在 Public DNS (IPv4) (公有 DNS (IPv4)) 列中提供的主机名。

     有关由 AWS CloudFormation 启动的 Amazon EC2 实例的详细信息。
  5. 打开终端。从包含该密钥对的目录中,使用以下命令连接到实例,其中,instance-hostname 为您从 Amazon EC2 控制台复制的主机名:

    $ ssh -i VPCE-Tutorial-KeyPair.pem ec2-user@instance-hostname

验证实例是否缺少 Internet 连接

  • 在您的终端中,尝试连接到任何公共终端节点,如 amazon.com:

    $ ping amazon.com

    由于连接尝试失败,您可以随时进行取消(Windows 上按 Ctrl + C 或 macOS 上按 Command + C)。

验证实例是否缺少到 Amazon SNS 的连接

  1. 打开 Amazon SNS 控制台 https://console.amazonaws.cn/sns/

  2. 在左侧导航菜单中,选择 Topics (主题)

  3. Topics (主题) 页面上,复制主题 VPCE-Tutorial-Topic 的 Amazon 资源名称 (ARN)。

  4. 在您的终端中,尝试向该主题发布消息:

    $ aws sns publish --region aws-region --topic-arn sns-topic-arn --message "Hello"

    由于发布尝试失败,您可以随时进行取消。

步骤 4:为 Amazon SNS 创建 Amazon VPC 终端节点

要将 VPC 连接到 Amazon SNS,请定义一个接口 VPC 终端节点。在添加终端节点后,您可以登录您的 VPC 中的 Amazon EC2 实例,然后在这里,您可以使用 Amazon SNS API。您可以将消息发布到该主题,而且私下发布消息。它们会保持在 AWS 网络内部,而且不会通过公有 Internet 传输。

请注意,实例仍缺少对该 Internet 上的其他 AWS 服务和终端节点的访问权限。

创建终端节点

  1. 打开 Amazon VPC 控制台 https://console.amazonaws.cn/vpc/

  2. 在左侧导航菜单中,选择 Endpoints (终端节点)

  3. 选择 Create Endpoint

  4. Create Endpoint (创建终端节点) 页面上,对于 Service category (服务类别),保留默认选择 AWS 服务

  5. 对于 Service Name (服务名称),选择 Amazon SNS 的服务名称。

    服务名称因所选区域而异。例如,如果您选择了 美国东部(弗吉尼亚北部),则服务名称为 com.amazonaws.us-east-1.sns

  6. 对于 VPC,选择名为 VPCE-Tutorial-VPC 的 VPC。

     “创建终端节点”页面上的 VPC 菜单。
  7. 对于 Subnets (子网),选择在子网 ID 中具有 VPCE-Tutorial-Subnet 的子网。

     “创建终端节点”页面上的子网。
  8. 对于 Enable Private DNS Name (启用私有 DNS 名称),选择 Enable for this endpoint (为此终端节点启用)

  9. 对于 Security group (安全组),选择 Select security group (选择安全组),然后选择名为 VPCE-Tutorial-SecurityGroup 的安全组。

     “创建终端节点”页面上的安全组。
  10. 选择创建终端节点。Amazon VPC 控制台确认已创建 VPC 终端节点。

     确认消息在您创建终端节点后显示。
  11. 选择 Close

    Amazon VPC 控制台将打开 Endpoints (终端节点) 页面。新终端节点的状态为 pending (待处理)。在创建过程完成后的几分钟内,该状态将变为 available (可用)

     状态为可用的 VPC 终端节点。

步骤 5:向 Amazon SNS 主题发布消息

现在,您的 VPC 包含 Amazon SNS 的终端节点,您可以登录 Amazon EC2 实例并向该主题发布消息。

发布消息

  1. 如果您的终端不再连接到您的 Amazon EC2 实例,请再次连接:

    $ ssh -i VPCE-Tutorial-KeyPair.pem ec2-user@instance-hostname
  2. 运行您在之前执行过的相同命令,以向您的 Amazon SNS 主题发布消息。此时,发布尝试成功,并且 Amazon SNS 会返回一条消息 ID:

    $ aws sns publish --region aws-region --topic-arn sns-topic-arn --message "Hello" { "MessageId": "5b111270-d169-5be6-9042-410dfc9e86de" }

步骤 6:验证您的消息传输

当 Amazon SNS 主题收到消息时,它会通过将消息发送到两个订阅的 Lambda 函数来扇出消息。在这些函数收到消息后,它们会将事件记录到 CloudWatch 日志。要确认您的消息传输已成功,请检查是否已调用这些函数并且检查是否已更新 CloudWatch 日志。

验证是否已调用 Lambda 函数

  1. 通过以下网址打开 AWS Lambda 控制台:https://console.amazonaws.cn/lambda/

  2. Functions (函数) 页面上,选择 VPCE-Tutorial-Lambda-1

  3. 选择 Monitoring

  4. 检查 Invocation count (调用计数) 图表。此图显示了已运行 Lambda 函数的次数。

    调用计数与您向主题发布消息的次数匹配。

     Lambda 控制台中的调用计数图表。

验证是否已更新 CloudWatch 日志

  1. 通过以下网址打开 CloudWatch 控制台:https://console.amazonaws.cn/cloudwatch/

  2. 在左侧导航菜单中,选择 Logs (日志)

  3. 检查由 Lambda 函数写入的日志:

    1. 选择 /aws/lambda/VPCE-Tutorial-Lambda-1/ 日志组。

    2. 选择日志流。

    3. 检查日志是否包含条目 From SNS: Hello

       CloudWatch 日志包含条目“From SNS: Hello”。
    4. 选择控制台顶部的 Log Groups (日志组) 以返回 Log Groups (日志组) 页面。然后,对 /aws/lambda/VPCE-Tutorial-Lambda-2/ 日志组重复上述步骤。

恭喜您!通过将 Amazon SNS 的终端节点添加到 VPC,您能够从由 VPC 管理的网络内将消息发布到主题。消息是私下发布的,不会对公共 Internet 公开。

步骤 7:清除

除非您想要保留为本教程创建的资源,否则可立即将其删除。通过删除您不再使用的 AWS 资源,可防止您的 AWS 账户产生不必要的费用。

首先,使用 Amazon VPC 控制台删除您的 VPC 终端节点。然后,通过在 AWS CloudFormation 控制台删除堆栈来删除创建的其他资源。删除堆栈时,AWS CloudFormation 会从您的 AWS 账户中删除堆栈的资源。

删除您的 VPC 终端节点

  1. 打开 Amazon VPC 控制台 https://console.amazonaws.cn/vpc/

  2. 在左侧导航菜单中,选择 Endpoints (终端节点)

  3. 选择您创建的终端节点。

  4. 选择 Actions (操作),然后选择 Delete Endpoint (终端节点)

  5. Delete Endpoint (删除终端节点) 窗口中,选择 Yes, Delete (是,删除)

    终端节点状态将变为 deleting (正在删除)。删除操作完成后,终端节点将从页面中删除。

删除您的 AWS CloudFormation 堆栈

  1. 通过以下网址打开 AWS CloudFormation 控制台:https://console.amazonaws.cn/cloudformation

  2. 选择堆栈 VPCE-Tutorial-Stack

  3. 选择 Actions,然后选择 Delete Stack

  4. Delete Stack (删除堆栈) 窗口中,选择 Yes, Delete (是,删除)

    堆栈状态将变为 DELETE_IN_PROGRESS。删除操作完成后,堆栈将从页面中删除。

相关资源

如果您想要更深入了解本教程中介绍的概念,请参阅以下资源。