Ошибка аутентификации, наконец, ошибка AWS Сервис ElasticSearch - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь обновить приложение Django с использования AWS ElasticSearch 2.3 до 7.4 (и одновременно обновить пакеты Django).

У меня оно работает локально, но когда я пытаюсь запустить с AWS ElasticSearch7.4, я получаю следующую трассировку

Traceback (most recent call last):
  File "/home/henry/Documents/Sites/Development/autumna2/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/henry/Documents/Sites/Development/autumna2/env/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/henry/Documents/Sites/Development/autumna2/env/lib/python3.6/site-packages/django/core/handlers/base.py", line 124, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/henry/Documents/Sites/Development/autumna2/autumna/src/search/views.py", line 169, in name_suggestions
    field='name_suggestion',
  File "/home/henry/Documents/Sites/Development/autumna2/autumna/src/search/views.py", line 129, in search_suggestions
    data = sqs.execute(ignore_cache=True).to_dict()['hits']['hits']
  File "/home/henry/Documents/Sites/Development/autumna2/env/lib/python3.6/site-packages/elasticsearch_dsl/search.py", line 698, in execute
    **self._params
  File "/home/henry/Documents/Sites/Development/autumna2/env/lib/python3.6/site-packages/elasticsearch/client/utils.py", line 92, in _wrapped
    return func(*args, params=params, headers=headers, **kwargs)
  File "/home/henry/Documents/Sites/Development/autumna2/env/lib/python3.6/site-packages/elasticsearch/client/__init__.py", line 1627, in search
    body=body,
  File "/home/henry/Documents/Sites/Development/autumna2/env/lib/python3.6/site-packages/elasticsearch/transport.py", line 362, in perform_request
    timeout=timeout,
  File "/home/henry/Documents/Sites/Development/autumna2/env/lib/python3.6/site-packages/elasticsearch/connection/http_urllib3.py", line 248, in perform_request
    self._raise_error(response.status, raw_data)
  File "/home/henry/Documents/Sites/Development/autumna2/env/lib/python3.6/site-packages/elasticsearch/connection/base.py", line 244, in _raise_error
    status_code, error_message, additional_info
elasticsearch.exceptions.AuthenticationException: AuthenticationException(401, 'Authentication finally failed')

Я использую django-elasticsearch-dsl, поэтому я просто объявил хост в settings.py (это прямая замена из того, что у меня было раньше) с

ELASTICSEARCH_DSL = {
    'default': {
        'hosts': 'https://search-elastic7-zoqohjbiedz2ozmthfi4a3ccm4.eu-west-2.es.amazonaws.com', # I've changed this string
    },
}

Я использую аутентификацию IAM и предоставил учетной записи IAM полный доступ ко всем моим экземплярам ElasticSearch (но это отличается от основного пользователя и пароля, которые я использовал при настройке экземпляра). Если мне это нужно, как мне их передать? Если нет, то что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

Следующие отсортированы, если у кого-то еще есть проблемы

from elasticsearch import Elasticsearch, RequestsHttpConnection
from requests_aws4auth import AWS4Auth

AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID',"some key")
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY',"another secret key")
AWS_SERVICE = 'es'
AWS_ELASTICSEARCH = os.environ.get('AWS_ELASTICSEARCH','search-elastic7-zoqohjbiedz2ozmthfi4a3ccm4.eu-west-2.es.amazonaws.com')
http_auth = AWS4Auth(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION, AWS_SERVICE)
ELASTICSEARCH_DSL = {
    'default': {
        'hosts': [{'host': AWS_ELASTICSEARCH, 'port': 443}],
        'http_auth' : http_auth,
        'use_ssl' : True,
        'verify_certs' : True,
        'connection_class' : RequestsHttpConnection
    },
0 голосов
/ 25 марта 2020

Не похоже, что django -elasticsearch-dsl поддерживает AWS Подписание ES-запроса, которое требуется при включенной аутентификации IAM: https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-request-signing.html

Вы можете проверьте, не в этом ли проблема, сделав экземпляр AWS ES полностью открытым (без аутентификации).

...