1

AmazonESFullAccessポリシーが付与されたロールとして実行されているPython Lambdaスクリプトから、Elasticsearchインデックスにドキュメントを送信しようとしています。私はpython elasticsearchライブラリでリクエストを作成し、aws_requests_authライブラリで署名しています。AWS Elasticsearchサービスロールのアクセス許可

TransportError(403、U '{ "メッセージ":これは、以下で失敗している

ES_CLIENT.bulk(
    index='test_index', 
    body=docs) 

:「セキュリティトークンを

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) 

次に、以下のようにバルク要求を作成する送信します リクエストに含まれています。 "} '):AuthorizationException ...

adminユーザーのアクセスキーで実行しても同じコードが機能します。

なぜ「フルESアクセス」の役割として実行しているときにこれらの要求が失敗するのですか?

答えて

1

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') 
関連する問題