2017-10-24 21 views
0

私はaws Athenaに解析するために、Python 3.6でコード化されたラムダをいくつかのSQLクエリとともにコード化しています。このラムダは、dynamodbに入る新しい項目があるときには常にdynamoDBによってトリガーされます。新しいアイテムごとに、ラムダをスピンアップしたい。たとえば、DynamoDBに入っている100個の新しいアイテムがある場合、実行される100の同時ラムダがあります。しかし、このプロセスでは、SQLクエリの1つがAthenaで失敗し、ラムダがそのdynamodbレコードの計算を完了できない瞬間がありました。aws lambda(python 3.6)の操作の制御

注:dynamodbの各レコードのデータは、PythonおよびAWS ATHENAのSQLクエリに解析されます。

私の質問:並行するラムダのいずれかにエラーがある場合、このプロセスをどのように停止すれば、ラムダは私にコストがかかる同じレコードの実行を繰り返しています。

+0

私はエラーやコードについては尋ねていませんが、実行に失敗した場合にラムダを停止する方法を知りたいだけです。 – pyhotshot

+0

ラムダ関数の同期型 'RequestResponse'呼び出し型または非同期' event'呼び出しを使用していますか? –

+0

同期RequestResponseではありません。新しいレコードがDynamoDBで生成/編集されると、ラムダはそのレコードの実行を開始します。 DynamoDBで100レコードが生成されると、ラムダはレコードごとに1つずつ実行されます。レコードが実行に失敗すると、同じレコードに対して再実行されます。 – pyhotshot

答えて

0

DynamoDBのようなストリームベースのソースからトリガーするLambdasは、期限切れ(24時間)または成功するまで、同じレコードを繰り返し再試行するように設計されています。コードレベルでエラーをキャッチするだけで、ハンドラの外側にバブルが発生しないようにするだけです。 DynamoDBストリームイベントを処理するPythonのラムダのサンプルコードを使用して、try-exceptのハンドリング関数で例外を発生させているものをラップするだけで済みます。

def lambda_handler(event, context): 
    for record in event['Records']: 
     try: 
      # suppose this method can throw an exception 
      process_record_with_athena(record) 
     except Exception as e: 
      print("Caught exception {0} processing record: {1}. Ignoring and continuing...".format(e, record)) 
    print('Successfully processed %s records.' % str(len(event['Records']))) 

また、タイムアウトが発生しないように注意してください。 DynamoDBからのレコードのバッチを処理している間にラムダがタイムアウトしている場合は、そのバッチを繰り返し何度もやり直します。 CloudWatchのログでタイムアウトが発生しているかどうかを確認できます。

追加の100個の項目がDynamoDBに挿入されているという理由だけで、100個のラムダを同時に実行するわけではありません。これらの100項目は、すべて簡単にすべて同じストリームシャードに分割することができます。その場合、すべてのストリームを処理するラムダが1つしかないことになります。

+0

ありがとう、あなたのサイドノートに関しては、同時ラムダをスピンアップする方法を教えてもらえますか? – pyhotshot

関連する問題