我有一个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
library,我是这样使用它的:
axios(aws4.sign({
host: process.env.ES_ENDPOINT,
method: "post",
url: `https://${process.env.ES_ENDPOINT}/foobot/foobot`,
data,
}))
在没有aws4.sign
的情况下,这实际上是可以工作的,因为我已经完全打开了ES域,但是现在我应用了上面的IP地址策略。
现在,我不断地收到这样的错误响应:
我们计算的请求签名与您提供的签名不匹配。请检查AWS保密访问密钥和签名方法。有关详细信息,请参阅服务文档。
我还需要做些什么才能正确地签署请求?
4条答案
按热度按时间mxg2im7a1#
这实际上与
axios
和aws4
这两个库有关。aws4
将基于正常的NodeJShttp
请求进行签名,而在具有主体的POST请求中,,需要主体 * 才能正确地对请求进行签名。通过传入
body
和path
,可以非常简单地修复此问题q5iwbnjs2#
我们发现有一些AWS库可以顺利地处理事情,而不必通过环境变量与lambda共享您的凭据。
下面是一个完整的例子,它允许lambda调用appysync端点。
将其应用于任何其他服务应该不难。
希望能帮上忙。
用法:
当然,您需要为您的lambda IAM角色提供适当的权限。(本博客文章gives good指针)
qoefvg9y3#
是的,我使用了同样的例子,它运行成功。但是每次它返回不同的签名。即使是相同的值。
juzqafwq4#
上面的回答有助于将其全部引入到我的解决方案中,以便将WS消息从lambda发布到API网关中的WebSocket API。
这样做的原因是为了避免使用aws-sdk,它在第一次运行(预热)时至少增加了约2500 ms。
下面是我的代码,希望它能帮助别人: