AWS Elasticsearch 服务角色权限

AWS Elasticsearch Service Role Permissions

我正在尝试将文档从 Python Lambda 脚本 运行 作为附加了 AmazonESFullAccess 策略的角色提交到 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": "The security token included in the request is invalid." }'): AuthorizationException ...

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

当 运行 作为 'full ES access' 的角色时,为什么这些请求会失败?

因为 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')