Lambda / API Gateway / EventBridge:Serverless 的正確打開方式

「用 Lambda 就不用管 Server 了!」——這句話只對了一半。你確實不用管 server,但你要管的東西一點也沒少。

先講結論

Lambda 適合短暫、事件驅動的任務(API handler、檔案處理、排程)。API Gateway 是 Lambda 的 HTTP 入口。EventBridge 是事件匯流排,串接 AWS 服務和你的微服務。三個搭起來能處理很多場景,但常駐型服務、需要長連線、計算密集的任務不適合 Serverless


Lambda:Function as a Service

什麼場景適合 Lambda

適合不適合
API endpoint(短 request)WebSocket 長連線
S3 上傳後處理圖片影片轉檔(超過 15 分鐘)
DynamoDB Stream 處理常駐型 Worker
排程任務(EventBridge cron)高 CPU 計算
SNS/SQS 訊息消費需要 GPU

建立 Lambda Function

# 1. 寫你的 handler
cat > index.mjs << 'EOF'
export const handler = async (event) => {
  const name = event.queryStringParameters?.name || 'World';
  return {
    statusCode: 200,
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ message: `Hello, ${name}!` })
  };
};
EOF
 
# 2. 打包
zip function.zip index.mjs
 
# 3. 建立 Lambda
aws lambda create-function \
  --function-name hello-api \
  --runtime nodejs20.x \
  --handler index.handler \
  --role arn:aws:iam::123456789012:role/lambda-basic-role \
  --zip-file fileb://function.zip \
  --memory-size 256 \
  --timeout 10 \
  --environment Variables='{NODE_ENV=production}'
 
# 4. 測試
aws lambda invoke --function-name hello-api \
  --payload '{"queryStringParameters":{"name":"Terry"}}' \
  output.json && cat output.json

Cold Start:Serverless 的阿基里斯腱

Lambda function 在一段時間沒被呼叫後會被回收。下次呼叫時需要重新啟動——這就是 cold start。

RuntimeCold Start 時間
Node.js100-300ms
Python100-300ms
Go50-100ms
Java500ms-3s
.NET300ms-1s
# 用 Provisioned Concurrency 消除 cold start(但要付費)
aws lambda put-provisioned-concurrency-config \
  --function-name hello-api \
  --qualifier prod \
  --provisioned-concurrent-executions 5

省錢建議:大部分場景不需要 Provisioned Concurrency。Cold start 只在第一次呼叫時發生,之後的 warm invocation 都是毫秒級。除非你的 API 對延遲極度敏感(<100ms SLA),否則別花這個錢。

Lambda Layers:共享依賴

# 建立 Layer(共用的 npm packages)
mkdir -p nodejs && cd nodejs
npm init -y && npm install axios lodash
cd .. && zip -r layer.zip nodejs/
 
aws lambda publish-layer-version \
  --layer-name common-deps \
  --zip-file fileb://layer.zip \
  --compatible-runtimes nodejs20.x
 
# 掛到 Lambda
aws lambda update-function-configuration \
  --function-name hello-api \
  --layers arn:aws:lambda:ap-northeast-1:123456789012:layer:common-deps:1

API Gateway:Lambda 的 HTTP 入口

HTTP API vs REST API

HTTP APIREST API
延遲更低較高
費用便宜 70%較貴
功能基本路由、JWT 驗證WAF、Usage Plan、API Key、Caching
適合大多數場景需要進階功能

2026 年的建議:除非你需要 WAF 或 Usage Plan,否則用 HTTP API。

# 建立 HTTP API
aws apigatewayv2 create-api \
  --name my-api \
  --protocol-type HTTP \
  --target arn:aws:lambda:ap-northeast-1:123456789012:function:hello-api
 
# 建立路由
aws apigatewayv2 create-route \
  --api-id api-xxx \
  --route-key "GET /hello"
 
# 建立整合
aws apigatewayv2 create-integration \
  --api-id api-xxx \
  --integration-type AWS_PROXY \
  --integration-uri arn:aws:lambda:ap-northeast-1:123456789012:function:hello-api \
  --payload-format-version 2.0

自定義域名

# 建立自定義域名
aws apigatewayv2 create-domain-name \
  --domain-name api.example.com \
  --domain-name-configurations CertificateArn=arn:aws:acm:ap-northeast-1:123456789012:certificate/xxx
 
# 建立 API Mapping
aws apigatewayv2 create-api-mapping \
  --domain-name api.example.com \
  --api-id api-xxx \
  --stage '$default'

EventBridge:事件匯流排

EventBridge 是 AWS 的事件路由器。你的服務發一個 event,EventBridge 根據規則把 event 送到對的目標。

常見模式

S3 上傳檔案 → EventBridge → Lambda 處理圖片
ECS Task 失敗 → EventBridge → SNS 通知
每天 9:00 → EventBridge Schedule → Lambda 產報表
自定義 event → EventBridge → SQS → Worker
# 建立自定義 Event Bus
aws events create-event-bus --name my-app-events
 
# 建立規則:訂單建立時觸發 Lambda
aws events put-rule --name order-created \
  --event-bus-name my-app-events \
  --event-pattern '{
    "source": ["my-app.orders"],
    "detail-type": ["OrderCreated"]
  }'
 
# 設定目標
aws events put-targets --rule order-created \
  --event-bus-name my-app-events \
  --targets '[{
    "Id": "process-order",
    "Arn": "arn:aws:lambda:ap-northeast-1:123456789012:function:process-order"
  }]'
 
# 從你的 App 發 event
aws events put-events --entries '[{
  "Source": "my-app.orders",
  "DetailType": "OrderCreated",
  "Detail": "{\"orderId\":\"ord-123\",\"amount\":1500}",
  "EventBusName": "my-app-events"
}]'

EventBridge Scheduler:取代 CloudWatch Events

# 每天早上 9:00 UTC 執行 Lambda
aws scheduler create-schedule --name daily-report \
  --schedule-expression "cron(0 9 * * ? *)" \
  --schedule-expression-timezone "Asia/Taipei" \
  --target '{
    "Arn": "arn:aws:lambda:ap-northeast-1:123456789012:function:daily-report",
    "RoleArn": "arn:aws:iam::123456789012:role/scheduler-role"
  }' \
  --flexible-time-window '{"Mode": "OFF"}'

架構模式:什麼時候混用 Serverless 和 Server

純 Serverless 很少見。大多數生產環境是混合的:

使用者
  ↓
API Gateway → Lambda(輕量 API、驗證)
  ↓
ECS/EKS(核心業務邏輯、長時間處理)
  ↓
EventBridge → Lambda(非同步處理)
  ↓
SQS → Lambda(訊息消費)

我的經驗法則:同步且短暫的用 Lambda,非同步或長時間的用 ECS/EKS,排程的用 EventBridge + Lambda。


自架 vs AWS

面向自架AWS Serverless
API ServerExpress/FastAPI on EC2API Gateway + Lambda
排程任務cron + 腳本EventBridge Scheduler + Lambda
事件驅動RabbitMQ / Redis Pub/SubEventBridge / SNS / SQS
圖片處理Worker processLambda + S3 trigger
費用模型固定(機器一直開)按調用次數(不用就不付)
擴展手動 / ASG自動(Lambda 並行上限 1000)

如果你讀過 Infra 系列的 ServerlessCloud 系列的 Serverless vs Server,這篇就是那些概念在 AWS 上的實作版。Cold Start 的深入分析和費用交叉點,看 Cloud 系列的 實戰篇


K8s 映射

AWS ServerlessK8s 對應
LambdaKnative Serving / OpenFaaS
API GatewayIngress Controller + custom routing
EventBridgeNATS / Kafka / CloudEvents
EventBridge SchedulerCronJob
Step FunctionsArgo Workflows / Temporal
SQS + LambdaKEDA(event-driven autoscaling)

系列導覽


Serverless 最大的價值不是「不用管 server」,是「讓你只付你真正用到的錢」——但前提是你用對場景。