1

this tutorialの後に、作成したAmazon ElasticSearchサービスクラスタにすべてのDynamoDBストリームが自動的にインデックスされます。Amazon ESクラスタのデータのインデックス作成中にクラウドログのエラーが発生しました

私はこれを順を追って実行し、すべてのアクセス許可ポリシーを作成しました。

しかし、私がテストしているとき、私のAmazon ESクラスタでは何も索引付けされていません。 CloudWatchを確認すると、次のログが表示されます。

('ERROR: ', 'Traceback (most recent call last): 
File "/var/task/lambda_function.py", line 123, in lambda_handler 
return _lambda_handler(event, context) 
File "/var/task/lambda_function.py", line 219, in _lambda_handler 
post_to_es(es_payload) # post to ES with exponential backoff 
File "/var/task/lambda_function.py", line 86, in post_to_es 
es_ret_str = post_data_to_es(payload, es_region, creds, es_endpoint, \'/_bulk\') 
File "/var/task/lambda_function.py", line 53, in post_data_to_es 
req = botocore.awsrequest.create_request_object(params) 
File "/var/runtime/botocore/awsrequest.py", line 314, in create_request_object 
request_object.context.update(r[\'context\']) 
KeyError: \'context\' 
') 

私はこの問題を理解していません。私の知っているラムダ関数は、それぞれのDynamoDBストリームを正常にトリガーし、CloudWatchにログを送信できますが、Amazon ESでこれらのデータをインデックスに登録することはできません。

誰かがこの問題を解決するのに手伝ってください。

+0

エラーは自明ですが、あなたの 'r' dictには' context'キーがありません –

答えて

0

aws lambdaが使用しているボトコアコードに最近の変更がありました。

コードの、影響を行は次のとおりです。新しい変更に
req = botocore.awsrequest.create_request_object(params)

、彼らは「コンテキスト」フィールドを含むように、引数にのparamsを期待しています。

だからあなたのparams引数にコンテキストフィールドを追加してください: 例:params = {'method': method, 'url': proto + host + path, 'region': region, 'headers': {'Host': host}, 'body': payload,'context': {'signing': {'region': 'us-east-1'}}}

あなたは上記の変更を加えたら、ラムダが正常に実行することができます。

詳細: ファイルbotocore.awsrequestでは、314行目のコード変更によりこの問題が発生しています。 https://github.com/boto/botocore/commit/28b8831f5f8518bef5accf994fc377c58a3569f7#diff-cb00fc815f8f80ae15e7d0cecc74b395

関連する問題