本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
对 Amazon SQS 中的拒绝访问错误进行故障排除
以下主题涵盖了 Amazon SQS API 调用的最常见原因AccessDenied
或AccessDeniedException
错误。有关如何解决这些错误的更多信息,请参阅如何解决 Amazon SQS API 调用中的 “AccessDenied” 或 “AccessDenied异常” 错误
错误消息示例:
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.
亚马逊 SQS 队列策略和 IAM 政策
要验证请求者是否具有执行 Amazon SQS 操作的适当权限,请执行以下操作:
-
确定正在调用 Amazon SQS API 的 IAM 委托人。如果 IAM 委托人来自同一个账户,那么 Amazon SQS 队列策略或 AWS 身份和访问管理 (IAM) 策略都必须包含明确允许访问该操作的权限。
-
如果委托人是 IAM 实体:
-
您可以通过检查的右上角或使用命令来识别您的 IAM 用户或角色。 AWS Management Console
aws sts get-caller-identity
-
检查与 IAM 用户或角色相关的 IAM policy。您可以使用以下方法之一:
-
使用 IAM 策略模拟器测试 IAM 策略。
-
查看不同的 IAM policy 类型。
-
-
如果需要,编辑您的 IAM 用户策略。
-
检查队列策略并根据需要进行编辑。
-
-
如果委托人是一项 AWS 服务,那么 Amazon SQS 队列策略必须明确允许访问。
-
如果委托人是跨账户委托人,那么 Amazon SQS 队列策略和 IAM 策略都必须明确允许访问。
-
如果策略使用条件元素,请检查该条件是否限制了访问权限。
重要
任一策略中的明确拒绝都会优先于明确的允许。以下是 Amazon SQS 政策的一些基本示例。
AWS Key Management Service 权限
如果您的 Amazon SQS 队列开启了服务器端加密 (SSE) 并由客户管理 AWS KMS key,则必须向生产者和使用者授予权限。要确认队列是否已加密,可以使用 GetQueueAttributes
API KmsMasterKeyId
属性,也可以从队列控制台的 “加密” 下使用。
-
{ "Effect": "Allow", "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "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(由亚马逊 SQS 服务创建和管理的加密密钥。)
-
AWS 托管默认密钥 (alias/aws/sqs)
但是,如果您使用的是 AWS托管的 KMS 密钥,则无法修改默认密钥策略。因此,要提供对其他服务和跨账户的访问权限,请使用客户托管密钥。这样做可以让你编辑密钥策略。
VPC 端点策略
如果您通过亚马逊虚拟私有云(亚马逊 VPC)终端节点访问亚马逊 SQS,则亚马逊 SQS VPC 终端节点策略必须允许访问。您可以为亚马逊 SQS 的 Amazon VPC 终端节点创建策略,您可以在其中指定以下内容:
-
可执行操作的主体。
-
可执行的操作。
-
可对其执行操作的资源。
在以下示例中,VPC 终端节点策略指定允许 IAM 用户MyUser
向 Amazon SQS 队列发送消息。MyQueue
其他操作、IAM 用户和 Amazon SQS 资源被拒绝通过 VPC 终端节点进行访问。
{ "Statement": [{ "Action": ["sqs:SendMessage"], "Effect": "Allow", "Resource": "arn:aws:sqs:us-east-2:123456789012:
MyQueue
", "Principal": { "AWS": "arn:aws:iam:123456789012:user/MyUser
" } }] }
组织服务控制政策
如果您 AWS 账户 属于某个组织,则 AWS Organizations 策略可能会阻止您访问您的 Amazon SQS 队列。默认情况下, AWS Organizations 策略不会阻止任何向 Amazon SQS 发出的请求。但是,请确保您的 AWS Organizations 策略尚未配置为阻止访问 Amazon SQS 队列。有关如何查看您的 AWS Organizations 政策的说明,请参阅《AWS Organizations 用户指南》中的列出所有政策。