Amazon Simple Queue Service
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

教程:从 Amazon Virtual Private Cloud 将消息发送到 Amazon SQS 队列

在本教程中,您将学习如何通过安全的专用网络将消息发送到 Amazon SQS 队列。此网络包含一个包含 Amazon EC2 实例的 VPC。该实例通过接口 VPC 终端节点连接到 Amazon SQS,这允许您连接到 Amazon EC2 实例并将消息发送到 Amazon SQS 队列,即使网络与公共 Internet 断开连接也是如此。有关更多信息,请参阅 Amazon SQS 的 Amazon Virtual Private Cloud 终端节点

重要

在将 Amazon SQS 配置为从 Amazon VPC 发送消息时,请确保启用私有 DNS,并且仅使用格式为 sqs.us-east-2.amazonaws.com 的终端节点。

私有 DNS 不支持传统终端节点,例如 queue.amazonaws.comus-east-2.queue.amazonaws.com

步骤 1:创建 Amazon EC2 键前缀

利用密钥对,您可以连接到 Amazon EC2 实例。它包含一个用于加密您的登录信息的公有密钥和一个用于解密该信息的私有密钥。

  1. 登录 Amazon EC2 控制台

  2. 在导航菜单上的网络和安全性下,选择密钥对

  3. 选择 Create Key Pair

  4. 创建密钥对对话框中,对于密钥对名称,输入 SQS-VPCE-Tutorial-Key-Pair 并选择创建

  5. 您的浏览器会自动下载私有密钥文件 SQS-VPCE-Tutorial-Key-Pair.pem

    重要

    将此文件保存在安全位置。EC2 不会再次为同一密钥对生成 .pem 文件。

  6. 要允许 SSH 客户端连接到您的 EC2 实例,请设置私有密钥文件的权限,以便只有您的用户有权读取该文件,例如:

    chmod 400 SQS-VPCE-Tutorial-KeyPair.pem

步骤 2:创建 AWS 资源

要设置必要的基础设施,您必须使用 AWS CloudFormation 模板,它是用于创建包含 AWS 资源(例如 Amazon EC2 实例和 Amazon SQS 队列)的堆栈 的蓝图。

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

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

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

  • 一个 Amazon SQS 队列

  1. 从 GitHub 下载名为 SQS-VPCE-Tutorial-CloudFormation.yaml 的 AWS CloudFormation 模板。

  2. 登录 AWS CloudFormation 控制台

  3. 选择创建堆栈

  4. 选择模板页面上,依次选择将模板上传到 Amazon S3SQS-VPCE-SQS-Tutorial-CloudFormation.yaml 文件和下一步

  5. 指定详细信息页面中,执行以下操作:

    1. 对于堆栈名称,输入 SQS-VPCE-Tutorial-Stack

    2. 对于关键字名称,选择 SQS-VPCE-Tutorial-Key-Pair

    3. 选择 Next

  6. Options 页面上,选择 Next

  7. 审核页上的功能部分中,选择我确认,AWS CloudFormation 可能创建具有自定义名称的 IAM 资源。,然后选择创建

AWS CloudFormation 开始创建堆栈,并显示 CREATE_IN_PROGRESS 状态。在此过程完成后,AWS CloudFormation 将显示 CREATE_COMPLETE 状态。

步骤 3:确认您的 EC2 实例不可公开访问

您的 AWS CloudFormation 模板在 VPC 中启动名为 SQS-VPCE-Tutorial-EC2-Instance 的 EC2 实例。此 EC2 实例不允许出站流量,并且无法将消息发送到 Amazon SQS。要验证这一点,您必须连接到实例,请尝试连接到公有终端节点,然后尝试将消息发送到 Amazon SQS。

  1. 登录 Amazon EC2 控制台

  2. 在导航菜单上的实例下,选择实例

  3. 选择 SQS-VPCE-Tutorial-EC2Instance

  4. 复制公有 DNS (IPv4) 下的主机名,例如 ec2-203-0-113-0.us-west-2.compute.amazonaws.com

  5. 从包含您之前创建的密钥对的目录中,使用以下命令连接到实例,例如:

    ssh -i SQS-VPCE-Tutorial-KeyPair.pem ec2-user@ec2-203-0-113-0.us-east-2.compute.amazonaws.com
  6. 尝试连接到任何公有终端节点,例如:

    ping amazon.com

    正如预期的那样,连接尝试失败。

  7. 登录 Amazon SQS 控制台

  8. 从队列列表中,选择由 AWS CloudFormation 模板(例如 VPCE-SQS-Tutorial-Stack-CFQueue-1ABCDEFGH2IJK)创建的队列。

  9. 详细信息表上,复制 URL,例如 https://sqs.us-east-2.amazonaws.com/123456789012/

  10. 从您的 EC2 实例,尝试使用以下命令向该队列发布消息,例如:

    aws sqs send-message --region us-east-2 --endpoint-url https://sqs.us-east-2.amazonaws.com/ --queue-url https://sqs.us-east-2.amazonaws.com/123456789012/ --message-body "Hello from Amazon SQS."

    正如预期的那样,发送尝试失败。

    重要

    稍后,当您为 Amazon SQS 创建 VPC 终端节点时,您的发送尝试将成功。

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

要将 VPC 连接到 Amazon SQS,您必须定义一个接口 VPC 终端节点。添加终端节点后,可以使用 VPC 中的 EC2 实例的 Amazon SQS API。这允许您将消息发送到 AWS 网络中的队列,而无需跨公共 Internet。

注意

EC2 实例仍无法访问 Internet 上的其他 AWS 服务和终端节点。

  1. 登录 Amazon VPC 控制台

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

  3. 选择 Create Endpoint

  4. 创建终端节点 (Create Endpoint) 页上,对于服务名称 (Service Name),选择 Amazon SQS 的服务名称。

    注意

    服务名称因当前 AWS 区域而异。例如,如果您在 美国东部(俄亥俄州) 中,则服务名称为 sqs.us-east-2.amazonaws.com

  5. 对于 VPC,选择 SQS-VPCE-Tutorial-VPC

  6. 对于子网 (Subnets),选择其子网 ID (Subnet ID) 包含 SQS-VPCE-Tutorial-Subnet 的子网。

  7. 对于安全组 (Security group),选择选择安全组 (Select security groups),然后选择其组名称 (Group Name)包含 SQS VPCE Tutorial Security Group 的安全组。

  8. 选择创建终端节点 (Create endpoint)

    创建接口 VPC 终端节点并显示其 ID,例如 vpce-0ab1cdef2ghi3j456k

  9. 选择关闭 (Close)

    Amazon VPC 控制台将打开终端节点 (Endpoints) 页面。

Amazon VPC 开始创建终端节点,并显示待处理 (pending) 状态。在此过程完成后,Amazon VPC 将显示可用 (available) 状态。

步骤 5:向 Amazon SQS 队列发送消息

现在您的 VPC 包含 Amazon SQS 的终端节点,您可以连接到您的 EC2 实例并将消息发送到您的队列。

  1. 重新连接到您的 EC2 实例,例如:

    ssh -i SQS-VPCE-Tutorial-KeyPair.pem ec2-user@ec2-203-0-113-0.us-east-2.compute.amazonaws.com
  2. 重新尝试使用以下命令向该队列发布消息,例如:

    aws sqs send-message --region us-east-2 --endpoint-url https://sqs.us-east-2.amazonaws.com/ --queue-url https://sqs.us-east-2.amazonaws.com/123456789012/ --message-body "Hello from Amazon SQS."

    发送尝试成功,并且将显示消息正文的 MD5 摘要和消息 ID,例如:

    { "MD5OfMessageBody": "a1bcd2ef3g45hi678j90klmn12p34qr5", "MessageId": "12345a67-8901-2345-bc67-d890123e45fg" }

有关在由 AWS CloudFormation 模板创建的队列中接收和删除消息的信息(例如,VPCE-SQS-Tutorial-Stack-CFQueue-1ABCDEFGH2IJK),请参阅接收和删除来自 Amazon SQS 队列的消息

有关删除资源的信息,请参阅以下内容: