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')
我正在尝试将文档从 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')