Я работаю над настройкой ElasticSearch
экземпляра на AWS
.Моя цель - разрешить http-запрос только от моей функции Lambda
к экземпляру ElasticSearch
.Я создал одну политику, которая дает 'Lambda access to the
ElasticSearch instance. The part I'm struggling with is the inline resource policy for
ElasticSearch that will deny all other request that aren't from the 'Lambda
.
Я попытался установить политику ресурсов ElasticSearch
на Deny
все запросы, а затем присвоил моей Lambda
роль с доступом к ElasticSearch.
Пока Lambda
использует эту роль, я подписываю своюHTTP-запросы с использованием axios и aws4 , но запрос отклоняется с помощью The request signature we calculated does not match the signature you provided.
Я не думаю, что проблема заключается в фактическом подписании запроса, а вместо этого в созданных мною политиках.Если кто-нибудь может направить меня в правильном направлении, это действительно поможет.
Lambda Policy
{
"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 Inline Policy
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": {
"AWS": [
"*"
]
},
"Action": [
"es:*"
],
"Resource": "arn:aws:es:us-east-1:<account-number>:domain/<es-instance>/*"
}
]
}
Lambda Code Using Aws4 and Axios
//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
, установленной для разрешения * (все) и удаления сигнатуры библиотеки aws4
, и все работает нормально.Сейчас я просто хочу обеспечить доступ к этому ресурсу.