通过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秘密访问密钥和签名方法。 详细信息请参阅服务文档。
还有什么我需要做的,以妥善签署请求?
这实际上与两个图书馆, axios
和aws4
。 aws4
会根据一个正常的NodeJS http
请求进行签名,并且在一个带有body 的 POST请求中, body需要正确地签署请求。
这是通过传递body
和path
相当简单
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", }))