Cover Image for python で aws の lambda → lambda 呼び出しを並列化しようとしてハマった話

python で aws の lambda → lambda 呼び出しを並列化しようとしてハマった話

この記事は最終更新日から5年以上が経過しています。

概要

  • aws lambda 上で動かしてるシステムから、別のlambdaを並列かつ非同期で呼び出して処理の受渡しをしたかった
  • 呼び出しがうまくいかず、受け取り側の lambda が起動せずハマった

結論

  • ThreadPoolExecutor で並列実行した際に lambda 呼び出し実行完了まで待ってなかった。そのため呼び出し側のコンテナが、呼び出しの為の通信途中で終了して受け取り側が起動してなかった。
  • 呼び出し完了まで待つ事で解消した

失敗例

with ThreadPoolExecutor(thread_name_prefix="thread") as executor:
    for event in events:
        executor.submit(invoke_lambda, event)
    logger().info("submit end")

invoke_lambda の中てboto3を使って lambda を呼び出している。 非同期で呼び出すだけで戻り受け取らなくていいかなと思ってこれで済ませたところハマる。

成功例

with ThreadPoolExecutor(thread_name_prefix="thread") as executor:
    futures = []    
    for event in events:
	    futures.append(executor.submit(invoke_lambda, event))
	logger().info("submit end")
	logger().info([f.result() for f in futures])

invoke_lambda呼び出し結果を返すようにして、ThreadPoolExecutor側で受け取るようにした。これで呼び出しが終わるまでコンテナが死ななくなった。