AWS Lambda

AWS Lambda は、サーバーを用意せずにコード(関数)を実行できるサーバーレスのコンピューティングサービスです。ファイルのアップロードや API の呼び出しなどの「イベント」をきっかけに関数が動き、使った分だけ料金がかかります。SAA では、イベント駆動型の設計、実行時間やメモリの上限、同時実行数の扱いが頻出です。

ひとことで言うと: 通常のオンデマンド実行では、Lambda は「呼ばれたときに働き、実行した分を払う作業員」です。

たとえるなら、常駐の社員(EC2)ではなく、仕事が来たときに必要な人数だけ働く派遣スタッフです。オンデマンド実行では処理のない時間に実行時間分の料金はかかりません。ただし、プロビジョニング済み同時実行の待機料金やストレージなど、別の料金が発生する場合があります。1 回の仕事は最大 15 分です。

このページで押さえる論点

サーバーレスとイベント駆動、料金の考え方

サーバーレスとは、サーバーが存在しないという意味ではなく、サーバーの用意・OS の更新・台数の増減を AWS に任せられるという意味です。Lambda では、関数のコードと設定(メモリ量、タイムアウトなど)を登録するだけで、リクエストが増えれば AWS が自動で実行環境を増やします。

イベント駆動型アーキテクチャとは、「何かが起きた(イベント)」ことをきっかけに処理を動かす設計です。たとえば「S3 に画像がアップロードされたら、Lambda がサムネイル画像を作る」「API Gateway にリクエストが来たら、Lambda が DynamoDB からデータを返す」といった形です。処理と処理が直接呼び合わないので、疎結合になり、部品ごとに独立して増減できます。試験ガイドでも「イベント駆動型、マイクロサービス、多層アーキテクチャを設計する」「サーバーレスを使う場面を判断する」ことが求められます。

料金の考え方

通常の関数の料金はリクエスト数と実行時間で決まります。実行時間は 1 ミリ秒単位で切り上げて計算され、割り当てたメモリが大きいほど単価が上がります(GB 秒という単位)。オンデマンド実行では処理のない時間に実行時間分の料金はかからないため、アクセスがまばら・予測できないワークロードほど、常時起動の EC2 より安くなりやすいのが特徴です。AWS の料金ページでは、毎月 100 万リクエストと 40 万 GB 秒の無料利用枠を案内しています。プロビジョニング済み同時実行や追加ストレージなどは別料金です。Compute Savings Plans は Lambda にも適用されます。

Lambda の上限値

項目値試験での使いどころ
タイムアウト(1 回の実行時間)最大 900 秒(15 分)15 分を超える処理は Lambda では動かせない。Fargate、AWS Batch、EC2 を選ぶか、Step Functions で処理を分割する
メモリ128 MB〜10,240 MB(1 MB 単位)CPU はメモリに比例して割り当てられる
一時ストレージ(/tmp)512 MB〜10,240 MB実行中に一時ファイルを置く場所。永続的に残したいデータは S3 や EFS に保存する
呼び出しのペイロード同期: リクエスト・レスポンスとも 6 MB、非同期: 1 MB大きなデータは S3 に置き、その場所だけを渡す
デプロイパッケージ.zip は直接アップロード時 50 MB、展開後 250 MB(レイヤー含む)。コンテナイメージは 10 GB(非圧縮)50 MB を超える zip は S3 経由でアップロードする。大きなライブラリはコンテナイメージも選べる
環境変数合計 4 KB接続先などの設定を渡す。秘密情報は Secrets Manager などで管理する
レイヤー1 関数あたり 5 個複数の関数で共通のライブラリを共有する
同時実行数リージョンごとに既定 1,000(引き上げ申請が可能)上限を超えたリクエストはスロットリングされる

この表の同期リクエストとレスポンスの 6 MB は、通常のバッファ応答の上限です。レスポンスストリーミングを使う場合は、応答を最大 200 MB まで返せます。非同期呼び出しのペイロードの上限は、以前は 256 KB でしたが、現在の公式の値は 1 MB です。古い問題集では 256 KB と書かれていることがあるので注意してください。

呼び出し方の 3 種類と失敗時の扱い

Lambda 関数の呼び出され方は、大きく 3 種類あります。どの種類かによって、失敗したときの再試行の仕組みが変わります。

呼び出し方動き代表的な呼び出し元
同期呼び出し呼び出し元は関数の処理が終わるのを待ち、結果を受け取る。失敗時の再試行は呼び出し元が行うAPI Gateway、関数 URL、SDK からの呼び出し
非同期呼び出しLambda がイベントをキューに入れてすぐに応答(ステータスコード 202)を返し、あとで関数を実行する。関数がエラーになると Lambda が再試行するS3、SNS
イベントソースマッピングLambda がキューやストリームを読みに行き(ポーリング)、レコードをまとめて(バッチで)関数に渡すSQS、Kinesis、DynamoDB ストリーム、Amazon MQ、Amazon MSK
再生型アニメ図解

同期・非同期・イベントソースマッピングの違い

API GW S3 キュー SQS ポーリング Lambda ✓ 応答 ✓ 202 受付 ✕ エラー 再試行 2 回 ✓ まとめて処理

※簡略化しています: 非同期呼び出しのキューは Lambda の内部にあり、利用者からは見えません。スロットリング時の再試行(最大 6 時間)、失敗時の送信先、SQS から取り出したメッセージの削除は図では省略しています。

非同期呼び出しの再試行と失敗時の送信先

非同期呼び出しで関数がエラーになると、Lambda は既定でさらに 2 回再試行します(1 回目と 2 回目の間は 1 分、2 回目と 3 回目の間は 2 分待ちます)。スロットリングなどで実行できなかった場合は、既定で最大 6 時間、再試行を続けます。再試行の回数やイベントを保持する時間は短くすることもできます。

それでも処理できなかったイベントを残す方法は 2 つあります。

再試行があるため、同じイベントで関数が 2 回以上実行されることがあります。関数は、同じイベントを重ねて処理しても結果が変わらない作りにしておきます。

イベントソースマッピングとトリガーの違い

S3 や SNS は、イベントが起きると自分から Lambda を呼び出します(トリガー)。一方、SQS や Kinesis のようなキュー・ストリームは、Lambda の側が読みに行き、複数のレコードをまとめて 1 回の実行で処理します(イベントソースマッピング)。まとめる件数(バッチサイズ)や、まとめるまで待つ時間(対象ソースに応じて最大 300 秒)を設定できます。

SQS では、関数がバッチ内の 1 件でも失敗すると、既定ではバッチ全体が可視性タイムアウト後に再配信されます。成功したメッセージまで再処理したくない場合は、部分バッチ応答を有効にし、失敗したメッセージだけを再試行させます。キューの可視性タイムアウトは、関数タイムアウトの少なくとも 6 倍にバッチウィンドウを加えた値を目安にします。何度も処理に失敗したメッセージを隔離するには、SQS キュー側の再配信ポリシーとSQS DLQを設定します。これは Lambda の非同期呼び出しに設定する DLQ/送信先とは別の仕組みです。

同時実行数

同時実行数とは、ある瞬間に並行して処理しているリクエストの数です。目安は次の式で求められます。

同時実行数 = 1 秒あたりのリクエスト数 × 1 回の平均実行時間(秒)

たとえば毎秒 100 件のリクエストがあり、1 回 0.5 秒かかるなら、同時実行数は 50 です。同時実行数は、リージョン内のすべての関数の合計で既定 1,000 が上限です。上限を超えたリクエストはスロットリング(実行を断られること)されます。同期呼び出しなら呼び出し元にエラーが返り、非同期呼び出しなら Lambda が再試行します。

操作できるシミュレーター

リクエスト数と実行時間から同時実行数を計算する

リクエスト数・実行時間・予約同時実行数を変えると、必要な同時実行数と、上限を超えてスロットリングされる量が変わります。アカウントの上限は既定の 1,000 としています。

目盛り: 左端 0 〜 右端 1,500

※簡略化しています: リクエストが一定の速さで届き、実行時間も毎回同じと仮定しています。ほかの関数が使っている同時実行数、同時実行数が増えていく速さの上限、プロビジョニング済み同時実行は省略しています。

図で省略した点を補足します。同時実行数は、関数ごとに 10 秒あたり 1,000 の実行環境のペースで増やせます。また、1 秒あたりのリクエスト数にも、同時実行数の上限の 10 倍(既定では毎秒 10,000 件)という上限があります。

予約同時実行とプロビジョニング済み同時実行

項目予約同時実行プロビジョニング済み同時実行
目的その関数用に同時実行数を確保し、同時にそれ以上は使わせない実行環境をあらかじめ初期化して待機させ、設定数の範囲でコールドスタートを抑える
上限を超えたとき設定値がその関数の上限となり、超過分はスロットリングされるプロビジョニング済みの枠を使い切ると、予約同時実行が設定されていればその上限内の通常実行環境へあふれる。予約同時実行がなければ未予約枠を使う。追加枠ではコールドスタートが起こりうる
料金追加料金なし追加料金あり
使う場面重要な関数の枠を確保する/ほかの関数が枠を使い切らないよう制限する/データベースなど後段が耐えられる数に抑える応答の遅れが許されない API、決まった時間にアクセスが集中する処理

予約同時実行を設定すると、その関数が使える数の上限にもなります。アカウント全体の上限が既定の 1,000 の場合、通常は 100 を未予約の関数用に残すため、予約できる合計は 900 までです。予約同時実行も設定している場合、プロビジョニング済み同時実行はその予約枠内に設定します。プロビジョニング済みの枠を超えたリクエストは、通常の同時実行枠へあふれる場合があります。予約上限やアカウント上限に達していればスロットリングされます。

コールドスタートと、その対策

Lambda が新しい実行環境を用意するときは、コードのダウンロード、ランタイムの起動、関数の初期化コード(ハンドラーの外に書いた処理)の実行が必要です。この準備の時間をコールドスタートと呼び、その回の応答が遅くなります。処理が終わった実行環境はしばらく残り、次のリクエストで再利用されます(ウォームスタート)。この場合、初期化は繰り返されません。

メモリの設定と性能・コスト

Lambda では CPU を直接指定できず、メモリの量に比例して CPU が割り当てられます。メモリ 1,769 MB で 1 vCPU 相当です。そのため、CPU を多く使う処理が遅いときは、メモリを増やすと速くなります。メモリを増やすと 1 ミリ秒あたりの単価は上がりますが、実行時間が短くなるので、合計の料金が変わらない、または下がることもあります。試験ガイドでも「Lambda のメモリ量など、適切なリソースのサイズを選ぶ」ことが挙げられています。

適切なメモリ量を探すには、AWS Compute Optimizer の推奨を使えます(x86_64 アーキテクチャの関数が対象です)。

アクセス権限と VPC 内のリソースへの接続

2 種類の権限

VPC 内のリソースへの接続

Lambda 関数は、既定では AWS が管理する VPC の中で動き、インターネットにアクセスできます。プライベートサブネットにある RDS などに接続したいときは、関数を自分の VPC にアタッチします(サブネットとセキュリティグループを指定)。Lambda は Hyperplane ENI というネットワークインターフェースを自動で作って VPC につなぎます。実行ロールには、ネットワークインターフェースを作成する権限(AWSLambdaVPCAccessExecutionRole など)が必要です。

VPC にアタッチした関数は、既定ではその VPC から到達できるリソースへ接続します。パブリックサブネットを選んだだけではインターネットに出られず、関数にもパブリック IP アドレスは付きません。インターネットに出る必要があるなら、プライベートサブネットから NAT ゲートウェイ経由で経路を作ります。S3 や DynamoDB などの AWS サービスだけに接続するなら、VPC エンドポイントを使う方法もあります(「VPC 接続」のページを参照)。

データベースへの大量接続と RDS Proxy

Lambda は同時実行数が増えると、実行環境ごとにデータベースへ接続を作るため、RDS の接続数があふれることがあります。Amazon RDS Proxy を間に置くと、データベースへの接続をプールして共有・再利用できるので、接続の作りすぎを防げます。フェイルオーバー時にもアプリの接続を保ったままスタンバイに切り替えられます。

なお、よく使われるサーバーレスアプリケーションのひな形は、AWS Serverless Application Repository で検索・デプロイ・公開できます。

Lambda・Fargate・EC2 の使い分け

サービス管理するもの向いている処理注意点
AWS Lambdaコード(関数)だけイベントをきっかけに動く短い処理、アクセスがまばら・急増するもの1 回の実行は最大 15 分。コールドスタートがある
AWS Fargateコンテナイメージとタスクの設定15 分を超える処理や常時動くアプリを、サーバー管理なしで動かすコンテナ化が必要。GPU は使えない
Amazon EC2OS から上すべてOS やハードウェアの細かい指定が必要な処理、常に高い負荷がかかる処理パッチ適用や台数の管理が必要

「運用の手間を最小に」「サーバーの管理をしたくない」なら、まず Lambda が候補です。ただし 15 分を超える処理なら Fargate、コンテナの詳しい選び方は「コンテナ」のページで扱います。複数の Lambda 関数を順番どおりに実行し、途中の失敗も扱いたい場合は、AWS Step Functions でワークフローとして組み立てます。

問題文のキーワード → 選ぶべき答え

問題文の言い回し選ぶべき答えと理由
「サーバーを管理したくない」「イベントが発生したときだけ処理」「アクセスがまばら」AWS Lambda。使った分だけの料金で、自動で増減する
「処理に 30 分かかる」「長時間のバッチ」Lambda は不可(最大 15 分)。Fargate、AWS Batch、EC2 を選ぶ
「S3 にファイルが置かれたら処理」S3 のイベント通知で Lambda を呼び出す(非同期呼び出し)
「非同期処理で失敗したイベントを残して調べたい」失敗時の送信先(Destinations)またはデッドレターキュー
「SQS のメッセージを Lambda でまとめて処理」イベントソースマッピング(Lambda がポーリングしてバッチで渡す)。一部失敗なら部分バッチ応答で失敗分だけを再試行
「初回の応答が遅い」「レイテンシーを常に低く」プロビジョニング済み同時実行(Java・Python・.NET なら SnapStart も)
「重要な関数が、ほかの関数に同時実行数を使い切られてスロットリングされる」予約同時実行で枠を確保する
「Lambda からの接続でデータベースの接続数があふれる」RDS Proxy で接続をプールする。予約同時実行で上限を抑える方法もある
「CPU を多く使う処理が遅い」メモリを増やす(CPU はメモリに比例して割り当てられる)
「VPC にアタッチした Lambda からインターネットの API を呼びたい」プライベートサブネット + NAT ゲートウェイ
「Lambda から S3 にアクセスする権限を安全に渡す」実行ロール(アクセスキーをコードに書かない)

引っかけポイント

まとめ: SAA 試験で押さえるポイント

確認問題

参考リンク

AWS 公式ドキュメント(外部サイトが開きます)。本文の数値はこれらで確認しています。