1

Я пытаюсь отправить документы в индекс Elasticsearch из сценария Lambda Python, работающего как роль, к которой прилагается политика AmazonESFullAccess. Я создаю запросы с библиотекой python elasticsearch и подписываю их с библиотекой aws_requests_auth.Разрешения на роль службы AWS Elasticsearch

cred = boto3.session.Session().get_credentials() 
es_host = '<elasticsearch-server>' 

auth = AWSRequestsAuth(
    aws_access_key=cred.access_key, 
    aws_secret_access_key=cred.secret_key, 
    aws_host=es_host, 
    aws_region='us-east-1', 
    aws_service='es') 

ES_CLIENT = Elasticsearch(
    host=es_host, 
    port=80, 
    connection_class=RequestsHttpConnection, 
    http_auth=auth) 

Затем отправка насыпной создавать запросы следующим образом:

ES_CLIENT.bulk(
    index='test_index', 
    body=docs) 

Это неудачу со следующим:

TransportError (403, и '{ "сообщение": «Маркер безопасности включенное в запрос . "} '): АвторизацияException ...

Хотя тот же код работает при работе с ключами доступа администратора.

Почему эти запросы не выполняются при выполнении роли с «полным доступом к ES»?

ответ

1

Поскольку Elasticsearch является отдельным объектом AWS, но версия размещена AWS, похоже, что elasticsearch не обрабатывает IAM так же, как вы ожидали. AWS имеет что-то на своем месте, которое пытается, но не достаточно работать с помощью access_key и secret_key. Для этого нужен и токен сеанса.

Ответ на этот вопрос заключается в использовании cred.token вместе с ключом доступа и секретным ключом, а затем передать его в AWSRequestsAuth объекта:

auth = AWSRequestsAuth(
    aws_access_key=cred.access_key, 
    aws_secret_access_key=cred.secret_key, 
    aws_token=cred.token, 
    aws_host=es_host, 
    aws_region='us-east-1', 
    aws_service='es') 

 Смежные вопросы

  • Нет связанных вопросов^_^