4

我正在尝试从作为附加了 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'{"message": "请求中包含的安全令牌无效。" }'): AuthorizationException ...

尽管使用管理员用户访问密钥运行时相同的代码有效。

为什么这些请求在作为具有“完全 ES 访问权限”的角色运行时会失败?

4

1 回答 1

2

因为 Elasticsearch 是 AWS 的一个独立实体,但一个版本由 AWS 托管,看来 elasticsearch 并没有像您期望的那样对待 IAM。AWS 有一些可以尝试的东西,但并不完全适用于一个 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')
于 2016-11-10T03:48:40.240 回答