本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
针对 Amazon SQS 中的访问被拒绝错误进行问题排查
以下主题涵盖了 Amazon SQS API 调用中出现 AccessDenied
或 AccessDeniedException
错误的最常见原因。有关如何针对这些错误进行问题排查的更多信息,请参阅《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 用户或角色。
-
检查与 IAM 用户或角色相关的 IAM policy。您可以使用以下方法之一:
-
使用 IAM policy simulator 测试 IAM 策略。
-
查看不同的 IAM policy 类型。
-
-
如果需要,编辑您的 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 队列启用加密:
-
SSE-Amazon SQS(由 Amazon SQS 服务创建和管理的加密密钥。)
-
Amazon 托管式默认密钥(alias/aws/sqs)
但是,如果您使用的是 Amazon 托管式 KMS 密钥,则无法修改默认密钥策略。因此,要提供对其他服务和跨账户的访问权限,请使用客户自主管理型密钥。这样一来,您就可以编辑密钥政策。
VPC 端点策略
如果您通过 Amazon Virtual Private Cloud(Amazon VPC)端点访问 Amazon SQS,则 Amazon SQS VPC 端点策略必须允许访问。您可以为 Amazon SQS 创建 Amazon VPC 端点策略,并在该策略中指定以下内容:
-
可执行操作的主体。
-
可执行的操作。
-
可对其执行操作的资源。
在以下示例中,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 用户指南》中的列出所有策略。