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 片段的情况下工作,因为我完全开放了 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.

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

最佳答案

这实际上与两个库有关,axiosaws4aws4 将基于普通 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/

相关文章:

javascript - 在 Ubuntu 16.04 上安装 npm 时出现问题

javascript - 带 promise 的图遍历

mysql - 无法得到任何回应

amazon-web-services - 在 AWS CodeDeploy 中使用蓝/绿部署时,我们如何维护自动扩展组的状态?

python - boto3 ec2中的分页描述实例

python - 如何配置Elasticsearch从Amazon SQS提取消息

node.js - 如何格式化来自 MongoDB 的日期?

python - 如何将python代码发送到另一台机器执行?

elasticsearch - ElasticSearch中的空桶

amazon-web-services - 在 AWS 应用程序负载均衡器后面添加启用 x-pack 的 Elasticsearch 导致由于缺少身份验证而导致运行状况检查失败