跳至主要內容

AWS Lambda vs Cloudflare Workers:Serverless 平台深度比較

AWS Lambda vs Cloudflare Workers:Serverless 平台深度比較

Serverless 計算已經成為現代後端架構的重要選項。AWS Lambda 是老牌的無伺服器運算服務,Cloudflare Workers 則是新興的邊緣運算平台。這兩個服務各有優缺點,適合不同的使用情境。

架構差異

AWS Lambda

  • 運行在 AWS 的區域資料中心(Region)
  • 支援多種語言:Node.js、Python、Go、Java、Ruby、.NET
  • 每次呼叫可能有冷啟動延遲(Cold Start)
  • 執行時間上限:15 分鐘
  • 記憶體:128MB - 10GB

Cloudflare Workers

  • 運行在全球 300+ 個邊緣節點(PoP)
  • 基於 V8 引擎,支援 JavaScript/TypeScript 和 WASM
  • 幾乎無冷啟動(使用 Isolate 模型而非容器)
  • 執行時間上限:30 秒(免費)/ 15 分鐘(付費)
  • 記憶體:128MB

冷啟動比較

這是兩者最大的差異。Lambda 使用容器模型,首次呼叫需要初始化容器:

AWS Lambda 冷啟動時間(典型):
- Node.js:100-500ms
- Python:100-400ms
- Java:500-2000ms(最嚴重)
- 使用 SnapStart 可大幅改善 Java 的冷啟動

Cloudflare Workers 冷啟動:
- 通常 < 5ms(V8 Isolate 啟動極快)

程式碼範例比較

AWS Lambda(Node.js)

exports.handler = async (event, context) => {
  const { httpMethod, path, body } = event;
  
  if (httpMethod === 'GET' && path === '/users') {
    const users = await getUsersFromDB();
    return {
      statusCode: 200,
      headers: {
        'Content-Type': 'application/json',
        'Access-Control-Allow-Origin': '*'
      },
      body: JSON.stringify(users)
    };
  }
  
  return {
    statusCode: 404,
    body: JSON.stringify({ error: 'Not Found' })
  };
};

Cloudflare Workers

export default {
  async fetch(request, env, ctx) {
    const url = new URL(request.url);
    
    if (request.method === 'GET' && url.pathname === '/users') {
      const users = await getUsersFromDB(env);
      return new Response(JSON.stringify(users), {
        headers: {
          'Content-Type': 'application/json',
          'Access-Control-Allow-Origin': '*'
        }
      });
    }
    
    return new Response(JSON.stringify({ error: 'Not Found' }), {
      status: 404
    });
  }
};

Workers 的 API 更接近 Web 標準(Request/Response),而 Lambda 有自己的事件格式。

資料儲存整合

Lambda 的儲存選項

  • DynamoDB:NoSQL,原生整合,延遲低
  • RDS:關聯式資料庫,需要注意連線池
  • ElastiCache:Redis 快取
  • S3:物件儲存
// Lambda + DynamoDB
const { DynamoDBClient, GetItemCommand } = require("@aws-sdk/client-dynamodb");
const client = new DynamoDBClient({ region: "ap-northeast-1" });

exports.handler = async (event) => {
  const result = await client.send(new GetItemCommand({
    TableName: "Users",
    Key: { userId: { S: event.userId } }
  }));
  return result.Item;
};

Workers 的儲存選項

  • KV:全球分散式 key-value 儲存
  • D1:SQLite 資料庫
  • R2:物件儲存(S3 相容)
  • Durable Objects:有狀態的邊緣運算
// Workers + KV
export default {
  async fetch(request, env) {
    const userId = new URL(request.url).searchParams.get('id');
    
    // 從 KV 讀取(全球複製,極低延遲)
    const user = await env.USERS_KV.get(userId, { type: 'json' });
    
    if (!user) {
      return new Response('Not found', { status: 404 });
    }
    
    return Response.json(user);
  }
};

費用比較

項目 AWS Lambda Cloudflare Workers
免費額度 100萬次/月 100,000次/天
超過費用 $0.20/100萬次 $0.30/百萬次
計算費用 依GB·秒計費 已包含
網路傳輸 額外收費 免費

對於流量不大的專案,兩者都有慷慨的免費額度。

本地開發體驗

Lambda

# AWS SAM
sam local invoke -e event.json
sam local start-api

Workers

# Wrangler(Workers 的 CLI)
npx wrangler dev
# 本地直接在瀏覽器測試,體驗非常好

Workers 的本地開發體驗明顯更流暢,wrangler dev 啟動極快,而且支援 hot reload。

使用情境建議

選 Lambda 的情境:

  • 需要長時間執行的任務(> 30 秒)
  • 需要大量記憶體(> 128MB)
  • 已深度整合 AWS 生態系(RDS、SQS 等)
  • 使用 Java、Go 等非 JS 語言
  • 需要 VPC 內的私有資源存取

選 Cloudflare Workers 的情境:

  • 追求極低延遲(< 50ms 全球)
  • API 閘道、認證、A/B 測試等邊緣邏輯
  • 靜態資源處理、重定向
  • 不想管理 IAM 角色和複雜的 AWS 設定
  • 成本優先,免費額度更大

我自己的專案目前兩者都在用:需要複雜業務邏輯或整合 RDS 的用 Lambda,對延遲敏感的 API 或邊緣快取用 Workers。

分享這篇文章