我有一个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 } }
}]}
我找到了用于签署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 Secret Access密钥和签名方法。有关详细信息,请查阅服务文档。
我需要做其他事情来正确签署请求吗?
这实际上有两个库做的,axios
和aws4
。aws4
会根据正常的NodeJShttp
请求进行签名,并且在带有主体的POST请求中,主体必须正确签署请求。
这很简单地通过传递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",
}))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句