AWS SAA(Solutions Architect - Associate)対策

Lambdaの適用判断

このレッスンでできるようになること

要件の文から実行時間と同時実行の制約を拾い、「これは Lambda で組む」「これは Lambda にしない」を根拠つきで言い切れるようになります。SAA では、サーバーレスが常に正解ではない問題が必ず出ます。

まず要件を読む

ある動画配信の会社が、2つの処理を AWS へ移そうとしています。

1つ目は、ユーザーが画像をアップロードしたときにサムネイルを作る処理です。1件あたり数秒で終わり、アップロードは日中に不規則に発生します。

2つ目は、投稿された動画を複数の解像度へ変換する処理です。長い動画だと 1 件に 3 時間ほどかかります。

社内では「どちらもイベント駆動なので Lambda で作ろう」という案が出ています。この案の片方は正しく、もう片方は動きません。どこで線を引くかがこのレッスンです。

Lambda にしない判断をする境界

本記事執筆時点で、試験に出る境界は次のとおりです。数字そのものより、何を超えると別のサービスになるかを覚えます。

制約本記事執筆時点の上限超えたときの行き先
1 回の実行時間15 分AWS Batch、ECS や Fargate のタスク、Step Functions での分割
リージョンあたりの同時実行数既定 1000(引き上げ申請が可能)予約設定で配分するか、キューで流量を抑える
一時ディスク領域10 GBEFS をマウントする、または EC2 や Fargate へ
同期呼び出しのペイロード6 MBS3 に置いて場所だけ渡す

冒頭のサムネイル生成は数秒なので Lambda が素直です。動画変換は 3 時間かかるので、15 分の壁に当たって完走しません。ここは Fargate のタスクや AWS Batch に出します。「イベント駆動だから Lambda」ではなく、1 回の処理が 15 分で終わるかで切ります。

同時実行の制約が問題になる場面

Lambda は呼ばれた数だけ並列に立ち上がります。これは強みですが、後ろに RDS のようなコネクション数に限りがあるものがいると、そのまま接続を食い潰します。要件文に「データベースの接続が枯渇した」「下流のシステムが過負荷になった」とあれば、次の道具を選びます。

  • 予約済み同時実行 — その関数が使える上限を決める。下流を守り、同時に他の関数の枠を奪わないようにする
  • SQS を挟む — 押し寄せたイベントをいったん貯めて、決めた速さで処理する
  • RDS Proxy — 接続をプールして使い回し、DB 側の接続数を抑える

逆に「最初の呼び出しだけ応答が遅い」「レイテンシを一定にしたい」という要件はコールドスタートの話で、答えはプロビジョニングされた同時実行です。予約済み同時実行と名前が似ていますが、上限を決めるものと、あらかじめ温めておくもので役割が違います。ここは試験で入れ替えて出されます。

要件語から構成への対応

要件の言い回し選ぶもの
数秒から数分で終わる / 呼ばれた回数分だけ払いたいLambda
1 回の処理に数時間かかるAWS Batch、ECS や Fargate
長い処理を分割して順に流したいStep Functions
下流の DB が接続過多で落ちる予約済み同時実行、SQS、RDS Proxy
最初のリクエストだけ遅い / 応答時間を一定にプロビジョニングされた同時実行
サーバーを常時起動しておきたくない、断続的な負荷Lambda
常時高い負荷が続くコンテナや EC2 のほうが安くなりうる

よくある引っ掛け

その1 「Lambda のタイムアウトを延ばす」選択肢。 設定値は上限の範囲でしか延ばせないので、3 時間の処理はどう設定しても終わりません。実行時間が上限を超える問題は、設定ではなくサービスの選び直しで解きます。

その2 「メモリを増やせば同時実行の問題が解決する」選択肢。 メモリを増やすと 1 回の処理は速くなりますが、下流の接続数が枯渇している問題には効きません。むしろ処理が速く回る分だけ流量が増えることもあります。

まとめ

  • 1 回の実行が本記事執筆時点で 15 分を超えるなら Lambda にしない
  • 長時間の処理は Batch や Fargate へ、分割できるなら Step Functions へ
  • 下流を守るのは予約済み同時実行、SQS、RDS Proxy
  • コールドスタート対策はプロビジョニングされた同時実行。役割を取り違えない
  • 断続的な負荷ほどサーバーレスが効き、常時高負荷ではコンテナのほうが安くなりうる
生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部

復習ミニクイズ

ある企業が、アップロードされた動画を複数の解像度へ変換するバッチ処理を AWS 上で実行しようとしています。1 本あたりの変換には最長で 3 時間かかり、変換はアップロードのたびに不定期で発生します。サーバーの運用は極力減らしたい、という要件があります。最も適した構成はどれですか。