システム開発6分で読めます

AWSサーバーレスでWebアプリ開発|Lambda・API Gateway・S3の構成パターン

コセケン

コセケン

テクラル合同会社

#サーバーレス#AWS#Webアプリ開発#アーキテクチャ設計#AWS Lambda#クラウドコンピューティング#システム開発#インフラ自動化
AWSサーバーレスでWebアプリ開発|Lambda・API Gateway・S3の構成パターン

AWSサーバーレスでWebアプリを構築するには、Lambda(関数実行)+ API Gateway(ルーティング)+ S3(ストレージ)+ DynamoDB(DB) の4サービスを組み合わせます。これら4つを接続するだけで、サーバー管理不要・従量課金・自動スケーリングのWebアプリが完成します。

本記事は「AWSの具体的なサービスを使って実際に構築したい」という方向けの実装ガイドです。サーバーレスの概念やメリット・デメリットの解説はサーバーレスとは?アーキテクチャのメリット・デメリットと導入の判断基準をご覧ください。

AWSサーバーレスとは(AWSに絞った実装ガイド)

サーバーレスとはサーバーが存在しないのではなく、開発者がサーバーを管理しないアーキテクチャです。AWSでは「フルマネージドサービス」として提供されており、OSパッチ・スケーリング・冗長化はすべてAWS側が担います。

他クラウド(GCP Cloud Run・Azure Functionsなど)でもサーバーレスは実現できますが、本記事ではAWSのマネージドサービスに絞って解説します。AWS固有のサービス名・料金・設定方法を具体的に押さえることで、設計から本番運用まで迷わず進められます。

使用するAWSサービス一覧【比較表】

サービス 役割 料金目安(2024年時点)
AWS Lambda イベント駆動で関数を実行(バックエンドロジック) 100万リクエスト/月まで無料。以降 $0.20/100万件 + $0.00001667/GB秒
Amazon API Gateway HTTPリクエストをLambdaにルーティング HTTP API: $1.00/100万リクエスト(REST APIより約70%安)
Amazon S3 静的ファイル(HTML/CSS/JS・画像)の配信 $0.025/GB/月(標準ストレージ)。静的サイトホスティング無料
Amazon DynamoDB サーバーレスNoSQLデータベース オンデマンドモード: $1.25/100万書き込み、$0.25/100万読み込み
Amazon CloudFront CDN + S3前段のHTTPS終端 1TB/月まで $0.085/GB。S3連携は無料転送枠あり
AWS CloudWatch ログ・メトリクス・アラート管理 5GBのログ取り込み/月まで無料

料金はすべて東京リージョン(ap-northeast-1)の目安。無料利用枠は12か月間適用。公式のAWSプライシングで最新値を確認してください。

アーキテクチャ設計の基本パターン

AWSサーバーレスWebアプリの代表的な構成を示します。

ユーザー
  ↓ HTTPS
CloudFront(CDN・HTTPS終端)
  ├─ /api/* → API Gateway → Lambda → DynamoDB
  └─ /* → S3(静的ファイル: React/Next.js ビルド成果物)

ポイント

  • S3 + CloudFront でフロントエンドを配信することで、Lambdaへのリクエストをバックエンドのみに限定できる
  • API GatewayはHTTP APIを選ぶと低レイテンシ・低コスト(REST APIより約70%安)
  • DynamoDBはオンデマンドモードで開始し、アクセス量が安定したらプロビジョニングモードに移行するとコストが下がる

非同期処理が必要な場合(メール送信・バッチ処理など)は、Lambda → Amazon SQS → Lambda のキューイング構成を追加します。

Lambda関数の作成手順

AWS SAM(Serverless Application Model)を使うと、インフラをコードで定義できます。

1. SAMテンプレートの作成(template.yaml

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Globals:
  Function:
    Runtime: python3.12
    Timeout: 10
    MemorySize: 256

Resources:
  GetUserFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: src/handlers/
      Handler: get_user.handler
      Events:
        GetUser:
          Type: HttpApi        # HTTP API (低コスト)
          Properties:
            Path: /users/{id}
            Method: GET
      Environment:
        Variables:
          TABLE_NAME: !Ref UsersTable

  UsersTable:
    Type: AWS::DynamoDB::Table
    Properties:
      BillingMode: PAY_PER_REQUEST   # オンデマンドモード
      AttributeDefinitions:
        - AttributeName: userId
          AttributeType: S
      KeySchema:
        - AttributeName: userId
          KeyType: HASH

2. Lambdaハンドラの実装(src/handlers/get_user.py

import json
import boto3
import os

dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table(os.environ["TABLE_NAME"])

def handler(event, context):
    user_id = event["pathParameters"]["id"]
    response = table.get_item(Key={"userId": user_id})
    item = response.get("Item")
    if not item:
        return {"statusCode": 404, "body": json.dumps({"error": "Not found"})}
    return {"statusCode": 200, "body": json.dumps(item)}

3. デプロイ

sam build && sam deploy --guided

API Gateway設定のポイント

設定項目 推奨値 理由
APIタイプ HTTP API REST APIより70%安く、レイテンシも低い
ステージ変数 dev / prod を分離 同じテンプレートで環境切り替え可
CORSの設定 許可オリジンを明示 S3配信のフロントエンドから叩くために必須
タイムアウト 最大29秒(HTTP API) Lambdaの最大実行時間とは別に制約あり
スロットリング バースト制限 5,000RPS デフォルトで設定済み。超過時は429エラー

CORS設定をSAMで記述する例:

Globals:
  HttpApi:
    CorsConfiguration:
      AllowOrigins:
        - "https://your-domain.com"
      AllowMethods:
        - GET
        - POST
      AllowHeaders:
        - Content-Type
        - Authorization

運用上の注意点(コスト・コールドスタート・CloudWatch)

コールドスタート対策

Lambdaは一定時間リクエストがないと関数コンテナが停止します。次のリクエスト時に初期化処理(コールドスタート)が走り、数百ms〜数秒の遅延が発生します。

対策方法

方法 効果 コスト
Provisioned Concurrency コンテナを常時起動状態に保つ 追加料金あり($0.015/時間per 1 concurrency)
メモリ増量 CPUも比例して増え初期化が速くなる メモリ単価は低いため効果的
ランタイム選択 Python/Node.jsはJavaより起動が速い 無料
軽量依存関係 Lambdaレイヤーで共通ライブラリを分離 無料

コスト管理

  • DynamoDB: 書き込みが多い場合はプロビジョニングモード + Auto Scalingが安い
  • Lambda: 実行時間×メモリが課金対象。不要な処理をLambdaの外に追い出す
  • API Gateway: キャッシュTTLを設定してLambda呼び出し回数を削減

CloudWatchによる監視

# Lambdaの重要メトリクス
- Duration(実行時間): 平均・P99を監視
- Errors(エラー率): 1%超でアラート
- Throttles(スロットリング): 0超でアラート
- ConcurrentExecutions(同時実行数): アカウント上限1,000に注意

AWS X-Rayを有効にするとサービス間のリクエストトレースが可視化でき、どのサービスがボトルネックかを特定できます。CloudWatchダッシュボードにLambda・DynamoDB・API Gatewayのメトリクスをまとめて一元管理することを推奨します。

デプロイの自動化についてはAWSでのCI/CDパイプライン構築ガイド|開発を加速する6つの実践ポイントも参照してください。

まとめ

AWSサーバーレスWebアプリの構成要素と実装ポイントを整理します。

項目 要点
基本4サービス Lambda + API Gateway + S3 + DynamoDB
APIタイプ HTTP APIを選ぶと低コスト・低レイテンシ
IaC AWS SAMでインフラをコード化 → 環境再現性を確保
コールドスタート メモリ増量・Provisioned Concurrencyで対策
監視 CloudWatch + X-Rayで可観測性を確保

サーバーレスはゼロから小さく始めて、トラフィックに応じて無停止でスケールできる点が最大の強みです。まずAWS無料利用枠の範囲でプロトタイプを動かし、本番要件に合わせてコスト設計を見直す進め方が実践的です。

この記事を書いた人

コセケン

コセケン

テクラル合同会社

スタートアップでのCTO経験を経て、現在はテクラル合同会社にてシステム開発全般を牽引しています。アプリおよびWebの開発から、バックエンド、インフラ構築に至るまで幅広い技術領域に対応可能です。スピード感を持った品質の高いシステム開発を得意としており、新規プロダクトの立ち上げを一気通貫で支援します。本ブログでは実践的な開発ノウハウを発信していきます。

関連記事