Подключение к Elasticsearch — сервис Amazon Elasticsearch — пользователь IAM

Я выбрал «Разрешить доступ к одной или нескольким учетным записям AWS или пользователям IAM».

Моя политика доступа

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::12345678910:user/elastic"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:eu-west-1:123456789:domain/elastic-cluster/*"
    }
  ]
}

Я создал профиль IAM -

user - elastic 
password -hisdfdsfds
Access key Id - sdsfdssdfdsfdsfdsfsdfsd
Secret Access Key - sdsfdsfdsfsdfdsfds

когда я пытаюсь подключиться

$params = array();
$params['hosts'] = array (
    'search-elastic-cluster-sdfsdfsdfs.eu-east.es.amazonaws.com:80',                 
    );

$client = new Elasticsearch\Client($params);

Выдает следующую ошибку:

{"Message":"User: anonymous is not authorized to perform: es:ESHttpPost on resource: arn:aws:es:eu-west-1:dsfdsfsdfsdsd:domain/elastic-cluster/sdsfsfds/sdfdsfdssd/_search"}

Я обнаружил, что к нему можно получить доступ с помощью подписанных запросов подписи версии 4. Я пытался это сделать, но не смог. Может быть, путь неправильный.

Буду рад, если кто-нибудь предложит идеи по созданию подписанного запроса версии 4 к домену elasticsearch. Пример с использованием параметров, которые я указал выше, был бы очень полезен. Заранее спасибо.


person Programmer    schedule 04.12.2015    source источник
comment
У меня были похожие проблемы, но с другим кодом (с использованием boto2). Я проверил все разрешения пользователей, и оказалось, что это разрешения ES (аналогичные группам безопасности), которые запрещали использование IP-адреса, который я использовал.   -  person Efren    schedule 15.03.2017


Ответы (1)


Приложение должно подписывать запросы, идущие к Elasticsearch. В AWS SDK для выбранного вами языка должен быть метод, который создает учетные данные для запроса подписи.

Когда вы предоставляете свои запросы с учетными данными, все должно быть в порядке и хорошо идти.

Это фрагмент кода с использованием javascript sdk:

var AWS = require('aws-sdk');
var creds = new AWS.EnvironmentCredentials('AWS');

var esDomain = {
    region: 'us-east-1',
    endpoint: 'yoursearchdomain.region.amazonaws.com',
    index: 'myindex',
    doctype: 'mytype'
};

var endpoint = new AWS.Endpoint(esDomain.endpoint);

var req = new AWS.HttpRequest(endpoint);

    req.method = 'POST';
    req.path = path.join('/', esDomain.index, esDomain.doctype);
    req.region = esDomain.region;
    req.headers['presigned-expires'] = false;
    req.headers['Host'] = endpoint.host;
    req.headers['Content-Type'] = 'application/json';
    req.body = doc;

var signer = new AWS.Signers.V4(req , 'es'); 
    signer.addAuthorization(creds, new Date());
    
    var send = new AWS.NodeHttpClient();
    send.handleRequest(req, null, function(httpResp) {
        var respBody = '';
        httpResp.on('data', function (chunk) {
            respBody += chunk;
        });
        httpResp.on('end', function (chunk) {
            console.log('Response: ' + respBody);
            context.succeed('Lambda added document ' + doc);
        });
    }, function(err) {
        console.log('Error: ' + err);
        context.fail('Lambda failed with error ' + err);
    });

person Sani    schedule 08.06.2018