Сервис AWS Elasticsearch: правильный способ написания этой политики доступа? - PullRequest
0 голосов
/ 05 марта 2019

У меня есть служба, которая выполняет вызов DescribeElasticsearchDomain для определенного домена при запуске (чтобы получить URI), и этот вызов не выполняется.

Я нахожу это немного сбивающим с толку, потому что у домена есть Политика доступа, которая, как я полагаю, открывает ее для DescribeElasticsearchDomain для чего-либо из AWS (честно, это может быть в том случае, если приведенный ниже код неправильный - способ его написания немного подозрительный) ,

Вот ошибка:

org.springframework.beans.BeanInstantiationException: Failed to instantiate [classname]: Constructor threw exception; nested exception is com.amazonaws.services.elasticsearch.model.AWSElasticsearchException: User: arn:aws:sts::{account-id}:assumed-role/{long-role-info} is not authorized to perform: es:DescribeElasticsearchDomain on resource: arn:aws:es:{region}:{account-id}:domain/{domain-name} (Service: AWSElasticsearch; Status Code: 403; Error Code: AccessDeniedException; Request ID: 22e29929-3c70-11e9-97e9-edb3ab09a546)

и политика доступа:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": [
        "es:DescribeElasticsearchDomain",
        "es:DescribeElasticsearchDomains"
      ],
      "Resource": "arn:aws:es:{region}:{account-id}:domain/{domain-name}/*"
    }
  ]
}

Кто-нибудь знает, как это сделать правильно?

РЕДАКТИРОВАТЬ: Я буду также включать код для звонка

    private static String fetchElasticUri(String env) {
        AWSElasticsearch awsElasticsearch = AWSElasticsearchClientBuilder.defaultClient();

        DescribeElasticsearchDomainRequest describeElasticsearchDomainRequest = new DescribeElasticsearchDomainRequest()
            .withDomainName(domain-name);
        DescribeElasticsearchDomainResult describeElasticsearchDomainResult = awsElasticsearch.describeElasticsearchDomain(describeElasticsearchDomainRequest);
        ElasticsearchDomainStatus elasticsearchDomainStatus = describeElasticsearchDomainResult.getDomainStatus();
        return "https://" + elasticsearchDomainStatus.getEndpoints().get("vpc");
    }

1 Ответ

1 голос
/ 28 марта 2019

Политика ресурсов (прикрепленная к домену es) позволяет любому выполнять действия (es: Describe ....), но позволяет роли, которую использует код, разрешить объекту, выполняющему эту роль (es: Describe...)?Без явного разрешения это неявно запрещает действия es.

Добавьте es: * в политику ролей и повторно протестируйте свой сценарий.

...