Создание действительного подписанного запроса к экземпляру AWS ES из node.js
Я пытаюсь найти пример подключения к экземпляру AWS ES в файле node.js, а затем поразить кластер ES простым запросом.
Я пытаюсь использовать для этого пакет узла эластичного поиска вместе с надстройкой с открытым исходным кодом http-aws-es.
Я настроил мою политику доступа aws ES так, чтобы она выглядела следующим образом:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<account-id>:root"
},
"Action": "es:*",
"Resource": "example-domain.us-east-1.es.amazonaws.com:<account-id>:domain/*"
},
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "es:*",
"Resource": "example-domain.us-east-1.es.amazonaws.com:<account-id>:domain/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "<my-ip>"
}
}
}
]
}
Итак, я хотел бы иметь возможность отправлять запросы put и get на экземпляр es либо с IP-адреса, либо от пользователя IAM, связанного с моей учетной записью aws.
У меня есть следующий код, который пытается это в node.js:
var aws_access_key = 'example';
var aws_secret_key = 'key';
var es = require('elasticsearch').Client({
hosts: 'example-domain.us-east-1.es.amazonaws.com',
connectionClass: require('http-aws-es'),
amazonES: {
region: 'us-east-1',
accessKey: aws_access_key,
secretKey: aws_secret_key
}
});
es.ping({
// ping usually has a 3000ms timeout
requestTimeout: Infinity,
// undocumented params are appended to the query string
hello: "elasticsearch!"
}, function (error) {
if (error) {
console.log(error);
console.trace('elasticsearch cluster is down!');
} else {
console.log('All is well');
}
});
Который в настоящее время возвращает ошибку авторизации:
{ [Error: Authorization Exception]
status: 403,
displayName: 'AuthorizationException',
message: 'Authorization Exception' }
Я еще не видел рабочий пример использования экземпляра aws ES с помощью подписанной политики в node.js. У кого-нибудь есть идеи?
1 ответ
Оказывается, я почти все правильно сделал в своем вопросе, за исключением одного шага.
Пользователь IAM, связанный с aws_access_key
а также aws_secret_key
в приведенном выше коде должны быть специальные разрешения для взаимодействия с экземплярами эластичного поиска. Поэтому я вошел в консоль AWS и добавил следующую политику для пользователей IAM, которым необходимо будет взаимодействовать с экземпляром asticsearch.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1480915344000",
"Effect": "Allow",
"Action": [
"es:*"
],
"Resource": [
"arn:aws:es:us-east-1:<account-id>:domain/*"
]
}
]
}