我有一个网站,可以将消息从客户端写入Amazon SQS队列。允许每个人写入队列。我们有一个服务器端进程,它读取队列消息并处理它们。
Queue配置了对每个人的写访问权限,这是它的策略:
{
"Version": "2012-10-17",
"Id": "arn:aws:sqs:.../SQSDefaultPolicy",
"Statement": [{
"Sid": "Sid1537097246229",
"Effect": "Allow",
"Principal": "*",
"Action": "SQS:SendMessage",
"Resource": "arn:aws:sqs:..."
}]
}
但是,如果没有访问密钥和密钥,我们似乎无法写入队列。 AWS开发工具包返回错误,指出尚未提供凭据。我们正在使用AWS SQS documentation中描述的代码。
我不建议允许对SQS队列进行未经身份验证的访问,但如果必须这样做,那么您应该能够通过JavaScript SDK进行未经身份验证的请求,如下所示:
const AWS = require('aws-sdk');
AWS.config.update({ region: 'us-east-1' });
const sqs = new AWS.SQS({ apiVersion: '2012-11-05' });
const params = {
DelaySeconds: 10,
MessageAttributes: {
Title: {
DataType: 'String',
StringValue: 'The Whistler',
},
Author: {
DataType: 'String',
StringValue: 'John Grisham',
},
},
MessageBody: 'NY Times fiction bestseller 12/11/2016.',
QueueUrl: 'QUEUE_URL_HERE',
};
sqs.makeUnauthenticatedRequest('sendMessage', params, (err, data) => {
if (err) {
console.log('Error', err);
} else {
console.log('Success', data.MessageId);
}
});
您使用"Principal": "*"
的默认策略仍然要求发件人提供一些AWS主体。如您提供的文件的先决条件中所述:
使用您的用户凭据创建共享配置文件。有关提供共享凭据文件的详细信息,请参阅从共享凭据文件中加载Node.js中的凭据。
您是否考虑过使用API网关作为SQS队列的代理?这样做的一个例子在https://dzone.com/articles/creating-aws-service-proxy-for-amazon-sqs中定义。我建议设置SQS的代理并具有POST端点,例如
POST::/myQueueName/messages
这将改变用户与队列交互的方式,但它允许您将队列锁定为仅用于读取和写入的服务用户,这遵循最小权限策略。然后,您的API网关端点可以使用API密钥进行保护,对互联网保持开放状态,甚至可以根据您的偏好保护IAM角色。