node.js - 通过 http 正确签署对 aws 资源的请求

标签 node.js amazon-web-services elasticsearch aws-sdk aws-lambda

我有一个 lambda 函数,它正在将一些数据写入我也通过 AWS 设置的 Elasticsearch 域。目前我域的访问策略只是允许我自己的 IP 地址与域一起使用

{"Version": "2012-10-17", "Statement": [{
 "Effect": "Allow", "Principal": {"AWS": "*"},
 "Action": "es:*",
 "Resource": "arn:aws:es:us-east-1:$ACCOUNT:domain/DOMAIN/*",
 "Condition": { "IpAddress": { "aws:SourceIp": $MYIP } }
}]}

我找到了 aws4 library用于签署 http 请求。我就是这样使用它的:

axios(aws4.sign({
    host: process.env.ES_ENDPOINT,
    method: "post",
    url: `https://${process.env.ES_ENDPOINT}/foobot/foobot`,
    data,
}))

这实际上是在没有 aws4.sign block 的情况下工作的,因为我已经完全打开了 ES 域,但现在我已经应用了上面的 IP 地址策略。

现在,我不断收到这样的错误响应:

The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.

我还需要做些什么来正确签署请求吗?

最佳答案

这实际上与 axiosaws4 这两个库有关。 aws4 将基于普通的 NodeJS http 请求进行签名,并且在带有正文的 POST 请求中需要正文才能正确签署请求.

通过传入 bodypath

即可轻松解决此问题
axios(aws4.sign({
    host: process.env.ES_ENDPOINT,
    method: "POST",
    url: `https://${process.env.ES_ENDPOINT}/foobot/foobot`,
    data,
    body: JSON.stringify(data),
    path: "/foobot/foobot",
}))

关于node.js - 通过 http 正确签署对 aws 资源的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38599786/

相关文章:

node.js - 无法获取 CSS 文件

javascript - Mongoose - 从子文档中删除属性

elasticsearch - elastic apm,关闭ssl验证

node.js - Express.js session 未定义。雷迪斯

mysql - Sequelize 多连接中的排序错误

amazon-web-services - AWS 事件溯源实现

asp.net-mvc - 用于 Amazon S3 的基于开源或付费 JavaScript 的文件管理器

amazon-web-services - Cloudwatch 日志警报 - 如何在电子邮件通知中包含错误/异常/堆栈跟踪数据

search - 在浏览器中使用Elasticsearch REST API:如何做和操作

elasticsearch - 不能连接到Kubernetes(裸机(Bare Metal))中的Elasticsearch