バッチ処理 - kocya-dev/note GitHub Wiki
サービス選定
代表的なサービス | 判断材料 |
---|---|
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 のメモリを指定した場合の約半分となります。 詳細については、関数の設定に関するドキュメントをご覧ください。