通过 CLI 或 API 访问亚马逊 AWS SQS 被拒绝

Access Denied to amazon AWS SQS through CLI or API

当我尝试通过 CLI 或 API 访问 Amazon SQS 时,访问被拒绝。这是 node.js 代码:

// Load the AWS SDK for Node.js
var AWS = require('aws-sdk');
// Set the region 
AWS.config.update({region: 'eu-west-1'});

var credentials = new AWS.SharedIniFileCredentials({profile: 'default'});
AWS.config.credentials = credentials;

// Create the SQS service object
var sqs = new AWS.SQS({apiVersion: 'latest'});

var params = {
  MaxResults: 10
};

sqs.listQueues(params, function(err, data) {
  if (err) {
    console.log("Error", err);
  } else {
    console.log("Success", data);
  }
});

sqs 政策如下:

{
  "Version": "2012-10-17",
  "Id": "__default_policy_ID",
  "Statement": [
    {
      "Sid": "__owner_statement",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::437568002678:root",
          "arn:aws:iam::ACCOUNTID:role/MyRole",
          "arn:aws:iam::ACCOUNTID:user/username"
        ]
      },
      "Action": [
        "sqs:GetQueueAttributes",
        "sqs:SendMessage",
        "sqs:ListQueues"
      ],
      "Resource": "arn:aws:sqs:eu-west-1:ACCOUNTID:NAME"
    }
  ]
}

完整的错误是:

Error AccessDenied: Access to the resource https://sqs.eu-west-1.amazonaws.com/ is denied.

凭据文件设置在 /home/user/.aws/credentials

我正在为 AWS 服务使用一个账户。

为了重现您的情况,我执行了以下操作:

  • 创建了一个没有权限的 IAM 用户
  • 配置 AWS CLI 以使用与新 IAM 用户关联的凭证
  • 创建了标准 (non-FIFO) Amazon SQS 队列
  • 已将您的保单附加到队列,但更新了ResourcePrincipal
  • 使用 AWS CLI 发送消息 到 SQS 队列:
aws sqs send-message --queue-url https://sqs.ap-southeast-2.amazonaws.com/123456789012/queuename --message-body foo

消息已成功发送到队列。这意味着 SQS 队列上的访问策略足以授予发送消息的权限,而无需 IAM 用户的任何额外权限。

因此,要么您的 AWS CLI 使用您的访问策略中引用的 IAM 用户,要么 IAM 用户或账户 SCP 上有一些权限明确拒绝了该能力使用 SendMessage().