发布来自亚马逊的亚马逊SNS消息 VPC - Amazon Simple Notification Service

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

发布来自亚马逊的亚马逊SNS消息 VPC

本节介绍如何在 Amazon SNS 主题上发布消息,同时确保私有网络中的消息安全。您发布来自托管在亚马逊虚拟私有云 (AmazonVPC) 中的亚马逊EC2实例的消息。消息保留在 AWS 网络中,无需通过公共互联网传输。通过私密发布来自 a 的消息VPC,您可以提高应用程序与 Amazon 之间流量的安全性SNS。当您发布有关客户的个人身份信息 (PII) 或您的应用程序受市场法规约束时,这种安全性非常重要。例如,如果您的医疗系统必须符合《健康保险便携性和问责法》(HIPAA),或者金融系统必须符合支付卡行业数据安全标准 (PCIDSS),则私下发布会很有帮助。

常见步骤如下:

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

  • 创建将VPC与 Amazon 连接起来的VPC终端节点SNS。

  • 登录亚马逊EC2实例,私下向亚马逊SNS主题发布消息。

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

  • 删除您在此过程中创建的资源,这样它们就不会保留在您的资源中 AWS 账户。

下图描述了您在完成这些步骤时在 AWS 账户中创建的专用网络:

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

该网络由包含 Amazon EC2 实例的网络组成。VPC该实例SNS通过接口VPC终端节点连接到 Amazon。这种类型的端点连接到由提供支持的服务 AWS PrivateLink。建立此连接后,即使网络已与公共互联网断开连接,您也可以登录亚马逊EC2实例并向亚马逊SNS主题发布消息。该主题将其收到的消息分散到两个订阅 AWS Lambda 函数。这些函数将它们收到的消息记录在 Amazon CloudWatch 日志中。

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

开始前的准备工作

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

第 1 步:创建亚马逊EC2密钥对

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

创建密钥对
  1. 登录 AWS Management Console 并打开 Amazon EC2 控制台,网址为https://console.aws.amazon.com/ec2/

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

  3. 选择创建密钥对

  4. 创建密钥对窗口中,在密钥对名称中,键入 VPCE-Tutorial-KeyPair。然后选择 Create

    创建密钥对窗口,密钥对名称字段中包含文本 KeyPair “VPCE-Tutorial-”。
  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 账户,否则这些资源不会保留在您的中。

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

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

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

  • 亚马逊的SNS话题。

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

  • Amazon CloudWatch 指标和日志。

  • 一个允许亚马逊EC2实例使用亚马逊的IAM角色SNS,以及一个允许 Lambda 函数写入日志的IAM角色。 CloudWatch

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

  2. 登录 AWS 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-教程-KeyPair

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

      “指定详细信息” 页面显示堆栈名称 KeyName、和的填充值字段SSHLocation。
    4. 选择下一步

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

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

  8. 在 “权能” 下,确认 AWS CloudFormation 可能会使用自定义名称创建IAM资源。

  9. 选择创建

    AWS CloudFormation 控制台打开堆栈页面。-Tutor VPCE ial-Stack 的状态为 _IN_。CREATE PROGRESS几分钟后,创建过程完成后,状态将变为 CREATE_ COMPLETE

    状态为 CREATE _ 的 AWS CloudFormation 堆栈COMPLETE。
    提示

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

步骤 3:确认您的 Amazon EC2 实例无法访问互联网

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

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

连接到您的 Amazon EC2 实例
  1. 打开亚马逊EC2控制台,网址为https://console.aws.amazon.com/ec2/

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

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

  4. 复制 P ublic DNS (IPv4) 列中提供的主机名。

    有关由启动的 Amazon EC2 实例的详细信息 AWS CloudFormation。
  5. 打开终端。在包含 key pair 的目录中,使用以下命令连接到实例,其中 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. 主题页面上,复制主题 VPCE-教程主题的 Amazon 资源名称 (ARN)。

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

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

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

步骤 4:为亚马逊创建亚马逊VPC终端节点 SNS

要将连接VPC到 AmazonSNS,您需要定义一个接口VPC终端节点。添加终端节点后,您可以登录自己的亚马逊EC2实例VPC,然后从那里使用亚马逊SNSAPI。您可以将消息发布到该主题,而且私下发布消息。它们停留在 AWS 网络中,并且不会在公共互联网上旅行。

注意

该实例仍然无法访问互联网上的其他 AWS 服务和终端节点。

创建终端节点
  1. 打开亚马逊VPC控制台,网址为https://console.aws.amazon.com/vpc/

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

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

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

  5. 在 “服务名称” 中,选择 Amazon 的服务名称SNS。

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

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

    “创建终端节点” 页面上的VPC菜单。
  7. 对于子网,请选择子网 ID 中包含 VPCE-教程子网的子网

    “创建终端节点”页面上的子网。
  8. 对于 “启用私有DNS名称”,选择 “为此端点启用”。

  9. 对于安全组,选择选择安全组,然后选择 VPCE-教程-SecurityGroup

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

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

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

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

第 5 步:向您的亚马逊SNS主题发布消息

现在,您已经VPC包含了 Amazon 的终端节点SNS,您可以登录亚马逊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.aws.amazon.com/lambda/

  2. 函数页面上,选择 VPCE-教程-Lambda-1

  3. 选择监控

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

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

    Lambda 控制台中的调用计数图表。
验证 CloudWatch 日志是否已更新
  1. 打开 CloudWatch 控制台,网址为https://console.aws.amazon.com/cloudwatch/

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

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

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

    2. 选择日志流。

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

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

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

步骤 7:清除

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

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

删除您的VPC终端节点
  1. 打开亚马逊VPC控制台,网址为https://console.aws.amazon.com/vpc/

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

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

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

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

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

删除您的 AWS CloudFormation 堆栈
  1. https://console.aws.amazon.com/cloudformat ion 上打开 AWS CloudFormation 控制台。

  2. 选择堆栈 VPCE-教程堆栈。

  3. 选择 Actions)(操作),然后选择 Delete Stack(删除堆栈)。

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

    堆栈状态更改为 DELETE_IN_ PROGRESS。删除操作完成后,堆栈将从页面中删除。

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