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

Javascript 如何在没有访问密钥和密钥的情况下写入仅写SQS队列,javascript,amazon-web-services,amazon-sqs,Javascript,Amazon Web Services,Amazon Sqs,我有一个网站,可以将来自客户端的消息写入AmazonSQS队列。每个人都可以写入队列。我们有一个服务器端进程,它读取队列消息并对其进行处理 队列配置了对所有人的写访问权限,其策略如下: { "Version": "2012-10-17", "Id": "arn:aws:sqs:.../SQSDefaultPolicy", "Statement": [{ "Sid": "Sid1537097246229", "Effect": "Allow", "P

我有一个网站,可以将来自客户端的消息写入AmazonSQS队列。每个人都可以写入队列。我们有一个服务器端进程,它读取队列消息并对其进行处理

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

{
  "Version": "2012-10-17",
  "Id": "arn:aws:sqs:.../SQSDefaultPolicy",
  "Statement": [{
      "Sid": "Sid1537097246229",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "SQS:SendMessage",
      "Resource": "arn:aws:sqs:..."
  }]
}

但是,如果没有访问密钥和密钥,我们似乎无法写入队列。AWS SDK返回一个错误,表示未提供凭据。我们使用的代码如中所述。

您的
默认策略“主体”:“*”
仍然要求发送方提供一些AWS主体。如您提供的文件的先决条件所述:

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

您是否考虑过使用API网关作为SQS队列的代理?在中定义了这样做的一个示例。我建议为SQS设置一个代理,并设置一个POST端点,例如

POST::/myQueueName/messages

这将改变用户与队列的交互方式,但它允许您仅将队列锁定给服务用户进行读写,这遵循最小特权策略。然后,您的API网关端点可以使用API密钥进行保护,完全开放到internet,甚至可以根据您的首选项使用IAM角色进行保护。

我不建议允许未经身份验证的访问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);
  }
});

好建议,API网关。。。感觉比匿名队列访问要好得多。另一个(轻量级)示例:为什么?为什么对API网关的匿名访问优于直接对SQS的匿名访问?在这两种情况下,每个人都可以写入队列,在这两种情况下,如果我决定关闭公共访问,我只需要更改网关或队列上的权限。在您描述的场景中,SQS基本上是应用程序的后端数据库。在传统的观点中,让这些东西与你认识的用户和你不认识的用户直接交互是更安全的。无论是否匿名,APIG都允许您在有人尝试发出过多请求时定义每个IP的限制,这与SQS不同。有了网关,您可以灵活地切换到后端的不同队列,或者在存储到队列之前,如果您需要在入口端进行更多处理,可以使用lambda函数替换它。每个IP的限制和限制!这是使用它的一个很好的理由!在这种情况下,不需要灵活地切换队列,甚至不需要用其他东西替换队列。谢谢。我真的不明白为什么未经验证的请求在这里是个问题。在一个甚至没有用户注册的系统中,每个人都可以写入队列。无论我使用什么其他机制,基本上都允许每个人向队列写入消息。风险可能不高,但开放的SQS队列显然容易被发现URL的任何人滥用。这可能会给你的应用程序带来问题(读取意外的消息内容)并让你花钱(SQS不是免费服务)。的确,但如果我限制对队列的访问,让每个人都下载写入队列的javascript代码,同样存在同样的风险。对,客户端硬编码的凭据也同样存在问题。理想情况下,所有客户机都会进行身份验证(例如通过Cognito),但我知道在某些情况下,这可能看起来很繁重。无论如何,我只是想强调潜在的风险,让读者充分了解。