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.jsonCold Start:Serverless 的阿基里斯腱
Lambda function 在一段時間沒被呼叫後會被回收。下次呼叫時需要重新啟動——這就是 cold start。
| Runtime | Cold Start 時間 |
|---|---|
| Node.js | 100-300ms |
| Python | 100-300ms |
| Go | 50-100ms |
| Java | 500ms-3s |
| .NET | 300ms-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:1API Gateway:Lambda 的 HTTP 入口
HTTP API vs REST API
| HTTP API | REST 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 Server | Express/FastAPI on EC2 | API Gateway + Lambda |
| 排程任務 | cron + 腳本 | EventBridge Scheduler + Lambda |
| 事件驅動 | RabbitMQ / Redis Pub/Sub | EventBridge / SNS / SQS |
| 圖片處理 | Worker process | Lambda + S3 trigger |
| 費用模型 | 固定(機器一直開) | 按調用次數(不用就不付) |
| 擴展 | 手動 / ASG | 自動(Lambda 並行上限 1000) |
如果你讀過 Infra 系列的 Serverless 和 Cloud 系列的 Serverless vs Server,這篇就是那些概念在 AWS 上的實作版。Cold Start 的深入分析和費用交叉點,看 Cloud 系列的 實戰篇。
K8s 映射
| AWS Serverless | K8s 對應 |
|---|---|
| Lambda | Knative Serving / OpenFaaS |
| API Gateway | Ingress Controller + custom routing |
| EventBridge | NATS / Kafka / CloudEvents |
| EventBridge Scheduler | CronJob |
| Step Functions | Argo Workflows / Temporal |
| SQS + Lambda | KEDA(event-driven autoscaling) |
系列導覽
Serverless 最大的價值不是「不用管 server」,是「讓你只付你真正用到的錢」——但前提是你用對場景。