如何在没有访问密钥和秘密密钥的情况下写入只写SQS队列

时间:2018-09-16 12:26:48

标签: javascript amazon-web-services amazon-sqs

我有一个网站,该网站将客户端的消息写到Amazon SQS队列。每个人都可以写到队列中。我们有一个服务器端进程,该进程读取队列消息并对其进行处理。

对队列配置了对所有人的写访问权限,这是其策略:

{
  "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中所述的代码。

2 个答案:

答案 0 :(得分:4)

我不建议允许对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);
  }
});

答案 1 :(得分:3)

您的"Principal": "*"默认策略仍然要求发送者提供一些AWS委托人。如您提供的文档的前提条件所述:

  

使用您的用户凭据创建共享配置文件。有关提供共享凭据文件的详细信息,请参阅从共享凭据文件在Node.js中加载凭据。

您是否考虑过将API Gateway用作SQS队列的代理? https://dzone.com/articles/creating-aws-service-proxy-for-amazon-sqs定义了一个这样做的例子。我建议设置一个SQS代理,并设置一个POST端点,例如

POST::/myQueueName/messages

这将改变用户与队列的交互方式,但是它允许您将队列锁定到仅服务用户以进行读写,这遵循最小特权策略。然后,您可以根据自己的喜好,使用API​​密钥来保护您的API网关端点,可以向Internet敞开大门,甚至可以使用IAM角色来保护您的API网关。

相关问题