gpt4 book ai didi

python - 如何将 python ElasticSearch 包与 ECS 实例角色一起使用而不是传递凭据?

转载 作者:行者123 更新时间:2023-12-03 02:19:59 26 4
gpt4 key购买 nike

我已经构建了一个在不同时间查询 ElasticSearch 的应用程序。现在我正在将应用程序移动到托管在 ECS 上,我想将我的查询切换为基于实例角色权限,而不是我作为环境变量传递的凭据。
基于docs ,如果我没有将凭据传递给 Boto3,我应该使用我的实例角色。但是为了使用 ElasticSearc 发送我的查询h 包在 python 中,我必须传递凭据。有没有办法使用实例角色来做到这一点?
示例代码 here给了我希望,我只是传入 `boto3.Session().get_credentials() 函数来检索实例角色凭据。但事实证明,正如我的 aws 管理员所解释的那样,实例角色实际上没有凭据(aws_key、aws_secret_key)。结果,我的代码似乎生成了一个在云上无效的 AWS key ,并且只为我的查询返回空值。
有人告诉我,唯一的选择是使用 ES Boto3 client并且不传递凭据...但是在此客户端上使用 ES 不如使用 ElasticSearch python 包接口(interface)那么友好。
有没有办法让它在 ElasticSearch 包可以在不传递凭据且仅依赖实例角色权限的情况下查询 ES 的情况下工作?
到目前为止,这是我的代码:

if os.environ.get('LOCAL_DEV')==1:
AWS_KEY = os.environ['AWS_ACCESS_KEY']
AWS_SECRET_KEY = os.environ['AWS_SECRET_KEY']
else:
credentials = boto3.Session().get_credentials() #fails to use instance role
AWS_KEY=credentials.access_key
AWS_SECRET_KEY=credentials.secret_key

# It pulls my environment variables when running locally, and when running on the cluster, I need it to use the Instance Role

#### below is how I initialize and query with the ElasticSearch package


import elasticsearch as es
from requests_aws4auth import AWS4Auth
from constants import AWS_KEY, AWS_SECRET_KEY

awsauth = AWS4Auth(AWS_KEY, AWS_SECRET_KEY, 'us-west-2', 'es')
#requires a credential input
host ='search-xxx.xxx.xxxxxxx.xxxx.amazonaws.com'
e_s = es.Elasticsearch(
hosts=[{'host': host, 'port': 443}],
http_auth=awsauth,
use_ssl=True,
verify_certs=True,
connection_class=es.RequestsHttpConnection
)

res = e_s.search(index='foo', body='bar')
res = res['hits']['hits']


对此的任何帮助将不胜感激

最佳答案

我最终做的是使用基于 InstanceRole 权限的 boto3 提取临时凭证。由于这些是临时凭证,因此需要轮换。然而,它奏效了!我被难住了,直到我发现需要在 AWS4Auth 命令中使用临时 token

temp_access=boto3.Session(region_name='foo-region').get_credentials().access_key
temp_secret=boto3.Session(region_name='foo-region').get_credentials().secret_key
temp_token=boto3.Session(region_name='foo-region').get_credentials().token

########
from requests_aws4auth import AWS4Auth
awsauth=AWS4Auth(temp_access, temp_secret, 'us-west-2', 'es', session_token=temp_token)

es.Elasticsearch(hosts=[{'host':host, 'port':443}],
http_auth=awsauth,
use_ssl=True,
verify_certs=True,
connection_class=es.RequestsHttpConnection)
This article很有帮助

关于python - 如何将 python ElasticSearch 包与 ECS 实例角色一起使用而不是传递凭据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62646560/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com