我尝试从作为附加了AmazonESFullAccess政策的角色运行的Python Lambda脚本向Elasticsearch索引提交文档。我正在使用python elasticsearch库创建请求,并使用aws_requests_auth库对它们进行签名。
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,u&#39; {&#34; message&#34;:&#34;安全令牌包含在 请求无效。&#34; }&#39;):AuthorizationException ...
虽然使用管理员用户访问密钥运行时代码相同。
为什么这些请求作为具有完整ES访问权限的角色运行时会失败?
答案 0 :(得分:1)
因为Elasticsearch是AWS的单独实体,但是AWS托管的版本似乎弹性搜索并不像您期望的那样对待IAM .APR有适当的尝试,但是并不仅仅使用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')