

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

# Amazon SQS 中的数据保护
<a name="data-protection"></a>

分 AWS [担责任模型](https://aws.amazon.com/compliance/shared-responsibility-model/)适用于亚马逊简单队列服务中的数据保护。如本模型所述 AWS ，负责保护运行所有内容的全球基础架构 AWS 云。您负责维护对托管在此基础结构上的内容的控制。您还负责您所使用的 AWS 服务 的安全配置和管理任务。有关数据隐私的更多信息，请参阅[数据隐私常见问题](https://aws.amazon.com/compliance/data-privacy-faq/)。有关欧洲数据保护的信息，请参阅 *AWS Security Blog* 上的 [AWS Shared Responsibility Model and GDPR](https://aws.amazon.com/blogs/security/the-aws-shared-responsibility-model-and-gdpr/) 博客文章。

出于数据保护目的，我们建议您保护 AWS 账户 凭证并使用 AWS IAM Identity Center 或 AWS Identity and Access Management (IAM) 设置个人用户。这样，每个用户只获得履行其工作职责所需的权限。还建议您通过以下方式保护数据：
+ 对每个账户使用多重身份验证（MFA）。
+ 用于 SSL/TLS 与 AWS 资源通信。我们要求使用 TLS 1.2，建议使用 TLS 1.3。
+ 使用设置 API 和用户活动日志 AWS CloudTrail。有关使用 CloudTrail 跟踪捕获 AWS 活动的信息，请参阅《*AWS CloudTrail 用户指南》*中的[使用跟 CloudTrail 踪](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-trails.html)。
+ 使用 AWS 加密解决方案以及其中的所有默认安全控件 AWS 服务。
+ 使用高级托管安全服务（例如 Amazon Macie），它有助于发现和保护存储在 Amazon S3 中的敏感数据。
+ 如果您在 AWS 通过命令行界面或 API 进行访问时需要经过 FIPS 140-3 验证的加密模块，请使用 FIPS 端点。有关可用的 FIPS 端点的更多信息，请参阅《美国联邦信息处理标准（FIPS）第 140-3 版》[https://aws.amazon.com/compliance/fips/](https://aws.amazon.com/compliance/fips/)。

强烈建议您切勿将机密信息或敏感信息（如您客户的电子邮件地址）放入标签或自由格式文本字段（如**名称**字段）。这包括您 AWS 服务 使用控制台、API 或与 Amazon SQS 或其他机构合作时。 AWS CLI AWS SDKs在用于名称的标签或自由格式文本字段中输入的任何数据都可能会用于计费或诊断日志。如果您向外部服务器提供 URL，强烈建议您不要在网址中包含凭证信息来验证对该服务器的请求。

以下部分提供有关 Amazon SQS 中数据保护的信息。

# Amazon SQS 中的数据加密
<a name="sqs-data-encryption"></a>

数据保护指在数据传输（发往和离开 Amazon SQS 时）和处于静态（存储在 Amazon SQS 数据中心的磁盘上时）期间保护数据。您可以使用安全套接字层 (SSL) 或客户端加密保护传输中的数据。默认情况下，Amazon SQS 使用磁盘加密来存储消息和文件。您可以在将消息保存到数据中心的加密文件系统之前请求 Amazon SQS 对其进行加密，从而保护静态数据。Amazon SQS 建议使用 SSE 来优化数据加密。

**Topics**
+ [静态加密](sqs-server-side-encryption.md)
+ [密钥管理](sqs-key-management.md)

# Amazon SQS 中的静态加密
<a name="sqs-server-side-encryption"></a>

借助服务器端加密 (SSE)，您可以采用加密队列的方式传输敏感数据。SSE 使用 SQS 托管的加密密钥 (SSE-SQS) 或在 (SSE-KMS) 中管理的密钥来保护队列中消息的内容。 AWS Key Management Service 有关使用管理 SSE 的信息 AWS 管理控制台，请参阅以下内容：
+ [为队列配置 SSE-SQS（控制台）](sqs-configure-sqs-sse-queue.md)
+ [为队列配置 SSE-KMS（控制台）](sqs-configure-sse-existing-queue.md)

 有关使用 适用于 Java 的 AWS SDK （以及`[CreateQueue](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_CreateQueue.html)`、`[SetQueueAttributes](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SetQueueAttributes.html)`和`[GetQueueAttributes](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_GetQueueAttributes.html)`操作）管理 SSE 的信息，请参阅以下示例：
+ [在 Amazon SQS 队列中使用服务器端加密](sqs-java-configure-sse.md)
+ [为配置 KMS 权限 AWS 服务](sqs-key-management.md#compatibility-with-aws-services)

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/Mw1NVpJsOZc?rel=0&amp;controls=0&amp;showinfo=0/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/Mw1NVpJsOZc?rel=0&amp;controls=0&amp;showinfo=0)


一旦 Amazon SQS 收到消息，SSE 就会对消息进行加密。这些消息以加密形式存储，仅当消息发送给授权使用者时，Amazon SQS 才会对消息进行解密。

**重要**  
针对启用了 SSE 的队列的所有请求都必须使用 HTTPS 和 [Signature Version 4](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)。  
使用默认密钥（Amazon SQS 的AWS 托管 KMS 密钥）的[加密队列](#sqs-server-side-encryption)无法在其他队列中调用 Lambda 函数。 AWS 账户  
可以使用 AWS Security Token Service `[AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)`操作向 Amazon SQS 发送通知的 AWS 服务的某些功能与 SSE 兼容，但*仅适用于标准队列*：  
[Auto Scaling 生命周期挂钩](https://docs.aws.amazon.com/autoscaling/ec2/userguide/lifecycle-hooks.html)
[AWS Lambda 死信队列](https://docs.aws.amazon.com/lambda/latest/dg/dlq.html)
有关其他服务与加密队列的兼容性的信息，请参阅 [为 AWS 服务配置 KMS 权限](sqs-key-management.md#compatibility-with-aws-services) 和服务文档。

AWS KMS 将安全、高度可用的硬件和软件相结合，提供可扩展到云端的密钥管理系统。当您将 Amazon SQS 与一起使用时 AWS KMS，加密消息[数据的数据密钥](#sqs-sse-key-terms)也会被加密并与它们保护的数据一起存储。

使用 AWS KMS具有以下好处：
+ 您可以自行创建和管理 [AWS KMS keys](#sqs-sse-key-terms)。
+ 您也可以使用适用于 Amazon SQS 的 AWS 托管 KMS 密钥，该密钥对于每个账户和地区都是唯一的。
+  AWS KMS 安全标准可以帮助您满足与加密相关的合规性要求。

有关更多信息，请参阅 *AWS Key Management Service 开发人员指南*中的[什么是 AWS Key Management Service？](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)

## 加密范围
<a name="sqs-encryption-what-does-sse-encrypt"></a>

SSE 将对 Amazon SQS 队列中的消息正文进行加密。

SSE 不对以下各项进行加密：
+ 队列元数据（队列名称和属性）
+ 消息元数据（消息 ID、时间戳和属性）
+ 每队列指标

对消息进行加密将使其内容对未经授权的或匿名的用户不可用。启用 SSE 后，对加密队列的匿名 `SendMessage` 和 `ReceiveMessage` 请求将被拒绝。Amazon SQS 安全最佳实践建议不要使用匿名请求。如果您想向 Amazon SQS 队列发送匿名请求，请确保禁用 SSE。这不会影响 Amazon SQS 的正常功能：
+ 仅在启用队列加密后发送消息时对其进行加密。Amazon SQS 不会加密积压的消息。
+ 任何加密的消息将保持加密状态，即使已禁用其队列的加密。

将消息移至[死信队列](sqs-dead-letter-queues.md)不会影响其加密：
+ 如果 Amazon SQS 将一条消息从加密的源队列移至未加密的死信队列，则该消息将保持加密状态。
+ 如果 Amazon SQS 将一条消息从未加密的源队列移至加密的死信队列，则该消息将保持未加密状态。

## 关键术语
<a name="sqs-sse-key-terms"></a>

以下关键术语有助于您更好地了解 SSE 的功能。有关详细说明，请参阅 *[Amazon Simple Queue Service API 参考](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/)*。

**数据密钥**  
负责加密 Amazon SQS 消息内容的密钥 (DEK)。  
有关更多信息，请参阅《AWS Encryption SDK 开发人员指南》**中《AWS Key Management Service 开发人员指南》**的[数据密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#data-keys)。

**数据密钥重用周期**  
在再次调用之前，Amazon SQS 可以重复使用数据密钥来加密或解密消息的时间长度，以秒为单位。 AWS KMS 一个表示秒数的证书，介于 60 秒（1 分钟）和 86400 秒（24 小时）之间。默认值为 300（5 分钟）。有关更多信息，请参阅 [了解数据密钥重用周期](sqs-key-management.md#sqs-how-does-the-data-key-reuse-period-work)。  
万一出现无法访问的情况 AWS KMS，Amazon SQS 将继续使用缓存的数据密钥，直到重新建立连接。

**KMS 密钥 ID**  
您的账户或其他账户中的 AWS 托管 KMS 密钥或自定义 KMS 密钥的别名、别名 ARN、密钥 ID 或密钥 ARN。虽然 Amazon SQS 的 AWS 托管 KMS 密钥的别名始终是`alias/aws/sqs`，但例如，自定义 KMS 密钥的别名可以是。`alias/MyAlias`您可以利用这些 KMS 密钥保护 Amazon SQS 队列中的消息。  
记住以下内容：  
+ 如果您未指定自定义 KMS 密钥，Amazon SQS 将使用亚马逊 SQS 的 AWS 托管 KMS 密钥。
+ 首次使用为队列指定亚马逊 SQS 的 AWS 托管 KMS 密钥时， AWS KMS 会为亚马逊 SQS 创建 AWS 托管 KMS 密钥。 AWS 管理控制台 
+ 或者，首次对启用了 SSE 的队列使用`SendMessage`或`SendMessageBatch`操作时， AWS KMS 会为 Amazon SQS 创建 AWS 托管 KMS 密钥。
您可以创建 KMS 密钥，定义控制如何使用 KMS 密钥的策略，并使用控制 AWS KMS 台的 “**客户托管密钥**” 部分或`[CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)` AWS KMS 操作来审计 KMS 密钥的使用情况。有关更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的 [KMS 密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)和[创建密钥](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)。有关 KMS 密钥标识符的更多示例，请参阅 *AWS Key Management Service API 参考[KeyId](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html#API_DescribeKey_RequestParameters)*中的。有关查找 KMS 密钥标识符的信息，请参阅《AWS Key Management Service 开发人员指南》**中的[查找密钥 ID 和 ARN](https://docs.aws.amazon.com/kms/latest/developerguide/viewing-keys.html#find-cmk-id-arn)。  
使用需要支付额外费用 AWS KMS。有关更多信息，请参阅 [估算成本 AWS KMS](sqs-key-management.md#sqs-estimate-kms-usage-costs) 和 [AWS Key Management Service 定价](https://aws.amazon.com/kms/pricing)。

**信封加密**  
加密的数据的安全性部分取决于如何保护可解密该数据的数据密钥。Amazon SQS 使用 KMS 密钥对数据密钥进行加密，然后加密的数据密钥与加密的消息一起存储。这种使用 KMS 密钥加密数据密钥的做法称为信封加密。  
有关封装加密的更多信息，请参阅 *AWS Encryption SDK 开发人员指南*的[封装加密](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/how-it-works.html#envelope-encryption)。

# Amazon SQS 密钥管理
<a name="sqs-key-management"></a>

Amazon SQS 与 AWS Key Management Service (KMS) 集成，用于管理服务器端加密 (SSE) 的 [KMS 密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)。有关 SSE 信息和密钥管理定义，请参阅[Amazon SQS 中的静态加密](sqs-server-side-encryption.md)。Amazon SQS 使用 KMS 密钥来验证和保护用于加密和解密消息的数据密钥。以下部分提供有关在 Amazon SQS 服务中使用 KMS 密钥和数据密钥的信息。

## 配置 AWS KMS 权限
<a name="sqs-what-permissions-for-sse"></a>

每个 KMS 密钥都必须有一个密钥政策。请注意，您无法修改 Amazon SQS 的 AWS 托管 KMS 密钥的密钥策略。此 KMS 密钥的政策包括该账户（获授权可使用 Amazon SQS）中所有主体使用加密队列的权限。

 Amazon SQS 根据来电者的 AWS 证书对来电者进行区分，无论他们使用的是不同的 AWS 账户、IAM 用户还是 IAM 角色。此外，具有不同作用策略范围的相同 IAM 角色将被视为不同的请求方。但是，在使用 IAM 角色会话时，仅更改 `RoleSessionName` 而保持相同的 IAM 角色和策略范围不会创建不同的请求方。因此，在指定 AWS KMS 关键策略主体时，请避免仅仅依赖`RoleSessionName`差异，因为这些会话将被视为同一个请求者。

或者，您可以在分配给主体的 IAM 策略中指定所需的权限，而这些主体可以创建和使用加密消息。有关更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的[将 IAM 策略用于 AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies.html)。

**注意**  
虽然您可以配置全局权限以向 Amazon SQS 发送和接收，但 AWS KMS 需要在 IAM 策略`Resource`部分中明确命名特定区域的 KMS 密钥的完整 ARN。

### 为 AWS 服务配置 KMS 权限
<a name="compatibility-with-aws-services"></a>

有几项 AWS 服务充当事件源，可以向 Amazon SQS 队列发送事件。要允许这些事件源使用加密队列，您必须创建客户托管的 KMS 密钥，并在密钥策略中添加权限以使用所需 AWS KMS 的 API 方法。执行以下步骤来配置权限。

**警告**  
请注意，更改用于加密 Amazon SQS 消息的 KMS 密钥时，使用旧 KMS 密钥加密的现有消息仍将使用该密钥进行加密。要解密这些消息，您必须保留旧的 KMS 密钥，并确保其密钥政策授予 Amazon SQS 执行 `kms:Decrypt` 和 `kms:GenerateDataKey` 的权限。在将加密新消息的密钥更新为新的 KMS 密钥后，请确保处理所有使用旧的 KMS 密钥加密的现有消息并将其从队列中删除，然后再删除或禁用旧的 KMS 密钥。

1. 创建客户托管的 KMS 密钥。有关更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的[创建密钥](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)。

1. 要允许 AWS 服务事件源使用`kms:Decrypt`和 `kms:GenerateDataKey` API 方法，请在 KMS 密钥策略中添加以下语句。

------
#### [ JSON ]

****  

   ```
   {
      "Version":"2012-10-17",		 	 	 
         "Statement": [{
            "Effect": "Allow",
            "Principal": {
               "Service": "service.amazonaws.com"
            },
            "Action": [
               "kms:Decrypt",
               "kms:GenerateDataKey"
            ],
            "Resource": "*"
          }]
   }
   ```

------

   将上述示例中的“服务”替换为事件源的*服务名称*。事件源包括以下服务。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-key-management.html)

1.  使用 KMS 密钥的 ARN [配置现有 SSE 队列](sqs-configure-sse-existing-queue.md)。

1. 向事件源提供加密队列的 ARN。

### 为制作者配置 AWS KMS 权限
<a name="send-to-encrypted-queue"></a>

当[数据密钥重用周期](#sqs-how-does-the-data-key-reuse-period-work)过期时，创建者下次调用 `SendMessage` 或 `SendMessageBatch` 时也会触发对 `kms:Decrypt` 和 `kms:GenerateDataKey` 的调用。对 `kms:Decrypt` 的调用是在使用新数据密钥之前验证它的完整性。因此，创建者必须具有 KMS 密钥的 `kms:Decrypt` 和 `kms:GenerateDataKey` 权限。

将以下语句添加到创建者的 IAM 策略中。请记住，为密钥资源和队列资源使用正确的 ARN 值。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:GenerateDataKey"
            ],
            "Resource": "arn:aws:kms:us-east-2:123456789012:key/111112222233333"
        },
        {
            "Effect": "Allow",
            "Action": [
                "sqs:SendMessage"
            ],
            "Resource": "arn:aws:sqs:*:123456789012:MyQueue"
        }
    ]
}
```

------

### 为消费者配置 AWS KMS 权限
<a name="receive-from-encrypted-queue"></a>

当数据密钥重用周期过期时，使用者下一次调用 `ReceiveMessage` 时也会触发对 `kms:Decrypt` 的调用，以便在使用新数据密钥之前验证它的完整性。因此，使用者必须对用于加密指定队列中消息的任何 KMS 密钥拥有 `kms:Decrypt` 权限。如果队列充当[死信队列](sqs-dead-letter-queues.md)，则使用者还必须具有用于加密源队列中消息的任何 KMS 密钥的 `kms:Decrypt` 权限。将以下语句添加到使用者的 IAM 策略中。请记住，为密钥资源和队列资源使用正确的 ARN 值。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": "arn:aws:kms:us-east-2:123456789012:key/111112222233333"
        },
        {
            "Effect": "Allow",
            "Action": [
                "sqs:ReceiveMessage"
            ],
            "Resource": "arn:aws:sqs:*:123456789012:MyQueue"
        }
    ]
}
```

------

### 在混淆副手保护的情况下配置 AWS KMS 权限
<a name="sqs-adding-confused-deputy-protection"></a>

当密钥政策语句中的主体为[AWS 服务主体](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-services)时，您可以使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 或 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 全局条件键以防止出现[混淆代理问题](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)。要使用这些条件键，请将值设置为要加密的资源的 Amazon 资源名称 (ARN)。如果您不知道资源的 ARN，请改用 `aws:SourceAccount`。

在此 KMS 密钥政策中，允许账户 `111122223333` 拥有的*服务*中的特定资源调用 KMS 进行 `Decrypt` 和 `GenerateDataKey` 操作，这些操作在 Amazon SQS 使用 SSE 期间发生。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "sqs.amazonaws.com"
            },
            "Action": [
                "kms:GenerateDataKey",
                "kms:Decrypt"
            ],
            "Resource": "*",
            "Condition": {
                "ArnEquals": {
                    "aws:SourceArn": [
                        "arn:aws:sqs:us-west-1:111122223333:resource"
                    ]
                }
            }
        }
    ]
}
```

------

使用启用 SSE 的 Amazon SQS 队列时，以下服务支持 `aws:SourceArn`：
+ Amazon SNS
+ Amazon S3
+ CloudWatch 活动
+ AWS Lambda
+ CodeBuild
+ Amazon Connect Customer Profiles
+ AWS Auto Scaling
+ Amazon Chime

## 了解数据密钥重用周期
<a name="sqs-how-does-the-data-key-reuse-period-work"></a>

[数据密钥重用周期](sqs-server-side-encryption.md#sqs-sse-key-terms)定义 Amazon SQS 重用相同数据密钥的最长持续时间。当数据密钥重用周期结束时，Amazon SQS 会生成一个新的数据密钥。请注意以下有关此重用周期的准则。
+ 较短的重复使用期可以提高安全性，但会导致更多的拨打电话 AWS KMS，这可能会产生超出免费套餐的费用。
+ 尽管用于加密和解密的数据密钥是单独缓存的，重用周期仍将应用于数据密钥的两个副本。
+ 当数据密钥重用期结束时，下一次调用`SendMessage`或`SendMessageBatch`通常会触发对 AWS KMS `GenerateDataKey`方法的调用以获取新的数据密钥。此外，接下来对`SendMessage`和的调用都`ReceiveMessage`将触发对的调用 AWS KMS `Decrypt`，以验证数据密钥的完整性，然后再使用它。
+ [委托人](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#Principal)（AWS 账户 或用户）不共享数据密钥（由唯一委托人发送的消息始终会获得唯一的数据密钥）。因此，对的调用量 AWS KMS 是数据密钥重复使用期间使用的唯一主体数量的倍数。

## 估算成本 AWS KMS
<a name="sqs-estimate-kms-usage-costs"></a>

为了预测成本并更好地了解您的 AWS 账单，您可能需要了解 Amazon SQS 使用您的 KMS 密钥的频率。

**注意**  
尽管以下公式可让您很好地了解预计成本，但由于 Amazon SQS 的分布式特性，实际成本可能更高。

要计算*每个队列*的 API 请求数 (`R`)，请使用以下公式：

```
R = (B / D) * (2 * P + C)
```

`B` 是账单周期（以秒为单位）。

`D` 是[数据密钥重用周期](sqs-server-side-encryption.md#sqs-sse-key-terms)（以秒为单位）。

`P` 是发送到 Amazon SQS 队列的生成[主体](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#Principal)的数量。

`C` 是从 Amazon SQS 队列接收的使用主体数量。

**重要**  
通常，创建主体产生的费用是使用主体的两倍。有关更多信息，请参阅 [了解数据密钥重用周期](#sqs-how-does-the-data-key-reuse-period-work)。  
如果创建者和使用者具有不同的用户，则费用会增加。

以下是一些示例计算。有关准确的定价信息，请参阅 [AWS Key Management Service 定价](https://aws.amazon.com/kms/pricing/)。

### 示例 1：计算 2 个委托人和 1 个队列的 AWS KMS API 调用次数
<a name="example-1-queue-2-principals"></a>

此示例假定：
+ 账单周期为 1 月 1 日 - 31 日（2678400 秒）。
+ 数据密钥重用周期设置为 5 分钟（300 秒）。
+ 有 1 个队列。
+ 有 1 个创建主体和 1 个使用主体。

```
(2,678,400 / 300) * (2 * 1 + 1) = 26,784
```

### 示例 2：计算多个生产者和使用者以及 2 个队列的 AWS KMS API 调用次数
<a name="example-2-queues-multiple-principals"></a>

此示例假定：
+ 账单周期为 2 月 1 日 - 28 日（2419200 秒）。
+ 数据密钥重用周期设置为 24 小时（86400 秒）。
+ 有 2 个队列。
+ 第一个队列有 3 个创建主体和 1 个使用主体。
+ 第二个队列有 5 个创建主体和 2 个使用主体。

```
(2,419,200 / 86,400 * (2 * 3 + 1)) + (2,419,200 / 86,400 * (2 * 5 + 2)) = 532
```

## AWS KMS 错误
<a name="sqs-sse-troubleshooting-errors"></a>

当您使用 Amazon SQS 和时 AWS KMS，可能会遇到错误。以下参考描述错误和可能的故障排除解决方案。
+ [常见 AWS KMS 错误](https://docs.aws.amazon.com/kms/latest/APIReference/CommonErrors.html)
+ [AWS KMS Decrypt 错误](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html#API_Decrypt_Errors)
+ [AWS KMS GenerateDataKey 错误](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html#API_GenerateDataKey_Errors)

# Amazon SQS 中的互联网络流量隐私保护
<a name="sqs-internetwork-traffic-privacy"></a>

Amazon SQS 的 Amazon Virtual Private Cloud (Amazon VPC) 端点是 VPC 内的逻辑实体，仅允许连接到 Amazon SQS。VPC 将请求路由到 Amazon SQS 并将响应路由回 VPC。以下部分提供有关使用 VPC 端点和创建 VPC 端点策略的信息。

## Amazon SQS 的 Amazon Virtual Private Cloud 端点
<a name="sqs-vpc-endpoints"></a>

如果您使用 Amazon VPC 来托管您的 AWS 资源，则可以在您的 VPC 和亚马逊 SQS 之间建立连接。您可以使用此连接将消息发送到 Amazon SQS 队列，而无需跨公共 Internet。

Amazon VPC 允许您在自定义虚拟网络中启动 AWS 资源。可以使用 VPC 控制您的网络设置，例如 IP 地址范围、子网、路由表和网络网关。有关更多信息 VPCs，请参阅 *[Amazon VPC 用户指南](https://docs.aws.amazon.com/vpc/latest/userguide/)*。

要将 VPC 连接到 Amazon SQS，您必须先定义一个*接口 VPC 端点*，该端点可让您将 VPC 连接到其他 AWS 服务。该端点提供了到 Amazon SQS 的可靠、可扩展的连接，无需互联网网关、网络地址转换 (NAT) 实例或 VPN 连接。有关更多信息，请参阅本指南中的[教程：从 Amazon Virtual Private Cloud 将消息发送到 Amazon SQS 队列](sqs-sending-messages-from-vpc.md)和[示例 5：如果不是来自 VPC 端点，则拒绝访问](sqs-creating-custom-policies-access-policy-examples.md#deny-not-from-vpc)，以及《Amazon VPC 用户指南》**中的[接口 VPC 端点 (AWS PrivateLink)](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html)。

**重要**  
您只能将 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`。

## 为 Amazon SQS 创建 Amazon VPC 端点策略
<a name="sqs-vpc-endpoint-policy"></a>

您可以为 Amazon SQS 创建 Amazon VPC 端点策略，在该策略中指定以下内容：
+ 可执行操作的主体。
+ 可执行的操作。
+ 可对其执行操作的资源。

有关更多信息，请参阅《Amazon VPC 用户指南》**中的[使用 VPC 端点控制对服务的访问](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-access.html)

以下 VPC 端点策略示例指定允许用户 `MyUser` 将消息发送到 Amazon SQS 队列 `MyQueue`。

```
{
   "Statement": [{
      "Action": ["sqs:SendMessage"],
      "Effect": "Allow",
      "Resource": "arn:aws:sqs:us-east-2:123456789012:MyQueue",
      "Principal": {
        "AWS": "arn:aws:iam:123456789012:user/MyUser"
      }
   }]
}
```

以下各项将被拒绝：
+ 其他 Amazon SQS API 操作，例如 `sqs:CreateQueue` 和 `sqs:DeleteQueue`。
+ 其他尝试使用该 VPC 端点的用户和规则。
+ `MyUser` 将消息发送至不同的 Amazon SQS 队列。

**注意**  
该用户仍然可以从 VPC *外部*使用其他 Amazon SQS API 操作。有关更多信息，请参阅 [示例 5：如果不是来自 VPC 端点，则拒绝访问](sqs-creating-custom-policies-access-policy-examples.md#deny-not-from-vpc)。

# 使用双栈（IPv4 和）终端节点连接到 Amazon SQS IPv6
<a name="sqs-dual-stack"></a>

 双栈端点同时支持 IPv4 和 IPv6 流量。当您向双栈终端节点发出请求时，终端节点 URL 会解析为 IPv4 IPv6 或地址。有关双栈和 FIPS 端点的更多信息，请参阅[《SDK 参考指南》](https://docs.aws.amazon.com/sdkref/latest/guide/feature-endpoints.html)。

 Amazon SQS 支持区域双栈终端节点，这意味着您必须在终端节点名称中指定 AWS 区域。双栈端点名称使用以下命名约定：`sqs.Region.amazonaws.com`。例如，`eu-west-1` 区域的双堆栈端点名称是 `sqs.eu-west-1.amazonaws.com`。

有关 Amazon SQS 端点的完整列表，请参阅 [AWS General Reference](https://docs.aws.amazon.com/general/latest/gr/sqs-service.html)。