一尘不染

Django-Haystack使用具有IAM凭证的Amazon Elasticsearch托管

elasticsearch

我希望使用Amazon的Elasticsearch服务器在Django数据库中搜索长文本字段。但是,我也不想向那些没有登录并且不想通过模糊性或某些IP限制策略依赖安全性的用户公开此搜索(除非它可以与现有的heroku应用完美配合,部署Django应用的位置)。

Haystack似乎在这方面还有很长的路要走,但是似乎没有一种简单的方法来配置它以使用Amazon的IAM凭据来访问Elasticsearch服务。它使用的是Elasticsearch-
py中确实存在此功能。

https://elasticsearch-py.readthedocs.org/en/master/#running-with-aws-
elasticsearch-service

from elasticsearch import Elasticsearch, RequestsHttpConnection
from requests_aws4auth import AWS4Auth

host = 'YOURHOST.us-east-1.es.amazonaws.com'
awsauth = AWS4Auth(YOUR_ACCESS_KEY, YOUR_SECRET_KEY, REGION, 'es')

es = Elasticsearch(
    hosts=[{'host': host, 'port': 443}],
    http_auth=awsauth,
    use_ssl=True,
    verify_certs=True,
    connection_class=RequestsHttpConnection
)
print(es.info())

关于使用HTTP授权,我在https://github.com/django-haystack/django-
haystack/issues/1046的问题下找到了它

from urlparse import urlparse
parsed = urlparse('https://user:pass@host:port')
HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
        'URL': parsed.hostname,
        'INDEX_NAME': 'haystack',
        'KWARGS': {
            'port': parsed.port,
            'http_auth': (parsed.username, parsed.password),
            'use_ssl': True,
        }
    }
}

我想知道是否有一种方法可以将两者结合起来,类似于以下内容(由于不仅仅具有用户名和密码,这也产生了错误):

from requests_aws4auth import AWS4Auth
awsauth = AWS4Auth([AACCESS_KEY],[SECRET_KEY],[REGION],'es')


HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
        'URL': [AWSHOST],
        'INDEX_NAME': 'haystack',
        'KWARGS': {
            'port': 443,
            'http_auth': awsauth,
            'use_ssl': True,
            'verify_certs': True
        }
    },
}

这里的错误:

TypeError at /admin/
must be convertible to a buffer, not AWS4Auth

Request Method:     GET
Request URL:    http://127.0.0.1:8000/admin/
Django Version:     1.7.7
Exception Type:     TypeError
Exception Value:

must be convertible to a buffer, not AWS4Auth

Exception Location:     /usr/lib/python2.7/base64.py in b64encode, line 53

关于如何实现此目标的任何想法?


阅读 215

收藏
2020-06-22

共1个答案

一尘不染

你是从成功的一步,加入connection_classKWARGS如预期正常工作了。

import elasticsearch

HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
        'URL': [AWSHOST],
        'INDEX_NAME': 'haystack',
        'KWARGS': {
            'port': 443,
            'http_auth': awsauth,
            'use_ssl': True,
            'verify_certs': True,
            'connection_class': elasticsearch.RequestsHttpConnection,
        }
    },
}
2020-06-22