运行 Amazon Simple Queue Service (Amazon SQS) API 调用时,收到类似于以下内容的 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”
该如何解决此问题?
解决方法
Amazon SQS 访问策略和 IAM 策略
注意:如果您在运行 AWS Command Line Interface (AWS CLI) 命令时收到错误,请确保您运行的是最新版本的 AWS CLI。
- SQS 访问策略或 AWS Identity and Access Management (IAM) 策略必须包含明确允许访问操作的权限。
- 如果 SQS 队列位于其他账户中,则 SQS 访问策略和 IAM 策略都必须明确允许访问。 重要提示:两项策略中的显式拒绝会覆盖显式允许。
- 如果策略使用条件元素,请验证条件是否限制访问。
- 如果用户或角色位于使用服务控制策略 (SCP) 的 AWS Organizations 组织内,请确认 SCP 没有阻止该用户或角色。
要确认用于进行 API 调用的 IAM 身份,请运行以下 get-caller-identity AWS CLI 命令:
aws sts get-caller-identity
有关 Amazon SQS 访问权限的更多信息,请参阅访问 Amazon SQS 队列需要什么权限?
KMS 权限
如果 Amazon SQS 队列启用了服务器端加密 (SSE),则必须向生产者和使用者授予权限。所需的权限可以由 AWS 托管的 AWS KMS 密钥或客户托管的密钥提供。客户托管的密钥策略必须包括每个队列生产者和使用者的访问权限。或者,您也可以更新 IAM 策略,使其包含 KMS 密钥所需的 KMS 权限。
- 所需的生产者权限:kms:GenerateDataKey 和 kms:Decrypt
- 所需的使用者权限:kms:Decrypt
要从其他账户访问 SSE Amazon SQS 队列,该队列必须使用客户托管的密钥。您无法使用 AWS 托管的密钥,因为只能对客户托管的密钥策略进行修改。KMS 密钥策略必须允许跨账户访问 KMS 密钥,IAM 策略必须包含访问 KMS 密钥的权限。
有关详细信息,请参阅密钥管理。
VPC 终端节点策略
如果您通过 Amazon Virtual Private Cloud (Amazon VPC) 终端节点访问 SQS,则 SQS VPC 终端节点策略必须允许访问。
以下示例 VPC 终端节点策略指定:允许 IAM 用户 myUser 向 SQS 队列 MyQueue 发送消息。而通过 VPC 终端节点访问其他操作、IAM 用户和 SQS 资源则会被拒绝。
{
"Statement": [{
"Action": ["sqs:SendMessage"],
"Effect": "Allow",
"Resource": "arn:aws:sqs:us-east-2:123456789012:MyQueue",
"Principal": {
"AWS": "arn:aws:iam:123456789012:user/MyUser"
}
}]
}