我正在努力在 AWS
上设置一个 ElasticSearch
实例。我的目标是只允许从我的 Lambda
函数到 ElasticSearch
实例的 http 请求。我制定了一项政策,为 Lambda 提供对
ElasticSearch 实例的访问权。我正在努力解决的部分是
ElasticSearch的内联资源策略,它将拒绝所有其他不是来自“Lambda
”的请求。
我已尝试将 ElasticSearch
资源策略设置为 Deny
所有请求,然后为我的 Lambda
提供一个可以访问 ElasticSearch 的角色.
当 Lambda
使用该角色时,我正在使用 axios 签署我的 http 请求。和 aws4但是请求被拒绝了 The request signature we calculated does not match the signature you provided.
我不认为问题是请求的实际签名,而是我创建的策略。如果有人能引导我朝着正确的方向前进,那将非常有帮助。
Lambda 政策
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"es:ESHttpGet",
"es:CreateElasticsearchDomain",
"es:DescribeElasticsearchDomainConfig",
"es:ListTags",
"es:ESHttpDelete",
"es:GetUpgradeHistory",
"es:AddTags",
"es:ESHttpHead",
"es:RemoveTags",
"es:DeleteElasticsearchDomain",
"es:DescribeElasticsearchDomain",
"es:UpgradeElasticsearchDomain",
"es:ESHttpPost",
"es:UpdateElasticsearchDomainConfig",
"es:GetUpgradeStatus",
"es:ESHttpPut"
],
"Resource": "arn:aws:es:us-east-1:,accountid>:domain/<es-instance>"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"es:PurchaseReservedElasticsearchInstance",
"es:DeleteElasticsearchServiceRole"
],
"Resource": "*"
}
]
}
ElasticSearch 内联策略
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": {
"AWS": [
"*"
]
},
"Action": [
"es:*"
],
"Resource": "arn:aws:es:us-east-1:<account-number>:domain/<es-instance>/*"
}
]
}
使用 Aws4 和 Axios 的 Lambda 代码
//process.env.HOST = search-<es-instance>-<es-id>.us-east-1.es.amazonaws.com
function createRecipesIndex(url, resolve, reject){
axios(aws4.sign({
host: process.env.HOST,
method: "PUT",
url: "https://" + process.env.HOST,
path: '/recipes/',
}))
.then(response => {
console.log("----- SUCCESS INDEX CREATED -----");
resolve();
})
.catch(error => {
console.log("----- FAILED TO CREATE INDEX -----");
console.log(error);
reject();
});
}
注意:我尝试创建索引时将 ElasticSearch
上的内联策略设置为允许 *(all) 并删除 aws4
库签名,它工作正常。现在我只想保护对该资源的访问。
最佳答案
我找到了我的问题的解决方案,它是 2 倍。第一个问题是我的内联 resource policy
在我的 ElasticSearch
实例。我需要更新它以允许我赋予 Lambda
的角色.这是通过获取 role arn
完成的。来自 IAM
然后创建以下要内联附加到 ElasticSearch
上的策略实例。
我的第二个问题是 aws4
. path
和 url
我设置的不匹配。我的路径有 /xxxx/
而我的网址是 https://search-<es-instance>-<es-id>.us-east-1.es.amazonaws.com/xxxx
.自 path
包含在 url
中找不到的额外正斜杠, 签名失败。对于使用该库的任何其他人,请确保这些值是一致的。我希望这对将来的其他人有帮助 :D
Elastic Search Policy
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<account-id>:role/service-role/<role-name>"
},
"Action": "es:*",
"Resource": "arn:aws:es:us-east-1:<account-id>:domain/<es-instance>/*"
}
]
}
关于node.js - AWS Elastic Search Policy,只允许lambda访问Elastic Search,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53266927/