【问题标题】:Unable to access ElasticSearch AWS through Python无法通过 Python 访问 ElasticSearch AWS
【发布时间】:2017-08-21 08:05:27
【问题描述】:

我正在尝试通过 Python 从我的本地主机访问 ElasticSearch AWS(我可以通过我的浏览器访问它)。

from elasticsearch import Elasticsearch
ELASTIC_SEARCH_ENDPOINT = 'https://xxx'
es = Elasticsearch([ELASTIC_SEARCH_ENDPOINT])

我收到此错误:

ImproperlyConfigured('Root certificates are missing for certificate validation. Either pass them in using the ca_certs parameter or install certifi to use it automatically.',)

如何访问它?我没有配置任何证书,我只是解放了可以访问ElasticSearch服务的IP。

【问题讨论】:

    标签: python amazon-web-services elasticsearch elasticsearch-dsl-py


    【解决方案1】:

    对于 python 3.5 安装 certifi 并使用 ca_certs=certifi.where() 这将通过证书

    import certifi
    from elasticsearch import Elasticsearch
    
    host = 'https://###########.ap-south-1.es.amazonaws.com'
    
    es = Elasticsearch([host], use_ssl=True, ca_certs=certifi.where())
    

    【讨论】:

      【解决方案2】:

      elasticsearch-py 不附带默认的根证书集。要进行有效的 SSL 证书验证,您需要将自己的证书指定为 ca_certs 或安装将自动获取的证书。

      from elasticsearch import Elasticsearch
      
      # you can use RFC-1738 to specify the url
      es = Elasticsearch(['https://user:secret@localhost:443'])
      
      # ... or specify common parameters as kwargs
      
      # use certifi for CA certificates
      import certifi
      
      es = Elasticsearch(
          ['localhost', 'otherhost'],
          http_auth=('user', 'secret'),
          port=443,
          use_ssl=True 
      )
      
      # SSL client authentication using client_cert and client_key
      
      es = Elasticsearch(
          ['localhost', 'otherhost'],
          http_auth=('user', 'secret'),
          port=443,
          use_ssl=True,
          ca_certs='/path/to/cacert.pem',
          client_cert='/path/to/client_cert.pem',
          client_key='/path/to/client_key.pem',
      )
      

      https://elasticsearch-py.readthedocs.io/en/master/

      【讨论】:

        【解决方案3】:

        我是这样做的,而且效果很好:

        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())
        

        【讨论】:

          【解决方案4】:

          您还可以使用 boto3 生成临时访问密钥和密钥。

          import boto3
          
          region = 'ap-southeast-2'
          service = 'es'
          session = boto3.Session()
          credentials = session.get_credentials()
          
          awsauth = AWS4Auth(credentials.access_key, credentials.secret_key,region, service,session_token=credentials.token)
          
          es = Elasticsearch(
              hosts = [{'host': host, 'port': 443}],
              http_auth = awsauth,
              use_ssl = True,
              verify_certs = True,
              connection_class = RequestsHttpConnection
          )
          

          https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-indexing.html

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-11-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-12-19
            • 1970-01-01
            • 1970-01-01
            • 2022-06-11
            相关资源
            最近更新 更多