💡 先搞懂問題
虛構的「晴空食品」要讓會員在 App 裡查詢點數。這支查詢 API 每次只要讀一筆資料、回傳一小段 JSON,大約一百毫秒就做完;白天幾乎沒人用,晚上八點促銷推播一發,幾分鐘內湧進大量請求。最直覺的做法是開兩台 EC2 執行個體(instance),前面放一個負載平衡器,二十四小時待命。結果是大部分時間機器在空轉付錢,作業系統要修補,促銷那幾分鐘又可能不夠用,得另外設定自動擴展。
AWS Lambda 換了一種思路:你只交出一段程式,也就是函式(function),告訴 AWS「發生某件事時執行它」。這件事叫事件(event),可以是一個 HTTP 請求、一個上傳到 S3 的檔案、一則 SQS 訊息或一個排程時間。沒有事件時不執行、不計運算費;事件一來,Lambda 準備一個執行環境(execution environment)跑你的程式,同時湧進很多事件,就同時準備很多個。這就是 Serverless(無伺服器)的意思:伺服器還在,只是由 AWS 管理,你不用挑規格、不用修補、不用決定要開幾台。
新手最常卡住的地方有四個。第一,Lambda 函式本身沒有給一般使用者呼叫的網址,要靠 Amazon API Gateway 這類服務在前面接收 HTTPS 請求再轉交給函式。第二,「同時有幾個請求正在執行」叫做並行(concurrency),帳戶在每個區域(Region)有上限,超過就會被節流(throttle)。第三,執行環境第一次建立時要先下載程式、啟動執行時期、跑初始化程式碼,這段額外延遲叫冷啟動(cold start)。第四,函式要寫日誌、讀資料庫,需要一個執行角色(execution role)授權它;反過來,API Gateway 要呼叫函式,也需要函式這一側同意。
生活比喻:外送平台的臨時外送員
想像一家餐廳不自己養外送員,而是把外送交給外送平台。平時沒有訂單,平台不會派任何人來,也不收錢;一有訂單,平台就找一位在線的外送員出門,餐廳依「趟數」和「這一趟花了多久」付錢。晚上八點促銷,同時湧進三十張訂單,平台就同時派三十位外送員,不用餐廳事先排班。
不過,每位外送員第一趟出門前要先熱車、戴好裝備,這一趟會慢一點;送完之後如果在附近待命,下一張單就能馬上出發。平台也有規定:一趟最多只能跑一段固定時間,同一時間在線的外送員人數有上限,超過上限的訂單只好請客人稍等或改天再訂。餐廳不能直接對路上的外送員喊話,客人是透過平台的接單櫃台下單,櫃台確認訂單沒問題,才交給外送員。外送員身上那張工作證,決定了他能進哪些大樓、能拿哪些貨。
這個比喻有三個地方和實際不同。第一,外送員的車子大小和趟數費無關,Lambda 卻是「記憶體越大,每毫秒越貴」;但記憶體也決定分到多少 CPU(官方說明 1,769 MB 約等於一個 vCPU),所以加大記憶體常讓執行時間縮短,總費用不一定變高。第二,一位外送員可以順路同時送兩單,標準的 Lambda 執行環境一次只處理一個請求,同時十個請求就要十個執行環境,這也是並行數的算法基礎。第三,送完待命多久由平台決定,Lambda 也不保證執行環境會留多久,程式不能假設上一次呼叫留在記憶體裡的資料一定還在。
🎮 互動實驗室一:成本與並行計算器
先選一個情境,或自己調整左邊的輸入:每月請求數、平均執行時間、記憶體大小、尖峰時每秒請求數,以及架構、呼叫方式與酬載大小。右邊會即時算出每月的 GB-秒、用示意單價換算的成本,以及尖峰需要的並行數,並和官方上限逐項比對。示意單價的單位是「點」,只保留請求費與運算費的大致比例,不是實際價格;實際價格依區域與時間而不同,請以 AWS Lambda 定價頁與 AWS Pricing Calculator 為準。每個情境下方有一題小挑戰,先猜再看答案。
一、輸入
| 示意單價(點) | x86_64 | arm64 |
|---|---|---|
| 每 100 萬次請求 | 2 | 2 |
| 每 1 萬 GB-秒 | 1.6 | 1.3 |
示意單價只反映「arm64 每 GB-秒較便宜、請求費兩種架構相同」這個關係,數字本身為示意。
二、計算結果
示意成本 = 請求數 ÷ 100 萬 × 請求單價 + GB-秒 ÷ 1 萬 × 運算單價
並行數 ≈ 每秒請求數 × 平均執行秒數
上限依 AWS Lambda 開發人員指南「Lambda 配額」與「了解 Lambda 函式擴展」、API Gateway「HTTP API 配額」(查證時間 2026 年 10 月):逾時最長 900 秒;記憶體 128~10,240 MB;同步呼叫的請求與回應各 6 MB、非同步呼叫 1 MB;每個區域預設帳戶並行 1,000,可申請提高,新帳戶的配額可能較低並依用量自動調高;每個函式每 10 秒最多新增 1,000 個執行環境;HTTP API 的整合逾時最長 30 秒、酬載最大 10 MB。
🎮 互動實驗室二:情境分診台
每張卡是一個虛構公司的需求,請替它選最合適的做法:直接用 Lambda、用 SQS 先收下再交給 Lambda 非同步處理、用 Step Functions 串起多個步驟、用 ECS 搭配 Fargate 跑容器,或用 EC2 自己管主機。先找卡片裡的「硬需求」:單次要跑多久、要不要長連線或常駐程序、要不要 GPU、流量是不是突發、需不需要固定的對外 IP。答完會說明理由,選錯時會告訴你你選的那一項卡在哪裡;右邊的事實卡會亮起這題用得到的限制。
事實依 AWS 官方文件,查證時間 2026 年 10 月:Lambda 逾時最長 900 秒、不提供 GPU;Fargate 不支援 GPU;Step Functions Standard 工作流程最長執行 1 年;SQS 訊息最多保留 14 天。情境中的公司皆為虛構。
🛠️ 操作教學:建立 Lambda 函式並接上 HTTP API
不用登入 AWS,也能先把流程走一遍。左邊是簡化的管理主控台,照步驟填表、按按鈕;右邊同步顯示等效的 AWS CLI、CloudFormation 範本與函式程式碼,黃色底的那幾行就是目前這一步對應的內容。你可以故意填錯看看驗證訊息,也可以改函式名稱、區域、執行時期或記憶體,看指令怎麼跟著變。Lambda 繁體中文主控台把 function 譯為「函數」,這一頁的說明文字則用台灣較常見的「函式」,兩者指的是同一個東西。
add-permission,API 就會回傳錯誤。CloudFormation 把角色、函式、API 與許可寫成一份可版本控管的範本,部署成一個堆疊(stack),適合正式環境與多個環境重複部署;刪除堆疊時,堆疊建立的資源會一起刪除,練習完收拾最乾淨。以 Lambda 為主的專案,也常改用 AWS SAM 的簡寫範本,原理補完有一段說明。
自己動手時要注意
權限:跟著 CLI 做,你的 IAM 身分需要建立角色與附加政策(iam:CreateRole、iam:AttachRolePolicy)、把角色交給 Lambda(iam:PassRole)、建立函式與新增許可(lambda:CreateFunction、lambda:AddPermission)、建立 HTTP API,以及讀取 CloudWatch Logs 的權限。用 CloudFormation 時還要能建立堆疊,範本裡有指定名稱的 IAM 角色,部署時要加上 --capabilities CAPABILITY_NAMED_IAM 表示你知道它會建立 IAM 資源。iam:PassRole 是最容易漏掉的一項:它控制「誰可以把哪個角色交給服務使用」,正式環境應該只允許交出指定的角色。
費用:Lambda 依請求數與 GB-秒計費,HTTP API 依請求數計費,CloudWatch Logs 依寫入與保存的日誌量計費。2025 年 7 月 15 日以後建立的新帳戶採用新的 Free Tier:註冊時給抵用金,完成包含 Lambda 在內的幾項入門活動可以再拿到抵用金;選「免費方案」的帳戶在 6 個月到期或抵用金用完時會自動關閉。這個練習的用量很小,但 API 是公開網址,練習完請刪除,避免被別人持續呼叫。
刪除:CloudFormation 建立的就刪除堆疊;用 CLI 建立的照下面的順序刪。Lambda 自動建立的日誌群組不是堆疊或函式的一部分,刪除函式後它還會留著,記得一起刪。
# 用 CloudFormation 建立的:刪除堆疊,角色、函式、API、許可一起刪除
aws cloudformation delete-stack --stack-name qk-points-stack --region ap-northeast-1
# 用 CLI 建立的:依序刪除 API、函式、角色與日誌群組
# a1b2c3d4e5 換成你的 ApiId(可用 aws apigatewayv2 get-apis 查詢)
aws apigatewayv2 delete-api --api-id a1b2c3d4e5 --region ap-northeast-1
aws lambda delete-function --function-name qk-points-api --region ap-northeast-1
aws iam detach-role-policy --role-name qk-points-api-role --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
aws iam delete-role --role-name qk-points-api-role
aws logs delete-log-group --log-group-name /aws/lambda/qk-points-api --region ap-northeast-1
範例裡的帳戶 ID 111122223333 與 API ID a1b2c3d4e5 都是佔位字,請換成自己的值。不要把存取金鑰、資料庫密碼寫進函式程式碼或環境變數的明文裡;函式需要存取其他 AWS 服務時,一律透過執行角色取得臨時憑證,需要密碼或 API 金鑰時放在 AWS Secrets Manager。正式上線的 API 不要維持「開放」:至少加上 JWT 授權(例如 Amazon Cognito)或 IAM 授權,並設定節流。
📘 原理補完
執行模型:處理常式、初始化與冷啟動
Lambda 函式的入口叫處理常式(handler),Python 寫成 def lambda_handler(event, context):event 是觸發來源送來的資料(HTTP API 送來的是含路徑、標頭、查詢字串的 JSON),context 帶有請求 ID、剩餘時間、日誌群組名稱等執行資訊。主控台與 CLI 用「檔名.函式名」指定處理常式,例如 lambda_function.lambda_handler。
新的執行環境建立時,Lambda 先下載程式碼、啟動執行時期(runtime),再執行 handler 外面的程式碼,這一段是初始化(Init);之後每個請求只執行 handler。官方建議把 SDK 用戶端、資料庫連線這類昂貴的物件放在 handler 外面,讓暖的執行環境重複使用。冷啟動通常只影響一小部分請求,但對延遲敏感的 API 很明顯。降低冷啟動的方法有三種:縮小部署套件與初始化的工作量;對支援的執行時期開啟 SnapStart,從初始化完成後的快照恢復;或設定佈建並行(provisioned concurrency),讓指定數量的執行環境事先初始化好、隨時待命,這部分不論有沒有請求都會計費。
並行有兩個容易混淆的設定。保留並行(reserved concurrency)替某個函式保留一段並行額度,同時也是它的上限:保留 50,這個函式最多同時跑 50 個,也不會被其他函式搶光;設成 0 等於暫停這個函式。帳戶上限是區域內所有函式共用的,官方規定不論上限多少,都會留 100 給沒有設定保留並行的函式。佈建並行則是解決冷啟動,不改變上限。擴展速度另有限制:每個函式每 10 秒最多新增 1,000 個執行環境,所以瞬間從零衝到幾千個並行,需要一點時間才能全部就緒。
三種呼叫方式
同步呼叫(synchronous):呼叫端等函式跑完拿結果,API Gateway、Lambda 函式 URL、aws lambda invoke 預設都是這種。請求與回應各最大 6 MB,被節流時直接收到錯誤(經 API Gateway 時,用戶端通常看到 HTTP 429 或 5xx)。非同步呼叫(asynchronous):S3、SNS、EventBridge 把事件交給 Lambda 後就離開,事件先進 Lambda 的內部佇列,酬載最大 1 MB;函式出錯時 Lambda 會自動重試,遇到節流也會在事件的最長存留時間內再試,最後仍失敗的可以送到失敗目的地。事件來源對應(event source mapping):Lambda 主動輪詢 SQS、Kinesis、DynamoDB Streams 等來源,一次批次交給函式;搭配 SQS 時,佇列的可見性逾時要比函式逾時長,否則訊息還在處理就會被別人再收一次。
計費:請求數加上 GB-秒
Lambda 的費用由兩部分組成:每一次呼叫算一次請求;執行時間以 1 毫秒為單位,乘上配置的記憶體換算成 GB-秒。例如記憶體 1,024 MB(1 GB)的函式跑 120 毫秒,一次是 0.12 GB-秒,跑 300 萬次就是 36 萬 GB-秒。arm64(Graviton)架構每 GB-秒的單價比 x86_64 低,請求費相同。佈建並行、超過預設 512 MB 的 /tmp 暫存空間、跨區域資料傳輸會另外計費。因為 CPU 隨記憶體等比例增加,CPU 密集的函式加大記憶體常讓執行時間等比例縮短,GB-秒不變甚至更少,延遲卻明顯改善;只等外部 API 或資料庫回應的函式,加大記憶體就只是多付錢。
權限的兩個方向
Lambda 的權限要從兩個方向看。函式能做什麼由執行角色決定:它是一個 IAM 角色,信任政策(trust policy)允許 lambda.amazonaws.com 擔任它,權限政策再列出函式能呼叫的 API。最基本的是 AWS 受管政策 AWSLambdaBasicExecutionRole,只允許建立日誌群組與寫入日誌;要讀 DynamoDB,就再加上指定資料表的讀取權限,不要直接給整個服務的完整權限。誰能呼叫函式則由函式的資源型政策(resource-based policy)決定:aws lambda add-permission 就是在這份政策加一條「允許 apigateway.amazonaws.com,而且來源是這個 API」的陳述式。主控台新增 API Gateway 觸發條件時會自動加上這條;用 CLI 快速建立 HTTP API 則不會,要自己加。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "lambda.amazonaws.com" },
"Action": "sts:AssumeRole"
}
]
}
上面是執行角色的信任政策(trust-policy.json):它只說明「Lambda 服務可以擔任這個角色」,不包含任何權限;權限來自另外附加的 AWSLambdaBasicExecutionRole。
API Gateway:HTTP API、REST API 與 WebSocket API
API Gateway 有三種 API。這一頁用的 HTTP API 設計得精簡、較便宜、延遲較低,支援 JWT 授權、Lambda 授權者與 IAM 授權,還有「快速建立」:給一個 Lambda ARN,就自動建好預設的全捕捉路由、整合與自動部署的 $default 階段。REST API 功能最完整,需要 API 金鑰與使用量方案、回應快取、請求驗證、AWS WAF 或私有端點時選它。WebSocket API 用在聊天、即時看板這類雙向長連線。另外,只需要一個 HTTPS 網址呼叫單一函式、不需要路由與節流這些 API 管理功能時,也可以用 Lambda 函式 URL(function URL),它直接掛在函式上。
| 項目 | HTTP API | REST API | Lambda 函式 URL |
|---|---|---|---|
| 定位 | 精簡、低成本的 API 前門 | 功能完整的 API 管理 | 單一函式的 HTTPS 端點 |
| 授權 | JWT、Lambda 授權者、IAM | Cognito、Lambda 授權者、IAM、API 金鑰 | IAM 或不驗證(NONE) |
| API 金鑰、使用量方案、快取、WAF | 無 | 有 | 無 |
| 整合逾時 | 最長 30 秒 | 預設上限 29 秒(區域與私有 API 可申請提高) | 依函式逾時 |
| 酬載上限 | 10 MB | 10 MB | 依 Lambda 同步呼叫 6 MB |
| 適合 | 大多數接 Lambda 的新 API | 對外開放給合作夥伴、需要計量與防護 | webhook、內部小工具 |
查證時間 2026 年 10 月,依 API Gateway 開發人員指南「在 REST API 與 HTTP API 之間選擇」與兩種 API 的配額頁。函式 URL 一列的逾時與酬載是依 Lambda 本身的限制推得。
什麼時候選 Lambda,什麼時候不選
Lambda 最適合短時間、事件驅動、流量起伏大的工作。只要碰到下面任何一個硬需求,就該先想其他選項:單次要跑超過 15 分鐘、需要長時間維持連線或常駐程序、需要 GPU、需要登入主機調整作業系統,或流量大而且全天穩定(這時持續運轉的容器或執行個體,加上 Savings Plans,常常比較便宜)。相反地,「需要固定的對外 IP」並不是放棄 Lambda 的理由:把函式連接到 VPC 的私有子網路,經 NAT 閘道與 Elastic IP 出去即可。突發流量也不一定要換服務,先用 SQS 把請求收下來,讓 Lambda 依可控的速度消化,常常是最省事的解法。
| 做法 | 單次執行時間 | 擴展方式 | 計費 | 適合 | 不適合 |
|---|---|---|---|---|---|
| Lambda | 最長 900 秒 | 依請求自動增加執行環境 | 請求數+GB-秒 | API 後端、檔案事件、排程小工作 | 長任務、長連線、GPU |
| Lambda+SQS | 每則訊息仍受 900 秒限制 | 依佇列深度,可設最大並行 | Lambda+SQS 請求 | 突發流量、保護下游、可延後處理 | 要求立即回傳結果 |
| Step Functions | Standard 最長 1 年 | 每一步交給 Lambda 或其他服務 | Standard 依狀態轉換 | 多步驟、重試與補償、人工核准 | 單一步驟的簡單事件 |
| Fargate(ECS) | 可長時間常駐 | 服務擴展政策或工作排程 | vCPU 與記憶體的執行期間 | 容器化 Web 服務、長時間批次、長連線 | 需要 GPU、想完全事件驅動 |
| EC2 | 不限 | Auto Scaling 群組 | 執行個體運轉時間 | GPU、作業系統控制、特殊授權 | 零星短工作(大部分時間空轉) |
判斷步驟
- 先看單次工作要跑多久:超過 900 秒,拆成 Step Functions 的多個步驟,或改用 Fargate、AWS Batch。
- 要長時間維持連線、在記憶體裡保存狀態、或跑常駐程序:選 Fargate(容器)或 EC2。
- 需要 GPU、要登入主機調整作業系統或核心參數:選 EC2。
- 流程有多個步驟、需要重試、補償或等待人工核准:用 Step Functions 串起來,每一步可以是 Lambda。
- 流量突發而且處理可以延後:API 收下請求寫進 SQS,Lambda 用事件來源對應依設定的並行消化。
- 剩下的短時間、事件驅動工作:直接用 Lambda;要對外提供 HTTPS API 就加上 API Gateway HTTP API,需要 API 金鑰、快取或 WAF 改用 REST API。
- 上線前用「每秒請求數 × 平均執行秒數」估算尖峰並行,和帳戶上限比較;不夠就申請提高配額、縮短執行時間,或用保留並行保護重要函式。
同一件事,用 AWS SAM 寫
操作教學的 CloudFormation 範本要寫角色、函式、API、許可四個資源。AWS SAM 是 CloudFormation 的延伸:範本加上 Transform: AWS::Serverless-2016-10-31 之後,可以用 AWS::Serverless::Function 一個資源,加上 Events 裡的 HttpApi,就讓 SAM 在部署時自動展開成執行角色、函式、HTTP API 與呼叫許可。最後產生的仍是標準的 CloudFormation 資源,所以一樣可以用刪除堆疊收拾。下面這份範本也能通過 cfn-lint 檢查,可以用 sam deploy --guided 部署:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Points API with AWS SAM (same function and HTTP API)
Resources:
PointsFunction:
Type: AWS::Serverless::Function
Properties:
Runtime: python3.14
Handler: index.lambda_handler
Architectures:
- arm64
MemorySize: 512
Timeout: 10
InlineCode: |
import json
def lambda_handler(event, context):
return {"statusCode": 200, "body": json.dumps({"ok": True})}
Events:
PointsApi:
Type: HttpApi
Outputs:
ApiUrl:
Value: !Sub 'https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/'
SAM 為 HttpApi 事件自動建立的 API,邏輯 ID 是 ServerlessHttpApi,所以輸出可以直接引用它。
容易考錯的地方
把逾時調大就能跑長任務:逾時最長就是 900 秒,設不到 1,800 秒。題目寫「每次要跑 30 分鐘」,答案是拆成 Step Functions、改用 Fargate 或 AWS Batch,而不是調整 Lambda 設定。
保留並行可以消除冷啟動:不行。保留並行是保證與限制並行數量;消除冷啟動要用佈建並行,Java、Python 等支援的執行時期也可以考慮 SnapStart。題目寫「每天早上第一批請求很慢」,答案是佈建並行。
Lambda 一定比 EC2 便宜:按用量計費在流量零星時很划算,但流量全天穩定又大時,GB-秒累積起來可能比一直開著的容器或執行個體更貴。實驗室一的平均並行數可以幫你判斷:整月平均並行很高,代表函式幾乎一直在跑。
函式要存取 S3 就把存取金鑰放進環境變數:不該這樣做。函式透過執行角色自動取得臨時憑證;需要存取的資源,就在執行角色加上最小權限的政策。
API 回傳錯誤就是函式寫錯:先看 CloudWatch Logs 有沒有這次請求的紀錄。完全沒有紀錄,多半是 API Gateway 沒有呼叫函式的許可、路由不對,或被節流;有紀錄才去看程式錯誤。HTTP API 整合逾時最長 30 秒,函式跑超過 30 秒,用戶端會先收到逾時,即使函式還在執行。
HTTP API 與 REST API 搞混:題目要求 API 金鑰、使用量方案、回應快取、AWS WAF 或私有端點,選 REST API;只要便宜、低延遲地接 Lambda 並用 JWT 授權,選 HTTP API。
相關考試:CLF-C02、SAA-C03、DVA-C02 的 in-scope 服務都包含 AWS Lambda、Amazon API Gateway、Amazon SQS 與 AWS Step Functions;DVA-C02 的領域任務直接點名 Lambda 的記憶體、並行、逾時、destinations 與錯誤處理,以及用 AWS SAM 封裝部署。
✅ 自我檢測
6 題原創題,選完立即顯示對錯與解析,全部作答後會出現總分。目前得分:0 / 6