通过http正确签署对aws资源的请求

我有一个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 } } }]} 

我find了用于签署http请求的aws4库 。 我正在使用它:

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

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

现在,我不断得到这样的错误,作为回应:

我们计算的请求签名与您提供的签名不符。 检查您的AWS秘密访问密钥和签名方法。 详细信息请参阅服务文档。

还有什么我需要做的,以妥善签署请求?

这实际上与两个图书馆, axiosaws4aws4会根据一个正常的NodeJS http请求进行签名,并且在一个带有body POST请求中, body需要正确地签署请求。

这是通过传递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", }))