+ 作るログイン
1 / 19
AWS でサービスを作る ― 知識ゼロから、構成を自分で考えられるまで / 全32章

AWS 22:サーバーレス ― Lambda と API Gateway

発行
アニメモ公式
版
第2版
改訂
コマ
全19

コンテナにしても、誰もいない夜中にタスクは動き続け、その分を払っています。呼ばれたときだけ動いて使った分だけ払う Lambda の考え方、イベントで動く仕組み、コールドスタートと同時実行、時間やメモリの決まりごと、料金の数え方、API Gateway の種類、RDS とつなぐときの注意、そしてフォトログの写真の縮小を例に、EC2 やコンテナとどう使い分けるかを説明します。

誰もいない夜中にも、タスクは動いている

第21章で、フォトログの Web は ECS on Fargate のタスクになりました。OS の世話は AWS に任せられ、新しい版もイメージのタグ1つで届けられます。

それでも、料金の請求を見ると気になる点があります。

図の青い棒は、フォトログに1日のうちに来るリクエスト(利用者からの求め)の数です。夜中の2時〜6時はほとんど誰も来ません。昼から夜にかけて大きく増えます。

一方、黄色い横線はタスクの料金です。第21章で「最小2つ」と決めたタスクは、誰も来ない夜中にも動き続け、同じ料金がかかっています。

困りごと何が起きているか
夜中の料金利用者がほぼ0でも、最小の数のタスクの料金は0にならない
たまにしか起きない仕事写真の縮小は1日数百回、1回2秒ほど。そのためにずっと何かを起こしておくのはもったいない
作ったばかりのサービス利用者がまだ少ないうちから、常に動く構成の料金を払う

もし「リクエストが来たときだけ動いて、動いた時間の分だけ払う」ことができれば、夜中の料金はほぼ0になり、たまにしか起きない仕事も安く済みます。

この章では、それを実現する サーバーレス の代表、AWS Lambda と、その入口になる Amazon API Gateway を学びます。

※2026年9月時点の情報です。画面・料金・細部は変わることがあります。

  • AWS でサービスを作る 22 ― サーバーレス:Lambda と API Gateway
  • 1 / 19
  • 誰もいない夜中にも、タスクは動いている
  • フォトログのリクエスト数(1日)
  • 月
  • 夜中はほぼ空っぽ
  • それでも最低2つのタスク
  • タスク2つ分の料金(ずっと同じ)
  • 写真
  • 写真の縮小
  • 1日数百回・1回2秒ほど
  • 「来たときだけ動いて、 動いた分だけ払う」ことはできないか
  • 0時
  • 12時
  • 24時
  • ひらめき
  • 利用者の数は1日で大きく波打つ。でも、常に動かすタスクやサーバーの料金は平らなまま。

一言でいうと:乗った分だけ払うタクシー

移動の手段にたとえてみます。

部品たとえ払い方世話
EC2(第9章)自家用車持っている間ずっと整備も自分
ECS on Fargate(第21章)レンタカー借りている間整備はお店、運転は自分
Lambdaタクシー乗った分だけ。乗らなければ0円車も運転も任せる

Lambda(ラムダ)は、関数(ある入力を受けて、決まった仕事をして、結果を返す小さなプログラム)を AWS に預けておくと、呼ばれたときだけ動かしてくれるサービスです。

サーバーレスという言葉は「サーバーが無い」という意味ではありません。裏ではもちろん AWS のサーバーが動いています。意味は次の2つです。

サーバーレスの意味内容
サーバーを見なくてよいOS やランタイムの更新、台数の増減、複数の AZ(第2章)への配置は AWS の仕事
待っている時間に払わない呼ばれていない間は、基本的に料金がかからない

Lambda の他にも、S3(第15章)・DynamoDB(第23章)・SQS(第24章)など、「台数を決めずに、使った分だけ払う」部品をまとめてサーバーレスと呼ぶことがあります。

  • AWS でサービスを作る 22 ― サーバーレス:Lambda と API Gateway
  • 2 / 19
  • 一言でいうと:乗った分だけ払うタクシー
  • サーバー
  • EC2
  • 荷物
  • ECS on Fargate
  • 電気
  • Lambda
  • = 自家用車
  • = レンタカー
  • = タクシー
  • 持っている間ずっと払う。 整備も自分
  • 借りている間は払う。 整備はお店
  • 乗った分だけ払う。 乗らなければ0円
  • 払う時間(1日)
  • 払う時間(1日)
  • 払う時間(1日)
  • Lambda(ラムダ)は、関数(小さなプログラム)を預けておくと、呼ばれたときだけ AWS が動かしてくれるサービス
  • OS・ランタイムの更新、台数の増減、2つ以上の AZ への配置は、すべて AWS の仕事
  • ひらめき
  • サーバーレス=サーバーが無いのではなく、サーバーを見なくてよく、待っている時間に払わないこと。

何かが起きたら動く:イベント駆動

EC2 やタスクは、ずっと起きてリクエストを待っています。Lambda は違います。自分からは動かず、何かが起きたときに呼ばれて動きます。この「何かが起きた」という知らせをイベント、イベントで動く作り方をイベント駆動と呼びます。

図の左は、Lambda を呼べるイベントの例です。

イベントの出どころどんなときに呼ぶかフォトログの例
API GatewayHTTP のリクエストが来たときアプリが「いいね」を送った
S3ファイルが置かれた・消されたとき利用者が写真を上げた
SQS(第24章)キューにメッセージが入ったとき通知を送る仕事がたまった
EventBridge決まった時刻になったとき・他のサービスで何か起きたとき毎朝9時に前日の集計をする

呼ばれた関数は、仕事をして、DB に書いたり、結果を返したりして終わります。

このように「何かが起きた → 関数が動く」をつないでいくと、ずっと起きているサーバーを持たずに、サービスの一部を組み立てられます。他にも、DynamoDB の変更(第23章)、CloudWatch のアラーム(第17章)、Cognito のログイン(第26章)など、多くの AWS のサービスが Lambda を呼べます。

  • AWS でサービスを作る 22 ― サーバーレス:Lambda と API Gateway
  • 3 / 19
  • 何かが起きたら動く:イベント駆動
  • リンク
  • API Gateway
  • データベース
  • DB に書く
  • HTTP
  • フォルダ
  • S3
  • 電気
  • 置かれた
  • メール
  • Lambda 関数
  • SQS(第24章)
  • メッセージ
  • 送信
  • 結果を返す
  • 時計
  • EventBridge
  • 時刻
  • ひらめき
  • Lambda は自分からは動かない。「リクエストが来た」「写真が置かれた」などのイベントで呼ばれる。

1回の呼び出し:イベントを受け取り、結果を返す

Lambda で書くのは、handler(ハンドラー=受け口)と呼ばれる関数1つです。

図の流れを追ってみます。

順番起きること
1左のイベントが届く。S3 に写真が置かれたなら、バケット名と写真の名前(キー)が入っている
2真ん中の handler が呼ばれ、event にその中身が渡される
3handler は写真を読み、縮小し、保存する
4結果({ ok: true })を返して終わる

Lambda が対応しているランタイム(第21章)は、Node.js・Python・Java・.NET・Ruby などです。第21章のようなコンテナのイメージで関数を配ることもできます。

大事なのは、1回の呼び出しで完結させることです。handler の外に書いた準備(DB への接続を開くなど)は、次の呼び出しで使い回されることがあり、速さの工夫として使われます。でも、それは「たまたま残っていた」だけです。

置いてよいもの置いてはいけないもの
使い回せたら速くなる準備(接続・設定の読み込み)利用者のログイン状態、途中までの計算結果、アップロードされたファイル

覚えておきたいことは DB や S3 に置きます。第12章で学んだステートレスの考え方が、Lambda ではいっそう大事になります。

  • AWS でサービスを作る 22 ― サーバーレス:Lambda と API Gateway
  • 4 / 19
  • 1回の呼び出し:イベントを受け取り、結果を返す
  • イベント(届く中身)
  • handler(あなたが書く)
  • {
  • export const handler = async (event) => {
  • "bucket": "photolog-raw",
  • const img = await load(event.key);
  • OK
  • "key": "u1/p9.jpg"
  • const small = await resize(img);
  • }
  • await save(small);
  • 結果
  • return { ok: true };
  • { ok: true }
  • };
  • handler の外(上)に書いた準備(DB への接続など)は、次の呼び出しで使い回されることがある
  • でも「必ず残る」保証はない。覚えておきたいことは DB や S3 に置く(ステートレス、第12章)
  • ひらめき
  • 書くのは handler(受け口)という関数1つ。イベントの中身を読んで仕事をし、結果を返して終わる。

コールドスタート:最初の1回は、準備の分だけ遅い

Lambda は、呼ばれると実行環境(関数を動かすための小さな箱)を用意して、その中で handler を動かします。

図の3つの段を見てください。

段起きること
1回目新しい実行環境を作り、ランタイムを起動し、コードを読み込む準備(INIT)が入ってから、処理(INVOKE)をする。これをコールドスタートと呼ぶ
2回目1回目の環境がまだ残っていれば、準備なしですぐ処理に入る(温まった状態)
しばらく呼ばれない環境は片付けられ、次はまたコールドスタートから

準備にかかる時間は、ランタイムやコードの大きさによって、数十ミリ秒から数秒までさまざまです。写真の縮小のような裏側の仕事なら気になりませんが、利用者が画面の前で待っている API だと、たまに遅い応答として見えます。

減らす方法は次のとおりです。

方法内容
小さく保つ要らないライブラリを入れない。準備の時間が短くなる
SnapStart準備が済んだ状態を写し取っておき、そこから再開する。Java・Python・.NET の一部の版で使える
プロビジョニングされた同時実行決めた数の環境を、あらかじめ温めておく。その分は呼ばれなくても料金がかかる

なお、2025年8月から、準備(INIT)の時間もすべての関数で料金の対象になりました。準備を短くすることは、速さだけでなくお金の面でも得です。

  • AWS でサービスを作る 22 ― サーバーレス:Lambda と API Gateway
  • 5 / 19
  • コールドスタート:最初の1回は、準備の分だけ遅い
  • 1回目 (コールドスタート)
  • 準備(INIT):環境を作り、コードを読む
  • 処理(INVOKE)
  • 2回目 (温まった環境)
  • 処理(INVOKE)
  • すぐ始まる
  • しばらく 呼ばれないと
  • 環境は片付けられ、次はまた 1 から
  • 減らす方法:コードと依存を小さくする・SnapStart(Java・Python・.NET)・プロビジョニングされた同時実行
  • 準備の時間も料金の対象(2025年8月から、すべての関数でそろった)
  • ひらめき
  • 新しい実行環境を作るときは準備(INIT)が入る。使い回せれば準備なしで、すぐ処理に入れる。

同時に来たら、同時に増える

1つの実行環境は、同時に1件だけ処理します。

図のように、10件のリクエストが同時に来ると、Lambda は環境を10個に増やして、並べて処理します。第12章の Auto Scaling のように「CPU が何%になったら増やす」を書く必要はありません。来た数だけ、自動で、すぐに増えます。

この「同時に動いている環境の数」を同時実行数と呼びます。

言葉意味
同時実行数ある瞬間に処理中の呼び出しの数。1秒に100件来て、1件が0.5秒かかるなら、およそ50
同時実行数の上限アカウント・リージョンごとの上限。図の灰色の帯。既定の値は Service Quotas で確認でき、引き上げを申請できる
予約同時実行1つの関数に枠を確保する(同時に、その関数の上限にもなる)

上限に達すると、それ以上の呼び出しは断られます(スロットリング)。API Gateway 経由ならエラーが返り、S3 や SQS のように後で呼び直してくれる呼び方なら、少し待ってから再試行されます。

増えるのが速いのは Lambda の大きな長所ですが、その先の部品も同じ速さで増えられるとは限りません。この話は後の「RDS とつなぐ」で出てきます。

  • AWS でサービスを作る 22 ― サーバーレス:Lambda と API Gateway
  • 6 / 19
  • 同時に来たら、同時に増える
  • 環境 1
  • 環境 2
  • 環境 3
  • 環境 4
  • 環境 5
  • 電気
  • Lambda 関数
  • 環境 6
  • 環境 7
  • 環境 8
  • 環境 9
  • 環境 10
  • 同時実行数の上限(アカウント・リージョンごと)
  • 上限に達すると、それ以上は断られる(あとで再試行される呼び方もある)
  • 上限の値は Service Quotas で確認し、足りなければ引き上げを申請する
  • ひらめき
  • 1つの実行環境は、同時に1件だけ処理する。10件同時に来たら、環境が10個に増える。

Lambda の決まりごと:長い仕事・大きな仕事は苦手

Lambda には、使う前に知っておくべき決まりごとがあります。

項目決まり意味すること
1回の実行時間最長15分(900秒)。延ばせない長い動画の変換や大きな集計はそのままでは無理
メモリ128 MB 〜 10,240 MBCPU はメモリに比例して割り当てられる。重い計算はメモリを増やすと速くなる
一時ディスク(/tmp)既定 512 MB、最大 10,240 MB作業用。呼び出しをまたいで残る保証はない
同期で渡せるデータリクエスト・レスポンスとも 6 MB まで大きな写真そのものは渡さず、S3 に置いて「場所」を渡す
タイムアウトの既定3秒作ったまま使うと、重い処理が途中で切られる

15分を超える仕事は、次のどれかで分けます。

方法章
Step Functions で、仕事を小さな段に分けてつなぐ第24章
ECS のタスク(第21章)を1回だけ起動して動かす第21章
仕事をキューに分けて、何回にも分けて処理する第24章

細かい値は変わることがあるので、実際に使うときは公式ドキュメントの「Lambda クォータ」で確かめてください。

  • AWS でサービスを作る 22 ― サーバーレス:Lambda と API Gateway
  • 7 / 19
  • Lambda の決まりごと:長い仕事・大きな仕事は苦手
  • 1回の実行時間
  • 最長 15分(900秒)。延ばせない
  • メモリ
  • 128 MB 〜 10,240 MB。CPU はメモリに比例して増える
  • 一時ディスク /tmp
  • 512 MB(既定)〜 10,240 MB
  • 同期で渡せる大きさ
  • リクエスト・レスポンスとも 6 MB まで
  • 状態
  • 呼び出しをまたいで残る保証はない
  • 長い処理は Step Functions(第24章)で小分けにするか、ECS のタスク(第21章)で動かす
  • 最新の値は公式の「Lambda クォータ」で確認する
  • ひらめき
  • 1回は最長15分。メモリは最大 10 GB ほど。長い処理や、ずっとつなぎっぱなしの処理には向かない。

料金:呼ばれた回数 + メモリ × 動いた時間

Lambda の料金は、2つの足し算です。

課金の単位数え方
リクエスト数呼ばれた回数。100万回ごとの単価
実行時間割り当てたメモリ(GB)× 動いた時間(秒)。GB 秒と呼ぶ。時間はミリ秒単位で数える

たとえば、メモリ 1 GB の関数が 2秒動けば 2 GB 秒、512 MB(0.5 GB)の関数が 2秒動けば 1 GB 秒です。

毎月の無料枠は「100万リクエストと 40万 GB 秒」で、これは12か月で切れる無料枠ではなく、期限なく毎月使えます。フォトログの写真の縮小(1日数百回・1回2秒・1 GB)なら、この枠の中に収まる計算です。

気をつける点もあります。

点内容
メモリを増やすとGB 秒の単価は上がるが、CPU も増えて早く終わり、結果として安くなることもある。実際に測って決める
Arm(Graviton)同じ仕事なら x86 より単価が低い。ランタイムが対応していれば選ぶ価値がある
周りの部品API Gateway のリクエスト、CloudWatch Logs のログ、データ転送は別に課金される

単価はリージョンで違うので、Pricing Calculator(第4章)で試算し、料金ページで確認しましょう。

  • AWS でサービスを作る 22 ― サーバーレス:Lambda と API Gateway
  • 8 / 19
  • 料金:呼ばれた回数 + メモリ × 動いた時間
  • 送信
  • リクエスト数
  • 時計
  • +
  • メモリ(GB)× 実行時間(秒)
  • 100万回ごとの単価
  • 1 GB で 1秒動けば「1 GB 秒」。ミリ秒単位で数える
  • 毎月の無料枠
  • 100万リクエストと 40万 GB 秒(期限なし)
  • メモリを増やすと
  • 単価は上がるが、CPU も増えて速く終わることがある
  • Arm(Graviton)
  • 同じ仕事なら x86 より安い単価
  • ひらめき
  • 払うのは「リクエスト数」と「メモリの大きさ×実行時間(ミリ秒単位)」。呼ばれなければ0円。

いつ安いか:少ないうちは Lambda、ずっと多いなら常駐

Lambda は「使った分だけ」なので、いつでも一番安いように思えます。でも、そうとは限りません。

図のグラフは、横がリクエスト数、縦が月の料金です。

線形理由
青(常駐:タスク2つ)平ら来ても来なくても、動いている時間の分を払う
黄(Lambda)右上がり呼ばれた回数と時間に比例して増える

リクエストが少ないうちは、Lambda のほうがずっと安くなります。でも、一日中たくさんのリクエストが来ると、どこかで線が交わり(赤い印)、それを超えると常駐しているタスクやサーバーのほうが安くなることがあります。常駐のほうは、1つのタスクが同時にたくさんのリクエストをさばけるからです。

どちらが安いかは、リクエストの数・1回の長さ・メモリで変わります。「サーバーレスだから安い」と決めつけず、Pricing Calculator(第4章)で両方を計算してみましょう。

料金だけでなく、人の手間も比べてください。OS の更新・台数の調整・監視の手間が減ることは、請求書には出ない大きな節約です。

  • AWS でサービスを作る 22 ― サーバーレス:Lambda と API Gateway
  • 9 / 19
  • いつ安いか:少ないうちは Lambda、ずっと多いなら常駐
  • 月の料金
  • OK
  • 夜は空く・波が大きい
  • OK
  • たまにしか起きない仕事
  • 目標
  • 常駐(タスク2つ)
  • OK
  • 作りたて・利用者が少ない
  • Lambda(使った分)
  • NG
  • 一日中ずっと多い
  • NG
  • 1回が長く重い
  • リクエスト数 →
  • ひらめき
  • 少ない・波が大きいなら Lambda が安い。一日中多いなら常駐のほうが安いこともある。

API Gateway:HTTP の受付係

Lambda をアプリやブラウザから HTTP(ブラウザとサーバーが話すときの約束事)で呼ぶには、入口が要ります。その代表が Amazon API Gateway です。

API Gateway は、ホテルのフロントのような受付係です。

受付の仕事内容
道順(ルート)「GET /photos は一覧の関数へ」「POST /likes はいいねの関数へ」のように、URL と HTTP の種類ごとに送り先を決める
ログインの確認トークン(第26章で説明)を確かめ、ログインしていない人を関数に通さない
流量の制限1秒あたりの回数に上限を付け、使われすぎから守る
CORS・独自ドメインブラウザから別のドメインで呼ぶための許可、api.photolog.example のような名前(第14章)

図では、アプリからの HTTPS のリクエストを API Gateway が受け、URL ごとに3つの関数へ振り分けています。第11章の ALB が「パスで振り分ける」のとよく似ています。実際、ALB も Lambda を送り先にできます。

API Gateway も、呼ばれた回数とデータ量で課金されるサーバーレスの部品です。台数や大きさを決める必要はありません。

  • AWS でサービスを作る 22 ― サーバーレス:Lambda と API Gateway
  • 10 / 19
  • API Gateway:HTTP の受付係
  • リンク
  • GET /photos
  • API Gateway
  • 電気
  • 一覧を返す
  • スマホ
  • 道順(ルート)
  • POST /photos
  • アプリ
  • HTTPS
  • ログインの確認(第26章)
  • 電気
  • 投稿を受け付ける
  • 流量の制限
  • POST /likes
  • CORS・独自ドメイン
  • 電気
  • いいねを数える
  • ひらめき
  • URL と HTTP の種類(GET・POST)ごとに、どの関数へ渡すかを決める。認証や流量の制限も受付でする。

入口の種類:HTTP API・REST API・WebSocket・関数 URL

API Gateway には種類があり、さらに Lambda 自身にも入口があります。

種類特徴選ぶとき
HTTP API機能を絞った分、安く速いふつうの API はまずこれ
REST API応答のキャッシュ、細かい利用量の制限(API キーと使用量プラン)、WAF(第27章)との連携など機能が多いHTTP API に無い機能が要るとき
WebSocket APIつなぎっぱなしで、サーバーからも送れるチャット・通知のような双方向の通信
関数 URLLambda の関数に直接 URL を付ける。追加料金なし関数1つを手早く公開したい。受付の機能はほとんど無い

気をつけたいのは、待てる時間です。API Gateway は、関数の返事を待つ時間に上限があります(REST API も HTTP API も既定でおよそ30秒。REST API の一部は申請で延ばせる)。Lambda が15分動けても、利用者を15分待たせることはできません。

長くかかる仕事は、受付で「受け取りました」とすぐに返事をして、実際の処理はキュー(第24章)に預けて後でする、という形にします。これが第24章の話につながります。

  • AWS でサービスを作る 22 ― サーバーレス:Lambda と API Gateway
  • 11 / 19
  • 入口の種類:HTTP API・REST API・WebSocket・関数 URL
  • リンク
  • HTTP API
  • 設定
  • REST API
  • 安く速い。ふつうの API はまずこれ
  • キャッシュ・細かい制限・WAF など
  • 会話
  • WebSocket API
  • 電気
  • 関数 URL
  • つなぎっぱなしで双方向(チャット)
  • Lambda に直接 URL。受付の機能は少ない
  • どれも返事を待てる時間に上限がある(既定で約30秒)。長い処理はキュー(第24章)に預けて、先に返事をする
  • ひらめき
  • 迷ったら HTTP API。細かい機能が要れば REST API。関数1つを手早く公開するだけなら関数 URL。

RDS とつなぐ:VPC に入れて、接続は RDS Proxy に束ねる

Lambda は、何も設定しなければ AWS が管理するネットワークで動き、インターネット上のものや S3・DynamoDB には届きます。でも、第16章の RDS は VPC のプライベートサブネット(第6章)にあるので、そのままでは届きません。

関数を VPC につなぐ設定をすると、関数がプライベートサブネットの中から RDS に話しかけられるようになります。セキュリティグループ(第8章)も関数に付けられます。

ここで問題になるのが接続数(第13章)です。

状況起きること
リクエストが増えるLambda の環境が数百に増える
環境ごとに DB に接続する図の赤い線のように、RDS への接続が一気に増える
RDS の接続数の上限を超える新しい接続が断られ、エラーになる

これを防ぐのが RDS Proxy です。たくさんの関数からの接続をいったん受け止め、少ない数の接続に束ねて使い回します。

対策内容
RDS Proxy関数と RDS の間に置く。接続を束ねる。パスワードは Secrets Manager(第20章)から読む
予約同時実行関数の同時実行数に上限を付け、DB に来る数を抑える
別の DB を選ぶ接続という考え方が無く、一気の増加に強い DynamoDB(第23章)

なお、VPC の中の関数からインターネットや S3 へ出るには、第7章の NAT ゲートウェイや VPC エンドポイントが必要になります。

  • AWS でサービスを作る 22 ― サーバーレス:Lambda と API Gateway
  • 12 / 19
  • RDS とつなぐ:VPC に入れて、接続は RDS Proxy に束ねる
  • VPC のプライベートサブネット
  • 環境 1
  • 電気
  • 環境 2
  • 環境 3
  • ネットワーク
  • RDS Proxy
  • データベース
  • RDS
  • Lambda 関数
  • VPC につなぐ設定
  • 環境 4
  • 接続を束ねる
  • 少ない接続で済む
  • 環境 5
  • パスワードは Secrets Manager(第20章)
  • 環境 6
  • ひらめき
  • Lambda は一気に数百に増える。そのまま RDS につなぐと、接続数(第13章)があふれる。

作り方:関数を書いて、きっかけをつなぐ

コンソールで作る場合は、左の4つの手順です。

手順することポイント
1関数を作るランタイム(Node.js など)、CPU の種類(Arm か x86)、メモリ、タイムアウトを決める
2実行ロールを付ける関数が S3 や DynamoDB を触るための IAM ロール(第3章)。最小権限で
3きっかけ(トリガー)を足すS3 のバケット、API Gateway、SQS のキュー、EventBridge のスケジュールなど
4テストして、ログを見るテスト用のイベントで動かし、CloudWatch Logs(第17章)で結果を確かめる

実務では、関数のコードと、きっかけ・ロール・設定を一緒にコードにします(第18章)。図の右は AWS CDK の例です。

行意味
runtimeNode.js 22 で動かす
codedist フォルダの中身を関数として上げる
memorySizeメモリ 1024 MB
timeout30秒で打ち切る(既定の3秒から延ばす)
addEventNotification元の写真のバケット raw にファイルが作られたら、この関数を呼ぶ

Lambda 専用の道具として AWS SAM(Serverless Application Model)もあります。関数や API をまとめて短く書け、手元で関数を試すこともできます。どちらを使っても、中で作られるのはここまでに見た部品です。

  • AWS でサービスを作る 22 ― サーバーレス:Lambda と API Gateway
  • 13 / 19
  • 作り方:関数を書いて、きっかけをつなぐ
  • チェック
  • CDK の例:写真が置かれたら縮小する関数
  • 関数を作る(メモリ・時間)
  • const fn = new lambda.Function(this, "Resize", {
  • runtime: lambda.Runtime.NODEJS_22_X,
  • チェック
  • 実行ロールを付ける(第3章)
  • handler: "index.handler",
  • code: lambda.Code.fromAsset("dist"),
  • memorySize: 1024,
  • チェック
  • きっかけ(トリガー)を足す
  • timeout: Duration.seconds(30),
  • });
  • raw.addEventNotification(s3.EventType.OBJECT_CREATED,
  • new s3n.LambdaDestination(fn));
  • チェック
  • テストして、ログを見る(第17章)
  • ひらめき
  • コンソールなら4手順。実務では CDK や SAM(第18章)で、関数ときっかけを一緒にコードにする。

フォトログでは:写真の縮小を Lambda に任せる

フォトログで一番 Lambda に向いているのは、写真の縮小です。

順番起きること
1利用者のアプリが、署名付き URL(第15章)で写真を S3 に直接上げる。Web のタスクは写真を受け取らない
2S3 の photolog-raw バケットに写真が置かれると、S3 が Lambda を呼ぶ
3関数が写真を読み、一覧用の小さな写真を作って、photolog-thumb バケットに置く。CloudFront(第15章)はここから配る

これまで、縮小を Web のタスクの中でやっていると、写真が大きいほど利用者を待たせ、投稿が集中すると Web 全体が重くなりました。Lambda に分けると、Web は写真の縮小を待たずにすぐ返事ができ、縮小は写真の数だけ自動で並んで動きます。

赤字の注意は必ず守ってください。縮小した写真を元と同じバケットに書き戻すと、その書き込みがまた「写真が置かれた」イベントになり、関数が自分を呼び続けます。Lambda には S3 との間のこうした繰り返しを検知して止める仕組みもありますが、それに頼らず、置き場所を分けるのが基本です。

フォトログの「いいね」のような小さな API も、API Gateway + Lambda で作れます。ただし、いいねは一日中たくさん来る仕事です。どちらで動かすかは、前に見た料金の線で考えます。

  • AWS でサービスを作る 22 ― サーバーレス:Lambda と API Gateway
  • 14 / 19
  • フォトログでは:写真の縮小を Lambda に任せる
  • スマホ
  • フォルダ
  • 電気
  • 写真
  • 利用者
  • 上げる
  • S3(元の写真)
  • 置かれた
  • Lambda 関数
  • photolog-raw
  • 縮小(1回2秒)
  • S3(小さな写真)
  • photolog-thumb
  • 1 利用者はアプリから直接 S3 に上げる(第15章)→ 2 S3 が Lambda を呼ぶ → 3 縮小した写真を別のバケットへ
  • ★元と同じバケットに書き戻すと、書いた写真でまた関数が呼ばれる。置き場所を必ず分ける
  • ひらめき
  • 写真が S3 に置かれたら Lambda が起動して縮小し、別のバケットへ置く。Web のタスクは待たない。

EC2・コンテナと比べる:いつ Lambda を選ぶか

第16章の EC2、第21章の ECS と並べます。

EC2・ECSLambda
動き方ずっと起きて待つ呼ばれたときだけ動く
料金起きている時間回数 + メモリ × 実行時間
1回の長さ制限なし最長15分
増え方1台・1タスクを分〜数十秒で同時に来た数だけ、すぐ
最初の応答いつも温まっているコールドスタートがある
世話OS やイメージの更新コードとランタイムの版だけ

大事なのは、どれか1つを選ぶのではなく、混ぜて使うことです。フォトログなら次のような分け方がよくあります。

仕事置き場所理由
Web の画面・よく使う APIECS on Fargate一日中来る。温まっていてほしい
写真の縮小Lambda写真が上がったときだけ。数に合わせて増える
毎朝の集計Lambda(EventBridge の時刻で起動)1日1回、数分
長い動画の変換(将来)ECS のタスク、または専用のサービス15分を超える

なお、2025年には Lambda の関数を自分の EC2 の上で動かす Lambda Managed Instances という選び方も加わりました。一日中よく使う関数を、EC2 の料金の仕組みで安く動かしたいときの選択肢です。

  • AWS でサービスを作る 22 ― サーバーレス:Lambda と API Gateway
  • 15 / 19
  • EC2・コンテナと比べる:いつ Lambda を選ぶか
  • EC2・ECS(第16・21章)
  • Lambda
  • 動き方
  • ずっと起きて待つ
  • 呼ばれたときだけ動く
  • 料金
  • 起きている時間
  • 回数 + メモリ × 実行時間
  • 1回の長さ
  • 制限なし
  • 最長15分
  • 増え方
  • 分〜数十秒で1台・1タスク
  • 同時に来た数だけ、すぐ
  • 最初の応答
  • いつも温まっている
  • コールドスタートがある
  • 世話
  • OS やイメージの更新
  • コードとランタイムの版だけ
  • ひらめき
  • イベントで短く動く仕事は Lambda。ずっと動く・長い・重い仕事は ECS や EC2。混ぜて使うのがふつう。

向く仕事・向かない仕事

Lambda に向くかどうかは、3つの問いで判断できます。

問いLambda に向く答え
1回の仕事は短いか15分以内、できれば数秒
いつも来るか、たまにかたまに、または波が大きい
何かのきっかけで起きるかファイル・メッセージ・時刻・HTTP などのイベントで起きる

3つとも当てはまれば Lambda が第一の候補です。1つでも外れたら、ECS や EC2 とも比べます。

向く向かない
写真の縮小・ファイルの変換15分を超える変換や機械学習の学習
利用者の少ない API・社内の管理画面一日中大量に来る重い API(常駐のほうが安いことが多い)
毎晩の集計・古いデータの掃除自前でつなぎっぱなしにする通信(WebSocket API を使う形なら可)
キューのメッセージの処理(第24章)コールドスタートの遅れが少しも許されない処理

迷ったときは、まず小さく Lambda で作り、利用者が増えて一日中忙しくなったら常駐に移す、という進め方もよく選ばれます。

  • AWS でサービスを作る 22 ― サーバーレス:Lambda と API Gateway
  • 16 / 19
  • 向く仕事・向かない仕事
  • 向く
  • 向かない
  • OK
  • 写真の縮小・ファイルの変換
  • NG
  • 15分を超える変換・学習
  • OK
  • 利用者の少ない API・管理画面
  • NG
  • 一日中大量に来る重い API
  • OK
  • 毎晩の集計・定期の掃除
  • NG
  • つなぎっぱなしの通信(自前)
  • OK
  • キューのメッセージの処理
  • NG
  • 応答の遅れが少しも許されない
  • ひらめき
  • 「短い・たまに・イベントで起きる」が揃えば Lambda。1つでも外れたら、他の部品も比べる。

よくある落とし穴

Lambda の事故の多くは、「一気に増える」という長所の裏返しです。

落とし穴何が起きるか防ぎ方
自分を呼び続けるS3 に書いた写真でまた関数が呼ばれ、止まらない。料金も増え続ける読み元と書き先のバケット(またはフォルダ)を分ける
RDS に直接つなぐ接続数があふれて DB ごと応答しなくなるRDS Proxy、予約同時実行、DynamoDB(第23章)
上限の取り合い1つの関数が同時実行数を使い切り、他の関数まで断られる大事な関数には予約同時実行で枠を確保する
タイムアウトが3秒のまま重い処理が途中で打ち切られ、中途半端な状態が残る処理にかかる時間を測り、余裕を持たせて設定する
パッケージが大きいコールドスタートが遅く、準備の料金もかかる要らない依存を入れない、ツールで小さくまとめる
ログを出しすぎる呼ばれた回数だけログが積もり、料金が増える出す量を絞り、ロググループの保存期間を決める(第17章)
同じイベントが2回来る同じ写真を2回処理する何回処理しても結果が同じになるように作る(第24章の冪等性)

最後の「2回来る」は、S3 や SQS のイベントでまれに起きる、仕組みの上で避けられないことです。第24章で詳しく扱います。

  • AWS でサービスを作る 22 ― サーバーレス:Lambda と API Gateway
  • 17 / 19
  • よくある落とし穴
  • NG
  • S3 に書いた写真で自分がまた呼ばれる → 無限ループ。書き込み先を分ける(検知の仕組みもある)
  • NG
  • RDS に直接つなぐ → 接続数があふれる。RDS Proxy を使うか、DynamoDB(第23章)を検討
  • NG
  • 1つの関数が同時実行の上限を使い切る → 他の関数まで止まる。予約同時実行で枠を分ける
  • NG
  • タイムアウトを既定の3秒のまま → 重い処理が途中で切られる。処理に合わせて決める
  • NG
  • パッケージが大きい → コールドスタートが遅い。要らない依存を入れない
  • NG
  • ログを出しすぎる → 呼ばれた回数だけ積もる。保存期間を決める(第17章)
  • ひらめき
  • 無限ループ・接続のあふれ・上限の取り合い。どれも「一気に増える」性質の裏返し。

片付け:きっかけ・関数・ロググループ

Lambda の関数は、呼ばれなければ料金はほとんどかかりません。それでも、練習で作ったものは次の順で消しておきます。

順番すること理由
1API Gateway の API を削除誰かに呼ばれ続けると、その分の料金がかかる
2S3 のイベント通知を外す関数だけ消すと、通知の設定が残って失敗が記録され続ける
3Lambda 関数を削除関数のバージョンも一緒に消える
4ロググループを削除関数を消しても、ログは残り続ける
5使った IAM ロールを削除使われないロールは、事故のときの抜け道になる

右の注意の3つは、呼ばれなくても時間で課金されるものです。

部品なぜ時間で課金されるか
プロビジョニングされた同時実行環境を温めて待たせている
NAT ゲートウェイ(第7章)VPC の中の関数を外へ出すために作ったもの
RDS Proxy接続を束ねる係が動き続けている

「Lambda は使わなければ0円」と思って周りの部品を残すと、請求が来て驚くことになります。

  • AWS でサービスを作る 22 ― サーバーレス:Lambda と API Gateway
  • 18 / 19
  • 片付け:きっかけ・関数・ロググループ
  • リンク
  • API Gateway の API を削除
  • 注意
  • 消し忘れで高くつくもの
  • フォルダ
  • S3 のイベント通知を外す
  • 呼ばれなくても、時間で課金される:
  • 電気
  • Lambda 関数を削除
  • プロビジョニングされた同時実行
  • 書類
  • ロググループを削除
  • NAT ゲートウェイ(第7章)
  • RDS Proxy
  • 鍵
  • 使った IAM ロールを削除
  • ひらめき
  • 関数は呼ばれなければ料金はほぼかからない。それでも、きっかけとログと入口は消しておく。

まとめ:呼ばれたときだけ動き、動いた分だけ払う

この章で学んだことをまとめます。

項目内容
サーバーレスサーバーが無いのではなく、サーバーを見なくてよく、待っている時間に払わないこと
Lambdaイベントで呼ばれる関数。1回最長15分。同時に来た数だけ環境が増える
コールドスタート新しい環境の準備の分だけ遅い。小さく保つ・SnapStart・温めておく
料金リクエスト数 + メモリ × 実行時間。呼ばれなければ0円。一日中多いなら常駐が安いことも
API GatewayHTTP の受付。ルート・ログインの確認・流量の制限。待てるのは約30秒
RDS とつなぐVPC につなぎ、RDS Proxy で接続を束ねる
いつ選ぶか短い・たまに・イベントで起きる仕事。常駐の部品と混ぜて使う

Lambda で、写真の縮小のような仕事は「来たときだけ」になりました。でも、新しい困りごとが見えてきました。

利用者が増え、いいねが一斉に押されると、Lambda は数百の環境に増えます。その一つ一つが RDS につなごうとして、接続数があふれます。RDS Proxy で束ねても、RDS 自体は1台の大きなサーバー(と待機系)なので、書き込みが増え続ければいつか限界が来ます。

「いいねの数」や「ある利用者の投稿の一覧」のような、形の決まった読み書きが、とてつもない数で来るときに向いた、別の種類のデータベースがあります。次の第23章では DynamoDB を学びます。

  • AWS でサービスを作る 22 ― サーバーレス:Lambda と API Gateway
  • 19 / 19
  • まとめ:呼ばれたときだけ動き、動いた分だけ払う
  • サーバーレス
  • サーバーを見なくてよく、待っている時間に払わない
  • Lambda
  • イベントで呼ばれる関数。1回最長15分、同時に来た数だけ増える
  • コールドスタート
  • 新しい環境の準備の分だけ遅い。小さく保てば短い
  • 料金
  • リクエスト数 + メモリ × 実行時間。呼ばれなければ0円
  • API Gateway
  • HTTP の受付。ルート・認証・流量の制限
  • いつ選ぶか
  • 短い・たまに・イベントで起きる仕事
  • データベース
  • 次の困りごと:数百の関数が一斉に RDS へつなぐと、接続があふれる
  • ひらめき
  • でも、Lambda が一気に増えると RDS の接続があふれる。増え方に強いデータベースは? → 第23章。

0 件のコメント

読み込み中…

権利侵害・不適切な内容の連絡: [email protected]