通过 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 队列
- 已将您的保单附加到队列,但更新了
Resource
和Principal
- 使用 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()
.
当我尝试通过 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 队列
- 已将您的保单附加到队列,但更新了
Resource
和Principal
- 使用 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()
.