

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

# 教程：从 Amazon Virtual Private Cloud 将消息发送到 Amazon SQS 队列
<a name="sqs-sending-messages-from-vpc"></a>

本教程将向您演示如何通过安全的私有网络将消息发送到 Amazon SQS 队列。该网络包括：
+ 一个包含 Amazon EC2 实例的 VPC。
+ 一个接口 VPC 端点，它允许 Amazon EC2 实例在未使用公共互联网的情况下连接到 Amazon SQS。

即使在完全私有网络中，您也可以连接到 Amazon EC2 实例并将消息发送到 Amazon SQS 队列。有关更多信息，请参阅 [Amazon SQS 的 Amazon Virtual Private Cloud 端点](sqs-internetwork-traffic-privacy.md#sqs-vpc-endpoints)。

**重要**  
您只能将 Amazon Virtual Private Cloud 与 HTTPS Amazon SQS 端点一起使用。
当您将 Amazon SQS 配置为从 Amazon VPC 发送消息时，必须启用私有 DNS，并为双栈端点指定格式为 `sqs.us-east-2.amazonaws.com` 或 `sqs.us-east-2.api.aws` 的端点。
Amazon SQS 还通过 PrivateLink 使用终端节点服务支持 FIPS 终端节点。`com.amazonaws.region.sqs-fips`您可以连接到格式为 `sqs-fips.region.amazonaws.com` 的 FIPS 端点。
在 Amazon Virtual Private Cloud 中使用双栈终端节点时，将使用 IPv4 和 IPv6发送请求。
私有 DNS 不支持传统端点，例如 `queue.amazonaws.com` 或 `us-east-2.queue.amazonaws.com`。

## 步骤 1：创建 Amazon EC2 密钥对
<a name="create-ec2-key-pair"></a>

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

1. 登录 [Amazon EC2 控制台](https://console.aws.amazon.com/ec2/)。

1. 在导航菜单上的**网络和安全性**下，选择**密钥对**。

1. 选择**创建密钥对**。

1. 在**创建密钥对**对话框中，对于**密钥对名称**，输入 `SQS-VPCE-Tutorial-Key-Pair` 并选择**创建**。

1. 您的浏览器会自动下载私有密钥文件 `SQS-VPCE-Tutorial-Key-Pair.pem`。
**重要**  
将此文件保存在安全位置。EC2 不会再次为同一密钥对生成 `.pem` 文件。

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

   ```
   chmod 400 SQS-VPCE-Tutorial-Key-Pair.pem
   ```

## 步骤 2：创建 AWS 资源
<a name="create-aws-resources"></a>

要设置必要的基础设施，您必须使用 CloudFormation *模板，该模板*是创建由 Amazon EC2 实例和 Amazon SQS 队列等 AWS 资源组成的*堆栈*的蓝图。

本教程的堆栈包括以下资源：
+ VPC 和关联的网络资源，包括子网、安全组、Internet 网关和路由表。
+ 在 VPC 子网中启动的 Amazon EC2 实例
+ 一个 Amazon SQS 队列

 

1. [https://github.com/aws-samples/amazon-sqs-samples/blob/master/templates/SQS-VPCE-Tutorial-CloudFormation.yaml](https://github.com/aws-samples/amazon-sqs-samples/blob/master/templates/SQS-VPCE-Tutorial-CloudFormation.yaml)从下载名为的 CloudFormation 模板GitHub。

1. 登录 [CloudFormation 控制台](https://console.aws.amazon.com/cloudformation/)。

1. 选择**创建堆栈**。

1. 在**选择模板**页面上，依次选择**将模板上传到 Amazon S3**、`SQS-VPCE-SQS-Tutorial-CloudFormation.yaml` 文件和**下一步**。

1. 在**指定详细信息**页面中，执行以下操作：

   1. 对于**堆栈名称**，输入 `SQS-VPCE-Tutorial-Stack`。

   1. 对于 **KeyName**，请选择 **SQS-vpce-Tutorial-Key-p** air。

   1. 选择**下一步**。

1. 在**选项**页面上，选择**下一步**。

1. 在 “**查看**” 页面的 “**能力**” 部分，选择**我确认这 AWS CloudFormation 可能会创建带有自定义名称的 IAM 资源。** ，然后选择 “**创建**”。

CloudFormation 开始创建堆栈并显示 **CREATE\$1IN\$1** PROGRESS 状态。在此过程完成后， CloudFormation 将显示 **CREATE\$1COMPLETE** 状态。

## 步骤 3：确认您的 EC2 实例不可公开访问
<a name="confirm-ec2-instance-is-not-publicly-accessible"></a>

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

1. 登录 [Amazon EC2 控制台](https://console.aws.amazon.com/ec2/)。

1. 在导航菜单上的**实例**下，选择**实例**。

1. 选择 **SQS-VPCE-**。Tutorial-EC2Instance

1. 复制**公有 DNS** 下的主机名，例如 **ec2-203-0-113-0.us-west-2.compute.amazonaws.com**。

1. 从包含[您之前创建的密钥对](#create-ec2-key-pair)的目录中，使用以下命令连接到实例，例如：

   ```
   ssh -i SQS-VPCE-Tutorial-Key-Pair.pem ec2-user@ec2-203-0-113-0.us-east-2.compute.amazonaws.com
   ```

1. 尝试连接到任何公有端点，例如：

   ```
   ping amazon.com
   ```

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

1. 登录 [Amazon SQS 控制台](https://console.aws.amazon.com/sqs/)。

1. 从队列列表中，选择由您的 CloudFormation 模板创建的队列，例如 **vpce-sqs-Tutorial-Stack--** 1 IJK。CFQueue ABCDEFGH2

1. 在**详细信息**表中，复制 URL，例如**https://sqs.us-east-2.amazonaws.com/123456789012/**。

1. 从您的 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 端点
<a name="create-vpc-endpoint-for-sqs"></a>

要将您的 VPC 连接到 Amazon SQS，您必须定义一个接口 VPC 端点。添加端点后，可以使用 VPC 中 EC2 实例的 Amazon SQS API。这使您无需通过公共 Internet 即可向 AWS 网络中的队列发送消息。

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

1. 登录 [Amazon VPC 控制台](https://console.aws.amazon.com/vpc/)。

1. 在导航菜单上，选择**端点**。

1. 选择**创建端点**。

1. 在**创建端点**页面上，对于**服务名称**，选择 Amazon SQS 的服务名称。
**注意**  
服务名称因当前 AWS 区域而异。例如，如果您在美国东部（俄亥俄州），则服务名称为 **com.amazonaws。 *us-east-2*.sqs。**

1. 对于 **VPC**，选择 **SQS-VPCE-Tutorial-VPC**。

1. 对于**子网**，选择其**子网 ID** 包含 **SQS-VPCE-Tutorial-Subnet** 的子网。

1. 对于**安全组**，选择**选择安全组**，然后选择其**组名称**包含 **SQS VPCE Tutorial Security Group** 的安全组。

1. 选择**创建端点**。

   创建接口 VPC 端点并显示其 ID，例如 **vpce-0ab1cdef2ghi3j456k**。

1. 选择**关闭**。

   Amazon VPC 控制台会打开**端点**页面。

Amazon VPC 开始创建端点，并显示**待处理**状态。在此过程完成后，Amazon VPC 将显示**可用**状态。

## 步骤 5：向 Amazon SQS 队列发送消息
<a name="sqs-vpc-tutorial-publish"></a>

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

1. 重新连接到您的 EC2 实例，例如：

   ```
   ssh -i SQS-VPCE-Tutorial-Key-Pair.pem ec2-user@ec2-203-0-113-0.us-east-2.compute.amazonaws.com
   ```

1. 重新尝试使用以下命令向该队列发布消息，例如：

   ```
   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"
   }
   ```

有关从您的 CloudFormation 模板创建的队列中接收和删除消息的信息（例如，**vpce-sqs-Tutorial-Stack--** 1 IJK），请参阅。CFQueue ABCDEFGH2 [在 Amazon SQS 中接收和删除消息](step-receive-delete-message.md)

有关删除资源的信息，请参阅以下内容：
+ 《Amazon VPC 用户指南》**中的[删除 VPC 端点](https://docs.aws.amazon.com/vpc/latest/userguide/delete-vpc-endpoint.html)
+ [删除 Amazon SQS 队列](step-delete-queue.md)
+ 《Amazon EC2 用户指南》**中的[终止实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/terminating-instances.html)
+ 《Amazon VPC 用户指南》**中的[删除 VPC](https://docs.aws.amazon.com/vpc/latest/userguide/delete-vpc.html)
+ 《*AWS CloudFormation 用户指南*》中的 [“在 CloudFormation 控制台上删除堆栈](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-delete-stack.html)”
+ 《Amazon EC2 用户指南》**中的[删除密钥对](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#delete-key-pair)