バッチ処理 - kocya-dev/note GitHub Wiki

サービス選定

AWSでバッチ処理を実装する際の選択肢とサービス比較

代表的なサービス 判断材料
Lambda 15分以内
ECS(Fargate) 15分以上, リクエスト数少ない
AWS Batch 15分以上, リクエスト数多い

構築

コンテナ内で動作する処理について、開発/ステージング/本番といった開発環境ごとの処理先変更をどう実現するのか?
それとも少量のタスクに分割してlambdaを叩く方が良い?

ex) b2bサービスでテナント毎に処理する必要がある場合。
  - 各テナントの処理をSQSにキューイングするためのlambda (EventBridgeで一定時間で起動。15分単位とか1日単位とか)
  - SQS発火後、複数テナント分の処理を少しずつまとめて実施 (DB操作、S3操作)
  • 15分を越えるなら15分未満にタスクを分割する
  • テストしにくい構成を割ける (ECS/Fargateは処理しにくい)

処理速度の検討材料

LambdaがS3からGetObjectするのにかかる時間を計測してみた [追記, 修正あり]

  • GetObjectにかかる時間はRAM 3GBで128KBで50ms強、10MBで150ms強。1GBでもさほど変わらなさそう。
  • lambdaのメモリ量が読み出し速度への影響度が大きい。AWS LambdaのFAQより以下内容参照。
    Q: コンピューティングリソースはどのように AWS Lambda 関数に割り当てられるのですか? AWS Lambda のリソースモデルでは、お客様が関数に必要なメモリ量を指定すると、 それに比例した CPU パワーとその他のリソースが割り当てられます。 例えば、256 MB のメモリを指定した場合に Lambda 関数に割り当てられる CPU パワーは、 128 MB のメモリを指定した場合の約 2 倍となり、512 MB のメモリを指定した場合の約半分となります。 詳細については、関数の設定に関するドキュメントをご覧ください。