

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

# 针对 Amazon SQS 中的访问被拒绝错误进行问题排查
<a name="troubleshooting-access-denied"></a>

以下主题涵盖了 Amazon SQS API 调用中出现 `AccessDenied` 或 `AccessDeniedException` 错误的最常见原因。有关如何解决这些错误的更多信息，请参阅[如何解决 Amazon SQS API 调用中的 AccessDeniedException “AccessDenied” 或 “” 错误](https://repost.aws/knowledge-center/sqs-accessdenied-errors)？ 在*Amazon 知识中心指南*中。

**错误消息示例：**

```
An error occurred (AccessDenied) when calling the SendMessage operation: Access to
        the resource https://sqs.us-east-1.amazonaws.com/ is denied.
```

**–或者–**

```
An error occurred (KMS.AccessDeniedException) when calling the SendMessage
        operation: User: arn:aws:iam::xxxxx:user/xxxx is not authorized to perform:
        kms:GenerateDataKey on resource: arn:aws:kms:us-east-1:xxxx:key/xxxx with an explicit
        deny.
```

## Amazon SQS 队列策略和 IAM 策略
<a name="sqs-queue-policy-iam-policy"></a>

要验证请求者是否拥有执行 Amazon SQS 操作的适当权限，请执行以下操作：
+ 确定正在发起 Amazon SQS API 调用的 IAM 主体。如果 IAM 主体属于同一个账户，那么 Amazon SQS 队列策略或 Amazon Identity and Access Management（IAM）策略中必须包含明确允许访问该操作的权限。
+ 如果主体是 IAM 实体：
  + 您可以通过检查 Amazon Web Services 管理控制台的右上角或使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sts/get-caller-identity.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sts/get-caller-identity.html) 命令来识别您的 IAM 用户或角色。
  + 检查与 IAM 用户或角色相关的 IAM policy。您可以使用以下方法之一：
    + 使用 [IAM policy simulator](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_testing-policies.html) 测试 IAM 策略。
    + 查看不同的 [IAM policy 类型](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies.html#access_policy-types)。
  + 如果需要，[编辑您的 IAM 用户策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_manage-edit.html)。
  + 检查队列策略并根据需要进行[编辑](sqs-configure-add-permissions.md)。
+ 如果委托人是一项 Amazon 服务，那么 Amazon SQS 队列策略必须明确允许访问。
+ 如果主体是跨账户主体，那么 Amazon SQS 队列策略和 IAM 策略都必须明确允许访问。
+ 如果策略使用了条件元素，请检查该条件是否限制了访问。

**重要**  
任何策略中的显式拒绝都会覆盖显式允许。以下是 [Amazon SQS 策略](sqs-basic-examples-of-sqs-policies.md)的一些基本示例。

## Amazon Key Management Service 权限
<a name="kms-permissions"></a>

如果您的 Amazon SQS 队列开启了[服务器端加密 (SSE)](sqs-server-side-encryption.md) 并由客户管理 Amazon KMS key，则必须向生产者和使用者授予权限。要确认队列是否已加密，可以使用 [https://docs.amazonaws.cn/AWSSimpleQueueService/latest/APIReference/API_GetQueueAttributes.html](https://docs.amazonaws.cn/AWSSimpleQueueService/latest/APIReference/API_GetQueueAttributes.html) API 的 `KmsMasterKeyId` 属性，或者在队列控制台的**加密**下查看相关信息。
+ [创作者所需的权限](sqs-key-management.md#send-to-encrypted-queue)：

  ```
  {
  "Effect": "Allow",
  "Action": [
      "kms:Decrypt",
      "kms:GenerateDataKey"
  ],
  "Resource": "<Key ARN>"
  }
  ```
+ [使用者所需的权限](sqs-key-management.md#receive-from-encrypted-queue)：

  ```
  {
  "Effect": "Allow",
  "Action": [
      "kms:Decrypt"
  ],
  "Resource": "<Key ARN>"
  }
  ```
+ 用于[跨账户访问](sqs-key-management.md)的权限：

  ```
  {
  "Effect": "Allow",
  "Action": [         
      "kms:DescribeKey",
      "kms:Decrypt",
      "kms:ReEncrypt",
      "kms:GenerateDataKey"
  ],
  "Resource": "<Key ARN>"
  }
  ```

请选择以下选项之一，为 Amazon SQS 队列启用加密：
+ [SSE-Amazon SQS](sqs-server-side-encryption.md)（由 Amazon SQS 服务创建和管理的加密密钥。）
+ [Amazon 托管默认密钥](https://docs.amazonaws.cn/kms/latest/developerguide/concepts.html#aws-managed-cmk) (alias/aws/sqs)
+ [客户托管密钥](https://docs.amazonaws.cn/kms/latest/developerguide/concepts.html#customer-cmk)

但是，如果您使用的是 Amazon托管的 [KMS 密钥](sqs-key-management.md)，则无法修改默认密钥策略。因此，要提供对其他服务和跨账户的访问权限，请使用客户自主管理型密钥。这样一来，您就可以编辑密钥政策。

## VPC 端点策略
<a name="vpc-endpoint-policy"></a>

如果您[通过 Amazon Virtual Private Cloud（Amazon VPC）端点访问 Amazon SQS](sqs-internetwork-traffic-privacy.md#sqs-vpc-endpoints)，则 Amazon SQS VPC 端点策略必须允许访问。您可以为 Amazon SQS 创建 Amazon VPC 端点策略，并在该策略中指定以下内容：

1. 可执行操作的主体。

1. 可执行的操作。

1. 可对其执行操作的资源。

在以下示例中，VPC 终端节点策略指定允许 IAM 用户{{MyUser}}向 Amazon SQS 队列发送消息。{{MyQueue}}通过该 VPC 端点的其他操作、IAM 用户和 Amazon SQS 资源的访问请求都会被拒绝。

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

## 组织服务控制策略
<a name="organization-control-policy"></a>

如果您 Amazon Web Services 账户 属于某个组织，则 Amazon Organizations 策略可能会阻止您访问您的 Amazon SQS 队列。默认情况下， Amazon Organizations 策略不会阻止任何向 Amazon SQS 发出的请求。但是，请确保您的 Amazon Organizations 策略尚未配置为阻止访问 Amazon SQS 队列。有关如何查看您的 Amazon Organizations 政策的说明，请参阅《*Amazon Organizations 用户指南》*中的[列出所有政策](https://docs.amazonaws.cn/organizations/latest/userguide/orgs_manage_policies_info-operations.html#list-all-pols-in-org)。