针对 Amazon SQS 中的访问被拒绝错误进行问题排查 - Amazon Simple Queue Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

针对 Amazon SQS 中的访问被拒绝错误进行问题排查

以下主题涵盖了 Amazon SQS API 调用中出现 AccessDeniedAccessDeniedException 错误的最常见原因。有关如何针对这些错误进行问题排查的更多信息,请参阅《Amazon Knowledge Center 指南》中的“如何解决 Amazon SQS API 调用的 AccessDenied 或 AccessDeniedException 错误?”

错误消息示例:

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 策略

要验证请求者是否拥有执行 Amazon SQS 操作的适当权限,请执行以下操作:

  • 确定正在发起 Amazon SQS API 调用的 IAM 主体。如果 IAM 主体属于同一个账户,那么 Amazon SQS 队列策略或 Amazon Identity and Access Management(IAM)策略中必须包含明确允许访问该操作的权限。

  • 如果主体是 IAM 实体:

    • 您可以通过检查 Amazon Web Services Management Console的右上角或使用 aws sts get-caller-identity 命令来识别您的 IAM 用户或角色。

  • 如果主体是一项 Amazon 服务,那么 Amazon SQS 队列策略必须明确允许访问。

  • 如果主体是跨账户主体,那么 Amazon SQS 队列策略和 IAM 策略都必须明确允许访问。

  • 如果策略使用了条件元素,请检查该条件是否限制了访问。

重要

任何策略中的显式拒绝都会覆盖显式允许。以下是 Amazon SQS 策略的一些基本示例。

Amazon Key Management Service 权限

如果您的 Amazon SQS 队列已启用服务器端加密(SSE)并采用客户自主管理型 Amazon KMS key,则必须向创建者和使用者授予权限。要确认队列是否已加密,可以使用 GetQueueAttributes API 的 KmsMasterKeyId 属性,或者在队列控制台的加密下查看相关信息。

  • 创作者所需的权限

    { "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "<Key ARN>" }
  • 使用者所需的权限

    { "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": "<Key ARN>" }
  • 用于跨账户访问的权限:

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

您可以使用以下任一方法为 Amazon SQS 队列启用加密:

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

VPC 端点策略

如果您通过 Amazon Virtual Private Cloud(Amazon VPC)端点访问 Amazon SQS,则 Amazon SQS VPC 端点策略必须允许访问。您可以为 Amazon SQS 创建 Amazon VPC 端点策略,并在该策略中指定以下内容:

  1. 可执行操作的主体。

  2. 可执行的操作。

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

在以下示例中,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" } }] }

组织服务控制策略

如果您的 Amazon Web Services 账户属于某个组织,则 Amazon Organizations 策略会阻止您访问您的 Amazon SQS 资源。默认情况下,Amazon Organizations 策略不会阻止向 Amazon SQS 发出的任何请求。但是,请确保您未将 Amazon Organizations 策略配置为阻止对 Amazon SQS 队列进行访问。有关如何检查 Amazon Organizations 策略的说明,请参阅《Amazon Organizations 用户指南》中的列出所有策略