从 Amazon VPC 发布 Amazon SNS 消息 - Amazon Simple Notification Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

从 Amazon VPC 发布 Amazon SNS 消息

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

常见步骤如下:

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

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

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

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

  • 删除您在此过程中创建的资源,以便它们不会保留在您的 Amazon Web Services 账户 中。

下图描述了您在完成这些步骤时在 Amazon 账户中创建的私有网络:


	          您在这些步骤中创建的私有网络的架构。

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

完成这些步骤大约需要 20 分钟。

开始前的准备工作

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

步骤 1:创建 Amazon EC2 密钥对

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

创建密钥对
  1. 登录 Amazon Web Services Management Console,打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

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

  3. 选择创建密钥对

  4. 创建密钥对窗口中,在密钥对名称中,键入 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:创建 Amazon 资源

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

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

此过程的堆栈包括以下资源:

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

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

  • Amazon SNS 主题。

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

  • Amazon CloudWatch 指标和日志。

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

创建 Amazon 资源
  1. 从 GitHub 网站下载模板文件

  2. 登录到 Amazon CloudFormation 控制台

  3. 选择创建堆栈

  4. Select Template (选择模板) 页面上,依次选择 Upload a template to Amazon S3 (将模板上传到 Amazon S3)、您的文件和下一步

  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(功能)下,确认 Amazon CloudFormation 可使用自定义名称创建 IAM 资源。

  9. 选择创建

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

    
	                状态为 CREATE_COMPLETE 的 Amazon CloudFormation 堆栈。
    提示

    选择刷新按钮以查看最新堆栈状态。

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

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

此时,发布操作尝试失败。在后面的步骤中,在您为 Amazon SNS 创建 VPC 终端节点后,您的发布尝试成功。

要连接到您的 Amazon EC2 实例
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

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

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

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

    
	                有关由 Amazon 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 控制台

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

  3. Topics (主题) 页面上,复制主题 VPCE-Tutorial-Topic 的 Amazon Resource Name (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。您可以将消息发布到该主题,而且私下发布消息。它们会保持在 Amazon 网络内部,而且不会通过公有 Internet 传输。

注意

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

创建终端节点
  1. 通过以下网址打开 Amazon VPC 控制台:https://console.aws.amazon.com/vpc/

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

  3. 选择 Create Endpoint(创建端点)

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

  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. 选择Create endpoint。Amazon VPC 控制台确认已创建 VPC 终端节点。

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

    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. 打开 Amazon Lambda 控制台,地址:https://console.aws.amazon.com/lambda/

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

  3. 选择监控

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

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

    
	                Lambda 控制台中的调用计数图表。
验证是否已更新 CloudWatch 日志
  1. 访问 https://console.aws.amazon.com/cloudwatch/,打开 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:清除

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

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

删除您的 VPC 终端节点
  1. 通过以下网址打开 Amazon VPC 控制台:https://console.aws.amazon.com/vpc/

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

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

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

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

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

删除您的 Amazon CloudFormation 堆栈
  1. 打开 Amazon CloudFormation 控制台,地址:https://console.aws.amazon.com/cloudformation

  2. 选择堆栈 VPCE-Tutorial-Stack

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

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

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

有关详细信息,请参阅以下资源: