AWS Lambda徹底解説:Google Cloud Functions・Cloud Run・Azure Functions比較で学ぶサーバーレス設計ガイド
はじめに(要点サマリー)
- 本記事の主役は、AWSのサーバーレス実行基盤である「AWS Lambda」です。Lambdaは、サーバーの台数・OS・ミドルウェアを意識せず、コード単位でデプロイして、イベントに応じて自動実行してくれる関数実行サービスです。
- 課金は「呼び出し回数」と「実行時間×メモリ」で、アイドル時間には料金がかからない従量課金モデルが採用されています。処理時間はミリ秒単位で計測され、無料枠では毎月40万GB秒の実行時間と一定数のリクエストが含まれます。
- Google側の同等サービスは主に Cloud Functions(v2ではCloud Run functionsとしてCloud Run基盤上に統合)、Azure側では Azure Functions です。どれも「イベント駆動でコードだけをデプロイし、サーバー管理から解放する」という共通コンセプトを持っています。
- 想定読者は、次のような方です。
- API やバッチをこれからサーバーレスに載せたいバックエンドエンジニア
- ECS/EKS と Lambda の使い分け、GCP/Azure との違いも踏まえてアーキテクチャを決めたいテックリード・アーキテクト
- 小規模チームやスタートアップで、運用負荷を抑えつつスケーラブルな構成を作りたい方
- 読み終わるころには、次のことを自分の言葉で説明できる状態を目指します。
- 「この処理はLambdaに向いている/いない」
- 「LambdaとCloud Functions・Azure Functionsの違い」
- 「自分のプロジェクトでは、どのサーバーレス基盤をどう組み合わせるのが現実的か」
1. AWS Lambdaとは?“イベントに反応する小さなサーバー”というイメージ
1.1 Lambdaの基本コンセプト
AWS Lambdaは、AWSが提供するサーバーレスコンピューティングサービスです。サーバーのプロビジョニングや管理を行わずに、関数(小さなコード単位)をデプロイし、各種イベントに応じて自動実行できます。
ポイントを整理すると、こんなイメージになります。
- サーバーは見えない(けれど裏側ではもちろん動いている)
- コードと設定(メモリ・タイムアウト・環境変数など)だけを指定する
- S3・API Gateway・EventBridge・SQS・SNSなどのイベントをトリガーに起動
- 実行が終われば、その分の時間だけ課金される
「1つの小さな処理のためにEC2インスタンスを1台立てる」のではなく、「その処理の分だけコードをアップロードして、イベントに応じて必要な回数だけ実行してもらう」という発想になります。
1.2 対応言語と実行時間・リソース制限
Lambdaはマルチランタイムに対応しており、2025年時点で公式には Node.js / Python / Ruby / Java / .NET / Go などがサポートされています。カスタムランタイムを使えば、ほかの言語も実行可能です。
主な制限としては:
- 最大実行時間は 15 分(900秒)まで
- メモリは 128MB〜10,240MB の範囲で1MB刻み
- 一時ストレージは標準で512MB、それ以上は最大10GBまで追加可能
- 同時実行数(コンカレンシー)にはアカウント単位の上限があり、デフォルトは1000程度(サポート申請で増加可能)
このあたりは、GCPのCloud FunctionsやAzure Functionsでも同様に「最大実行時間」「メモリの上限」「同時実行の制御」などの制約が存在します。
2. Google Cloud Functions / Cloud Run functions・Azure Functionsとの比較
2.1 共通する“サーバーレス関数”としての性格
AWS Lambda、Google Cloud Functions(v2ではCloud Run functions)、Azure Functionsはいずれも
- サーバーを意識せずコードをデプロイできる
- イベント駆動(HTTPリクエスト、ストレージ、メッセージング、スケジューラなど)
- スケールは自動、アイドル時はゼロに近いコスト
- 従量課金(リクエスト数+実行時間+メモリ)
という共通の性格を持つサーバーレス関数実行基盤です。
2.2 それぞれの“得意ワールド”
ざっくり言うと、次のような色付けで考えると分かりやすくなります。
- AWS Lambda
- S3 / DynamoDB / API Gateway / EventBridge / SQS など、AWSサービスとの統合が非常に豊富
- 既にAWS中心のアーキテクチャなら、最も自然な選択肢
- Google Cloud Functions / Cloud Run functions
- Cloud Storage / Firestore / Cloud Pub/Sub / Cloud Run といったGCPサービスとの連携がスムーズ
- HTTPベースのマイクロサービスや小さなワークフローに向く
- Azure Functions
- Azure Storage / Cosmos DB / Event Hubs / Service Bus などと密に統合
- .NETエコシステムとの親和性が高く、企業向けシナリオで採用されやすい
「どれが一番良いか」というより、
- すでに使っているクラウドサービスとの統合性
- チームが得意な言語・ツールチェーン
- 組織としてどのクラウドに寄せるか
といった現実的な条件で選ぶことが多くなります。
2.3 スケーリングと料金モデルの違い(ざっくり)
どのサービスも「自動スケール+従量課金」ですが、細かな挙動には違いがあります。
- Lambda
- リクエストに応じて自動でコンテナ(実行環境)を増やし、関数ごとに一定のバースト上限とアカウント単位の同時実行上限がある。
- 料金はリクエスト数+GB秒課金。最近はARM(Graviton)とx86で単価が分かれ、無料枠も提供。
- Cloud Functions / Cloud Run functions
- HTTP/イベントに応じて自動スケールし、インスタンス数・同時実行数をパラメータで制御可能。
- 料金もリクエスト+実行時間+メモリ/CPUで、無料枠あり。
- Azure Functions
- Consumption プラン(完全従量課金)と Premium / App Service プラン(より安定・柔軟)など複数の実行プランがあり、用途に応じて選択。
価格そのものは時期によって変動もあるので、実際に設計するときは必ず公式料金ページと計算ツールで見積もってくださいね。
3. AWS Lambdaのアーキテクチャ:イベント・トリガー・実行環境
3.1 Lambdaを“何が”起こすのか:トリガーの種類
Lambdaの魅力はトリガーの多さです。代表的なものを挙げてみます。
- API Gateway・ALB経由のHTTPリクエスト
- S3へのオブジェクトアップロード・削除イベント
- DynamoDBストリームの変更イベント
- SQSキューにメッセージが入ったとき
- SNSトピックへの通知
- EventBridge(旧CloudWatch Events)のスケジュール・イベントルール
- Cognito・CodeCommit・CloudWatch Logsなど各種AWSサービスのイベント
この「なんでもイベントにできる感」は、GCPの Cloud Functions(Cloud Storage / Pub/Sub / Firebase 連携)や Azure Functions(Storage / Event Hubs / Service Bus連携)でも同様で、「クラウドサービス同士をくっつける接着剤」としてサーバーレス関数が活用されます。
3.2 実行環境(コンテナ)のライフサイクルとコールドスタート
Lambdaは内部的にはコンテナのような隔離環境で関数を実行します。
- 初回実行時やしばらく使われていないときは、新しい実行環境を立ち上げる必要があり、これを「コールドスタート」と呼びます。
- いったん立ち上がった環境は、しばらくは再利用されるため、同じコンテナ内で複数リクエストが処理されることがあります(そのため、グローバル変数にキャッシュを持つなどの最適化も可能)。
この性質は、Cloud FunctionsやAzure Functionsでもほぼ同じで、「最初の1回だけ少し遅くて、あとは速い」という挙動になります。
3.3 サンプル:もっともシンプルなNode.js Lambda関数
イメージを掴みやすいように、一番簡単なHTTPハンドラーの例を載せておきますね。
// index.mjs (Node.js 20 など)
export const handler = async (event, context) => {
console.log("Request ID:", context.awsRequestId);
console.log("Event:", JSON.stringify(event));
return {
statusCode: 200,
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
message: "Hello from Lambda!",
input: event,
}),
};
};
これをAPI GatewayのHTTP APIまたはREST APIと統合すれば、サーバーレスなWeb APIとしてすぐに利用できます。
4. 実務での典型ユースケースと、他クラウドでの対応
4.1 Web API・バックエンドの構築
もっともよくあるのが、Lambda+API GatewayでWeb APIやBFF(Backend for Frontend)を構築するパターンです。
- フロントエンド(SPA / ネイティブアプリ) → API Gateway → Lambda
- LambdaからRDS/Aurora・DynamoDB・S3などにアクセス
- 認証はCognitoやOIDC(Cognito / Auth0 / Azure ADなど)と連携
GCPなら Cloud Run / Cloud Functions+API Gateway、Azureなら Functions+Azure API Management で、よく似た構成が作れます。
4.2 バッチ処理・定期ジョブ
- 毎時・毎日・毎週などの定期的な処理を、EventBridge(スケジュール)→Lambdaで実装
- 例えば「毎日0時にレポート集計して、S3にCSVを出力し、完了したらSNSで通知」など
GCPでは Cloud Scheduler+Cloud Functions / Cloud Run、Azureでは Timer トリガーの Functions で同様のジョブが組めます。
4.3 ファイル処理・画像変換・サムネイル生成
- S3バケットに画像がアップロードされたらLambdaが起動し、サムネイルを生成して別バケットに保存
- ドキュメントのPDF変換やメタデータ抽出なども同様
これはGCP Cloud Storage+Cloud Functions、Azure Blob Storage+Functions(Blobトリガー)でほぼ同じように書けます。
4.4 メッセージング連携(SQS / SNS / Kinesis)
Lambdaはメッセージング系サービスとの相性も抜群です。
- SQSキュー → Lambda でバックグラウンドジョブを実行
- SNSトピック → Lambda でメール通知やサードパーティ連携
- Kinesisストリーム → Lambda でリアルタイム処理(ログ解析やメトリクス集計など)
GCPではCloud Pub/Sub+Cloud Functions、AzureではService Bus / Event Hubs+Functionsといった組み合わせが鉄板です。
5. インフラ定義とデプロイ:SAM・Serverless Framework・Terraform
5.1 AWS SAM での定義サンプル
Lambdaを本番運用するなら、Infrastructure as Code(IaC)はほぼ必須です。AWS公式の選択肢としては、AWS SAM(Serverless Application Model)があります。
シンプルなHTTP API+LambdaのSAMテンプレート例はこんな感じです。
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Sample Lambda + HTTP API
Resources:
ApiFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: src/
Handler: index.handler
Runtime: nodejs20.x
MemorySize: 512
Timeout: 10
Policies:
- AWSLambdaBasicExecutionRole
Events:
HttpApi:
Type: HttpApi
Properties:
Path: /hello
Method: GET
sam build → sam deploy で、Lambda関数・IAMロール・HTTP APIが一式デプロイされます。
5.2 他ツールとの比較
- Serverless Framework
- AWSだけでなく、Azure FunctionsやGoogle Cloud Functionsへのデプロイもサポートしており、マルチクラウドなサーバーレス開発に向きます。
- Terraform / Pulumi
- LambdaだけでなくVPCやECS/EKSなども含めて「クラウド全体」をコードで管理したい場合に採用されやすいです。
GCPなら Cloud Deployment Manager や Terraform、Azureなら ARM/Bicep / Terraform などが一般的です。どのクラウドでも、「関数を手作業クリックではなくコードで定義する」文化は共通になりつつあります。
6. コストとパフォーマンス:Lambdaを高くしないための視点
6.1 料金モデルの具体像
Lambdaの料金はだいたい次のようなイメージです。
- リクエスト課金
- 100万リクエストあたり0.20ドル(地域により差あり)
- 実行時間(GB秒)課金
- メモリサイズ×実行時間(ミリ秒単位)
- 一定の無料枠(毎月40万GB秒)
例えば、1GBメモリ・平均500msのLambdaを月100万回実行した場合、おおざっぱには
- リクエスト課金:0.20ドル
- 実行時間課金:0.5秒×1GB×100万回=約50万GBミリ秒 → 500,000ms相当の料金
…といった計算になります(実際は単価と無料枠を考慮して計算してくださいね)。
6.2 コスト最適化のポイント
- メモリサイズと実行時間のバランス
- メモリを増やすとCPU性能も上がるため、処理が短くなってトータルコストが下がる場合もあります。
- 不必要に呼び出し回数を増やさないAPI設計
- 1画面で10回Lambdaを呼ぶより、BFFでまとめて1〜2回にしたほうがコスト・レイテンシともに有利なケースが多いです。
- 不要なログ出力を抑える
- CloudWatch Logsの料金も積み上がるので、DEBUGログを出し過ぎないように注意します。
GCPやAzureのサーバーレス関数も基本的には同じ考え方で、リクエスト・実行時間・メモリを意識した設計がコスト最適化のカギになります。
7. よくある落とし穴と、その回避策
7.1 長時間バッチ・CPUヘビー処理をLambdaに詰め込みすぎる
- 最大15分という制限があるため、長時間のETLや動画変換などを1 Lambdaに押し込むと、タイムアウトや料金爆発の原因になります。
- 対策としては、
- Step Functionsでワークフローに分割する
- ECSバッチ・EKS・AWS Batchなど、より長時間向けの基盤に任せる
GCPでも、長時間処理は Cloud Run / GKE、AzureではContainer Apps / AKSなどに逃がすパターンが一般的です。
7.2 状態をLambda内部に持ってしまう
- 実行環境はいつ破棄されるか分からないので、ローカルファイルやメモリに重要な状態を持ってしまうと、突然失われます。
- 状態はDynamoDB・RDS・ElastiCache・S3など外部ストアに置き、Lambdaは基本的にステートレスに保つ方が安全です。
これはCloud FunctionsやAzure Functionsでも全く同じで、「関数はステートレス、状態は外部ストレージ」が鉄則です。
7.3 コールドスタートを意識しない
- レイテンシがシビアなAPI(例えば数十ミリ秒以内の応答が必要なリアルタイム系)でコールドスタートを無視すると、ユーザー体験に影響することがあります。
- 対策としては、
- Lambdaのプロビジョンドコンカレンシーを使って常に一定数の実行環境をウォームに保つ
- 本当にレイテンシが厳しい部分だけはECS/EKSや常時起動のワークロードに寄せる
GCP/Azureにも類似の「最小インスタンス数」「プレウォーム」設定があり、同じ考え方で対処できます。
8. 誰がどう得をするか(読者像ごとの具体的メリット)
8.1 バックエンドエンジニアの方へ
- これまでEC2やコンテナで動かしていた小さなAPI・バッチ・ユーティリティ処理を、Lambdaに移行することで
- OSアップデート・スケーリング・ヘルスチェック・オートヒーリングといった「インフラ系の面倒ごと」を大きく減らせます。
- GCP・Azure側のサーバーレス関数と考え方を揃えて理解しておくことで、クラウドが変わっても「イベント駆動で小さい関数をつなぐ」設計がそのまま活かせます。
8.2 SRE・プラットフォームエンジニアの方へ
- Lambdaの同時実行制御・プロビジョンドコンカレンシー・アカウント制限を正しく理解することで、
- サービス全体の負荷コントロールや、他サービスへの影響を抑えたスロットリング設計がやりやすくなります。
- CloudWatch Logs / X-Ray / CloudTrail と組み合わせた監視・トレーシングを整備すれば、「どのイベントがどのLambdaを何回呼んでいるか」を見える化でき、コストの監視やパフォーマンスチューニングもしやすくなります。
8.3 テックリード・アーキテクト・CTOの方へ
- Lambda / Cloud Functions / Azure Functionsを横並びで理解しておくと、
- 「どの処理はサーバーレスで十分か」
- 「どこから先はコンテナやVMに寄せるべきか」
を体系的に判断できます。
- チームに対して「関数1つの粒度でレビュー/テストしやすいコード」を促すことで、モジュール性の高いシステム設計やCI/CDパイプラインの整備にもつながります。
8.4 小規模チーム・スタートアップの方へ
- 最初から複雑なコンテナオーケストレーション基盤を持たずとも、
- API Gateway+Lambda+DynamoDB+S3 くらいで立派なプロダクトをローンチできます。
- トラフィックが増えてきてから、必要に応じてECS/EKSや別クラウドとの連携を検討すればよく、初期投資を抑えつつも将来の選択肢は確保しやすくなります。
9. 今日からできる3ステップ
- まずは小さな関数を1つ決める
- 例:文字列を受け取って簡単なレスポンスを返すHTTP API、S3にアップロードされたCSVの行数をログに出す処理など。
- コンソールでもよいので、Lambdaを1つ作って実際にイベントをトリガーしてみる
- 動き方(ログの出方・CloudWatchメトリクス・コールドスタートの感じ)を体験してみてください。
- その後、SAMやServerless Frameworkで同じLambdaをコード化する
- IaC化まで一気にやってしまうと、「本番運用に耐えるLambdaアプリケーション」の流れがかなりクリアになります。
同じことをGCP Cloud Functions / Cloud Run functions や Azure Functions でも試すと、「クラウドが変わっても考え方が変わらない」ことが分かって、マルチクラウド時代の基礎体力になります。
10. まとめ:Lambdaは“細かく・軽く・イベントに反応する処理”のための場所
ここまで見てきたように、AWS Lambdaは
- サーバー管理をほぼ意識せずにコードをデプロイできるサーバーレス実行基盤であり、
- S3・DynamoDB・API Gateway・EventBridge・SQS・SNS など様々なAWSサービスと密に連携できる「イベント接着剤」のような存在です。
一方で、
- 実行時間は最大15分
- 同時実行やコールドスタートの制約
- 長時間バッチや超低レイテンシ処理には向かないケースもある
といった特性も持っているため、「なんでもLambdaに詰め込めば正解」というわけではありません。
大切なのは、
- 処理の性質(頻度・レイテンシ・実行時間)
- チームのスキルセット
- 既存のクラウド資産
を冷静に見つめたうえで、
ここからここまではLambda/Cloud Functions/Azure Functions、
ここから先はコンテナ or 従来のサーバー
と、気持ちよく役割分担をすることだと思います。
まずは、日常の開発の中から「この処理、実はイベント駆動の関数1つで書けそうだな」というものを一つ選んで、軽くLambdaで試してみてください。
その小さな一歩が、サーバーレスやマルチクラウドに強い基盤づくりの第一歩になります。
参考リンク(公式ドキュメント中心)
-
AWS Lambda 概要・機能紹介
-
AWS Lambda 料金ページ・料金解説
-
Google Cloud Functions / Cloud Run functions 概要
-
Azure Functions 製品ページ・ドキュメント
-
サーバーレス3サービス比較記事(Lambda vs Azure Functions vs Cloud Functions)
※実際の導入時には、バージョンや制限値、料金などが変わっている可能性がありますので、必ず最新の公式ドキュメントを確認してくださいね。
