クラウドサービス

AWS Lambda

サーバー管理なしでコードをイベント実行できるサーバーレスの代表格。使った分(ミリ秒)だけ課金。

中級SAA-C03DVA-C02SOA-C02SAP-C02コスト最適化パフォーマンス効率運用上の優秀性信頼性
3つの要点
  1. コードを置くとイベントで自動実行。サーバーの用意・運用は一切不要。
  2. 実行した時間(ミリ秒)×メモリ分だけ課金。アイドル時は無料。
  3. イベント駆動・短時間処理向き。常時稼働や長時間処理は EC2 / コンテナへ。

解決する課題

  • サーバーを常時立てておくのはもったいない/面倒 → イベント時だけ動かす
  • 急なスパイクに自動でスケールしてほしい
  • 「画像がアップされたら縮小」「キューにメッセージが来たら処理」を接着剤的に書きたい

主要概念と用語

  • 関数: 実行単位のコード(+設定)
  • トリガー / イベントソース: S3・API Gateway・SQS・EventBridge など
  • ハンドラ: 入口の関数(event を受け取る)
  • 実行ロール: 関数に与えるIAM権限
  • 同時実行数(Concurrency): 同時に走るインスタンス数
  • コールドスタート: 新しい実行環境の初期化にかかる初回遅延

仕様・制限・クォータ

設計の前に効いてくる境界値だけを挙げます。数値は引き上げ申請で変わるもの(ソフトリミット)と、 変えられないもの(ハードリミット)が混ざっているので、分けて覚えると設計判断が速くなります。

項目引き上げ
最大実行時間15分不可
メモリ128MB〜10GB(1MB刻み)
/tmp512MB(最大10GBまで設定可)
同時実行数リージョンあたり既定1,000
zip 直接アップロード50MB(圧縮時)不可
zip(S3経由・解凍後)250MB不可
コンテナイメージ10GB不可
環境変数の合計4KB不可
同期呼び出しのペイロード6MB(リクエスト・レスポンス各)不可
非同期呼び出しのペイロード256KB不可

15分とペイロード上限は動かせません。 ここに当たる設計は Lambda では成立しないので、 長時間処理は Step Functions で分割するか ECS / AWS Batch へ、大きなデータは本体を S3 に置いて キーだけを渡す形に変えます。

メモリはCPUの設定でもある

Lambda に vCPU の設定項目はありません。メモリ量に比例して割り当てられ、1,769MB でちょうど 1 vCPU 相当です。 それ未満は vCPU の分数、それ以上は複数 vCPU になります。 つまり CPU バウンドな処理が遅いときに増やすべきはメモリで、1,769MB を超えないと並列処理の効果も出ません。

コールドスタートの正体

「コールドスタート」と一語で呼ばれますが、中では2つの段階が動いています。切り分けないと対策を間違えます。

  1. 実行環境の準備 — マイクロVM を起こし、ランタイムを読み込む。ここは AWS 側の時間で、こちらから縮められません。
  2. INIT フェーズハンドラの外に書いたコードが動きます。import、DB接続の確立、設定の読み込み。 ここは自分のコード次第で、数十msから数秒まで振れます。

したがって効くのは 2 を削ることです。使わないライブラリを import しない、初期化の重い処理を ハンドラ内へ移して遅延実行にする、といった手当てが直接効きます。

言語による差も大きく、Python / Node.js は軽く、Java / .NET は重い傾向です。 Java には INIT 済みのスナップショットから復元する SnapStart があります。

VPCに入れると遅い、は今は正しくない

かつては VPC 接続の関数が起動のたびに ENI を作成し、数秒から十数秒かかっていました。 現在は Hyperplane ENI により、この待ちは実質なくなっています。 古い記事の「Lambda を VPC に入れるとコールドスタートが致命的」という記述は、 今の挙動とは合いません。ただしサブネットの空きIPは消費するので、そこは設計時に見ます。

INIT を事前に済ませておきたい場合は Provisioned Concurrency で、指定した数の実行環境を 温めた状態で確保します。ただし確保している間は課金され続けるため、 「アイドル時は無料」という Lambda の利点とは引き換えになります。

同時実行とスロットリング

Lambda のスケールは「1リクエスト=1実行環境」です。同時に来た数だけ環境が増えます。

  • アカウント同時実行数 — リージョンあたり既定 1,000。全関数の合計に対する上限です。
  • 予約済み同時実行(Reserved Concurrency) — 関数ごとに枠を確保します。上限としても働くのがポイントで、 下流の RDS を守るために「この関数は最大50まで」と絞る使い方が実務では多いです。
  • バースト — 0からいきなり1,000へは伸びず、一定の増加率で追いつきます。急峻なスパイクでは この立ち上がりの途中でスロットリングが出ます。

上限に当たると Throttles メトリクスが立ち、同期呼び出しでは 429 TooManyRequestsException が返ります。 非同期呼び出しとイベントソースマッピングでは内部で再試行されるため、呼び出し側からは 「遅い」としか見えません。Throttles を監視していないと気づけないのはこのためです。

呼び出し方式でリトライの挙動が変わる

同じ関数でも、誰が呼ぶかでエラー時の扱いが違います。ここを取り違えると、 「失敗したはずのデータが二重に処理される」「消えたのに気づかない」が起きます。

呼び出し方失敗したとき
同期API Gateway、ALB、直接 invokeリトライしない。呼び出し側がエラーを受け取り、再送の判断も呼び出し側
非同期S3イベント、SNSLambda が2回まで再試行。最大イベント保持時間を過ぎたら破棄。失敗先に DLQ / Lambda Destinations を指定できる
イベントソースマッピングSQS、Kinesis、DynamoDB StreamsLambda 側がポーリング。成功しない限りキューから消えないので、可視性タイムアウトが切れると再配信される

SQS を使う場合、キューの可視性タイムアウトは関数のタイムアウトより長くします。 逆にすると、処理中のメッセージが再配信されて二重実行になります。

内部の仕組み

LambdaはマイクロVM(Firecracker)上で関数を隔離実行します。リクエストが来ると実行環境を用意(=コールドスタート)し、処理後しばらくウォーム状態で再利用。同時に多くのリクエストが来れば、その数だけ環境を並列に増やして水平スケールします。

横にスクロール

API Gatewayによる同期呼び出し、S3からLambda非同期キューへの経路、EventBridgeのターゲット配送再試行・DLQとLambda受付後の最大イベント保持時間・最大再試行回数・失敗先という2層、SQSイベントソースマッピングの削除とDLQ、実行環境と同時実行、CloudWatch・X-Ray監視
EventBridgeの配送再試行とLambda受付後を分けます。SQSは成功時だけ削除し、失敗をDLQへ隔離します。
コールドスタート対策

低レイテンシを安定させたいなら Provisioned Concurrency で事前に温めておく。VPCに入れると初期化が増える場合がある点も意識。

設計パターン / ベストプラクティス

  • ステートレスに作り、状態はDynamoDB/S3へ
  • 小さく・速く(依存を減らし初期化を軽く)
  • 非同期+SQS/DLQ で失敗時のリトライ・退避を担保
  • 秘密情報は環境変数ではなく Secrets Manager / SSM Parameter Store

運用・監視・トラブルシュート

  • ログは CloudWatch Logs、分散トレースは X-Ray
  • 監視メトリクス: Invocations Errors Throttles Duration
  • スロットリング多発時は同時実行上限やダウンストリーム(DB)の限界を確認

コスト

課金は2本立てです。リクエスト数と、GB秒(確保したメモリ × 実行時間)。 アイドル中は課金されません。

GB秒 = (メモリMB ÷ 1024) × (課金対象時間ms ÷ 1000) × 実行回数

課金対象時間は1ミリ秒単位で切り上げられます。単価はリージョンと構成 (x86 / Arm、標準 / Provisioned Concurrency)で変わるため、実額は必ず公式の料金ページで確認してください。

メモリを上げた方が安くなることがあります。 メモリはCPUの割り当てでもあるため、 512MB で 1,000ms かかる処理が 1,024MB で 400ms になれば、GB秒は 0.5 × 1.0 = 0.5 から 1.0 × 0.4 = 0.4 へ下がります。倍のメモリで2.5倍速くなれば得、という関係です。 CPUバウンドな処理では実測して決める価値があります。逆に I/O 待ちが支配的な処理では メモリを上げても時間は縮まないので、素直に高くつきます。

見落としやすい費用が3つあります。

  • Provisioned Concurrency — 確保している間ずっと課金されます。アイドル無料の前提が崩れます。
  • CloudWatch Logs — 取り込み量と保管に対して課金されます。デバッグログを出しっぱなしにした関数が 高頻度で回ると、Lambda 本体より Logs の方が高くなることがあります。保持期間は既定で無期限なので、 最初に設定してください。
  • 呼び出し先 — API Gateway、NAT Gateway、データ転送。Lambda 単体では安くても、 VPC 内から外部APIを叩く構成では NAT Gateway の処理データ量が積み上がります。

セキュリティ

  • 最小権限の実行ロールを割り当てる
  • VPC内リソース(RDS等)へはVPC接続。境界はSGで制御
  • 入力検証(API Gateway/イベント)でインジェクション対策

Well-Architected の観点

  • コスト最適化: アイドル無料・従量課金
  • パフォーマンス効率: イベント駆動で自動スケール
  • 運用上の優秀性: サーバー管理レス、IaCでデプロイ
  • 信頼性: 非同期+DLQ+リトライ

試験で問われるポイント

頻出
  • 実行は最大15分(長時間バッチは不向き)
  • コールドスタート対策=Provisioned Concurrency
  • 疎結合の処理は SQS/EventBridge → Lambda
Lambda ミニ確認テスト1 問 / 全 3

Lambda関数の1回の最大実行時間は?

関連サービス・比較

観点LambdaFargateEC2
管理関数だけ(最少)コンテナ(サーバーレス)OSまで自分で
課金実行ミリ秒実行時間(vCPU/メモリ)起動時間
向きイベント/短時間常駐コンテナ常駐/特殊要件
上限15分なしなし

ハンズオン / CLI例

# zipで関数を作成(実行ロールを指定)
aws lambda create-function \
  --function-name resize-image \
  --runtime nodejs20.x \
  --handler index.handler \
  --role arn:aws:iam::123456789012:role/lambda-exec \
  --zip-file fileb://function.zip

# 手動でテスト実行
aws lambda invoke --function-name resize-image \
  --payload '{"key":"photo.jpg"}' out.json

AWS Service

AWS Lambdaを実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

コンピューティング

比較で見る軸

クラウド: AWS / カテゴリ: コンピューティング / 難易度: intermediate

導入後に効く点

実行した時間(ミリ秒)×メモリ分だけ課金。アイドル時は無料。

先に潰すリスク

サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。

数字・仕様の読み方
クラウド
AWS
カテゴリ
コンピューティング
難易度
intermediate
関連資格
SAA-C03 / DVA-C02 / SOA-C02 / SAP-C02
設計柱
cost / performance / operational / reliability

判断チェックリスト

  • 自社の用途が「コンピューティング / cost」に近いか確認する。
  • 強みである「コードを置くとイベントで自動実行。サーバーの用意・運用は一切不要。」が本当に評価軸になるか確認する。
  • 注意点の「サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

コンピューティングcostperformanceoperationalreliability

他クラウドの同等サービス

役割が近いサービスです。設計の置き換えや比較検討の参考に。