AWS Elasticsearch服务角色权限

时间:2016-11-09 23:47:15

标签: python amazon-web-services elasticsearch aws-lambda amazon-elasticsearch

我尝试从作为附加了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访问权限的角色运行时会失败?

1 个答案:

答案 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')