🗺️ AWS 服務地圖
運算與容器・Serverless 與 PaaS・CLF-C02/SAA-C03/DVA-C02

Lambda 與 API Gateway:不開伺服器也能上線一支 API

有請求才執行、按次數與執行時間計費、流量一來自動加開。這一頁算給你看並行數與成本是怎麼來的,也讓你分辨哪些工作根本不該放進 Lambda。

成本與並行計算器(示意單價) 情境分診:Lambda 還是容器 主控台 × CLI × CloudFormation 同步操作

💡 先搞懂問題

虛構的「晴空食品」要讓會員在 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 要呼叫函式,也需要函式這一側同意。

請求量(示意) 20:00 促銷推播 EC2 ×2 整天開著 尖峰可能不夠 大部分時間在空轉,仍按小時計費 Lambda 有請求才算 0 時8 時16 時24 時 橘色區塊代表實際執行的時間,尖峰時同時執行的份數自動變多
同一條流量曲線下,固定開機的伺服器按時間計費;Lambda 只按「有請求」的那些時間計費,尖峰時自動準備更多執行環境。圖中的流量與區塊大小都是示意,實際划不划算要算過,實驗室一就是在做這件事。

生活比喻:外送平台的臨時外送員

想像一家餐廳不自己養外送員,而是把外送交給外送平台。平時沒有訂單,平台不會派任何人來,也不收錢;一有訂單,平台就找一位在線的外送員出門,餐廳依「趟數」和「這一趟花了多久」付錢。晚上八點促銷,同時湧進三十張訂單,平台就同時派三十位外送員,不用餐廳事先排班。

不過,每位外送員第一趟出門前要先熱車、戴好裝備,這一趟會慢一點;送完之後如果在附近待命,下一張單就能馬上出發。平台也有規定:一趟最多只能跑一段固定時間,同一時間在線的外送員人數有上限,超過上限的訂單只好請客人稍等或改天再訂。餐廳不能直接對路上的外送員喊話,客人是透過平台的接單櫃台下單,櫃台確認訂單沒問題,才交給外送員。外送員身上那張工作證,決定了他能進哪些大樓、能拿哪些貨。

回到 AWS:一張訂單就是一個事件,外送員是 Lambda 準備的執行環境,他跑的那一趟是一次呼叫(invocation)。按趟數與時間付錢,對應 Lambda 依請求數與執行時間 × 記憶體(GB-秒)計費;同時派出幾位外送員,就是並行數;在線人數上限是每個區域的帳戶並行上限(預設 1,000)。第一趟要熱車是冷啟動,送完在附近待命對應執行環境被保留下來重複使用(暖啟動)。一趟最長的時間限制是逾時(timeout),最長 900 秒(15 分鐘)。接單櫃台是 API Gateway,工作證是執行角色。
外送平台(比喻) AWS 的正式名稱 一張訂單 一位外送員 按趟數與時間計酬 同時派出很多位、在線人數上限 第一趟要先熱車 平台的接單櫃台 外送員的工作證 事件(event) 執行環境(execution environment) 請求數 + GB-秒 並行數、帳戶並行上限 冷啟動(cold start) Amazon API Gateway 執行角色(IAM role)
左欄是比喻,右欄是正式名稱。實驗室一的四個輸入,剛好對應「每月幾張單、每趟多久、派多大台的車、尖峰時每秒幾張單」。

這個比喻有三個地方和實際不同。第一,外送員的車子大小和趟數費無關,Lambda 卻是「記憶體越大,每毫秒越貴」;但記憶體也決定分到多少 CPU(官方說明 1,769 MB 約等於一個 vCPU),所以加大記憶體常讓執行時間縮短,總費用不一定變高。第二,一位外送員可以順路同時送兩單,標準的 Lambda 執行環境一次只處理一個請求,同時十個請求就要十個執行環境,這也是並行數的算法基礎。第三,送完待命多久由平台決定,Lambda 也不保證執行環境會留多久,程式不能假設上一次呼叫留在記憶體裡的資料一定還在。

會員 App HTTPS 請求 API Gateway HTTP API 節流、授權、路由 Lambda 函式 lambda_handler (event, context) DynamoDB (示意) 函式的資源型政策 允許 API Gateway 呼叫我 執行角色:函式能做什麼 寫 CloudWatch Logs、讀資料表 CloudWatch Logs /aws/lambda/函式名稱 寫日誌 ①②③
操作教學要建的就是這張圖:一個 HTTP API、一個 Lambda 函式、一個執行角色,再加上一條「允許 API Gateway 呼叫函式」的許可。黃色與綠色是兩個方向不同的權限,很多人只設了其中一個,結果 API 回傳錯誤或函式寫不了日誌。
執行環境 環境 1環境 2環境 3環境 4 尚未需要 這一刻並行 = 3 初始化冷啟動後 重複使用(暖)
灰色是初始化(下載程式、啟動執行時期、跑 handler 外面的初始化程式碼),只在新建執行環境時發生。虛線那一刻有三個請求同時在跑,並行就是 3。平均來看,並行數約等於「每秒請求數 × 平均執行秒數」,實驗室一用的就是這個官方公式。圖中時間為示意。

🎮 互動實驗室一:成本與並行計算器

先選一個情境,或自己調整左邊的輸入:每月請求數、平均執行時間、記憶體大小、尖峰時每秒請求數,以及架構、呼叫方式與酬載大小。右邊會即時算出每月的 GB-秒、用示意單價換算的成本,以及尖峰需要的並行數,並和官方上限逐項比對。示意單價的單位是「點」,只保留請求費與運算費的大致比例,不是實際價格;實際價格依區域與時間而不同,請以 AWS Lambda 定價頁與 AWS Pricing Calculator 為準。每個情境下方有一題小挑戰,先猜再看答案。

一、輸入

一個月內函式被呼叫的總次數
計費以 1 毫秒為單位
可設 128~10,240 MB,CPU 隨記憶體等比例分配
用來估算尖峰並行數;假設尖峰至少持續一個執行時間
架構
呼叫方式
示意單價(點)x86_64arm64
每 100 萬次請求22
每 1 萬 GB-秒1.61.3

示意單價只反映「arm64 每 GB-秒較便宜、請求費兩種架構相同」這個關係,數字本身為示意。

二、計算結果

GB-秒 = 每月請求數 × 平均執行秒數 × 記憶體(GB,MB ÷ 1,024)
示意成本 = 請求數 ÷ 100 萬 × 請求單價 + GB-秒 ÷ 1 萬 × 運算單價
並行數 ≈ 每秒請求數 × 平均執行秒數
每月 GB-秒—
每月示意成本—
尖峰並行數—
整月平均並行數—每月請求數 ÷ 30 天的秒數 × 平均執行秒數
請求費運算費(GB-秒)
尖峰並行 vs 帳戶預設上限 1,000
刻度到 2,000;黑線是每個區域的預設帳戶並行上限 1,000。下方每個方塊代表約 1 個執行環境(示意)。
挑戰
挑戰猜中 0 / 0
畫面說明:載入中。

上限依 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。答完會說明理由,選錯時會告訴你你選的那一項卡在哪裡;右邊的事實卡會亮起這題用得到的限制。

得分 0 / 0
連續答對 0
畫面說明:載入中。

事實依 AWS 官方文件,查證時間 2026 年 10 月:Lambda 逾時最長 900 秒、不提供 GPU;Fargate 不支援 GPU;Step Functions Standard 工作流程最長執行 1 年;SQS 訊息最多保留 14 天。情境中的公司皆為虛構。

🛠️ 操作教學:建立 Lambda 函式並接上 HTTP API

不用登入 AWS,也能先把流程走一遍。左邊是簡化的管理主控台,照步驟填表、按按鈕;右邊同步顯示等效的 AWS CLI、CloudFormation 範本與函式程式碼,黃色底的那幾行就是目前這一步對應的內容。你可以故意填錯看看驗證訊息,也可以改函式名稱、區域、執行時期或記憶體,看指令怎麼跟著變。Lambda 繁體中文主控台把 function 譯為「函數」,這一頁的說明文字則用台灣較常見的「函式」,兩者指的是同一個東西。

示意畫面:簡化重繪,只保留和本主題有關的欄位;實際畫面以 AWS 管理主控台為準。
雲端主控台搜尋服務、功能與文件
同一件事的三種做法:管理主控台、AWS CLI、CloudFormation 最後呼叫的是同一組 AWS API:IAM 的 CreateRole、Lambda 的 CreateFunction 與 AddPermission、API Gateway 的 CreateApi。差別在「誰來記住你做了什麼」。主控台適合第一次建立、想看每個欄位說明,而且它會替你做掉幾件事,例如自動建立執行角色、新增觸發條件時自動加上呼叫許可。CLI 適合寫成腳本或在 CloudShell 快速調整單一設定,但每一步都要自己來,漏掉 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 授權,並設定節流。

☁️ 對照 Azure 的做法:Azure 對應的是 Azure Functions。最大的差異是 Azure Functions 的 HTTP 觸發程序本身就提供網址,不必另外建立閘道;需要 API 金鑰、節流、版本管理時,再把 Azure API Management 放在前面,角色相當於 API Gateway。計費與逾時上限也依代管方案而不同(例如 Flex Consumption 依用量計費),不像 Lambda 統一是 900 秒。函式存取其他資源時,Azure 用受控識別,對應 Lambda 的執行角色。可以到 Azure 站的 Azure Functions 節點對照。

📘 原理補完

執行模型:處理常式、初始化與冷啟動

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 個執行環境,所以瞬間從零衝到幾千個並行,需要一點時間才能全部就緒。

① 同步② 非同步③ 事件來源對應 API Gateway Lambda 呼叫端等結果錯誤由呼叫端處理 S3、SNS、EventBridge 內部佇列 Lambda Lambda 自己重試失敗送目的地或 DLQ SQS、Kinesis、DynamoDB Streams Lambda Lambda 主動輪詢一次交一批記錄 請求回應 輪詢
同一支函式可以被不同方式觸發,重試責任卻完全不同:同步呼叫出錯,由呼叫端(例如 App)決定要不要重送;非同步呼叫由 Lambda 重試,並可設定失敗目的地(destinations)或寄不出的信件佇列(DLQ);事件來源對應由 Lambda 去拉資料,SQS 的訊息處理失敗會在可見性逾時後重新出現。

三種呼叫方式

同步呼叫(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 或資料庫回應的函式,加大記憶體就只是多付錢。

同一個 CPU 密集函式,三種記憶體設定(示意) 512 MB1,024 MB2,048 MB 800 毫秒 400 毫秒 300 毫秒 0.4 GB-秒0.4 GB-秒・快一倍0.6 GB-秒 GB-秒 = 記憶體(GB)× 執行秒數;記憶體加倍、時間減半,費用不變
執行時間是示意數字,真實的縮短比例要實測。AWS 提供開源的 Lambda Power Tuning 工具,以及 AWS Compute Optimizer 的 Lambda 記憶體建議,可以幫你找到成本與速度的平衡點。

權限的兩個方向

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想呼叫函式 Lambda 函式qk-points-api CloudWatch Logs DynamoDB(示意) 資源型政策(掛在函式上) 誰可以呼叫我?lambda add-permission 執行角色(信任政策 + 權限政策) 我可以呼叫誰?iam create-role、attach-role-policy
黃色是「進來」的權限,綠色是「出去」的權限。API 回傳 500 而函式日誌一筆都沒有,多半是少了黃色那條;函式有執行但存取資料表出現 AccessDenied,就是綠色那邊少了權限。

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 APIREST APILambda 函式 URL
定位精簡、低成本的 API 前門功能完整的 API 管理單一函式的 HTTPS 端點
授權JWT、Lambda 授權者、IAMCognito、Lambda 授權者、IAM、API 金鑰IAM 或不驗證(NONE)
API 金鑰、使用量方案、快取、WAF無有無
整合逾時最長 30 秒預設上限 29 秒(區域與私有 API 可申請提高)依函式逾時
酬載上限10 MB10 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 FunctionsStandard 最長 1 年每一步交給 Lambda 或其他服務Standard 依狀態轉換多步驟、重試與補償、人工核准單一步驟的簡單事件
Fargate(ECS)可長時間常駐服務擴展政策或工作排程vCPU 與記憶體的執行期間容器化 Web 服務、長時間批次、長連線需要 GPU、想完全事件驅動
EC2不限Auto Scaling 群組執行個體運轉時間GPU、作業系統控制、特殊授權零星短工作(大部分時間空轉)
單次超過 15 分鐘、或要長連線常駐? 需要 GPU 或作業系統控制? 多步驟、要重試補償或等核准? 流量突發、可延後處理? EC2 Fargate Step Functions Lambda+SQS Lambda 是否 是否 是否 是否
這是實驗室二背後的判斷順序。先排除 Lambda 做不到的事(時間、長連線、GPU),再看是不是多步驟流程,最後才看流量形狀。固定對外 IP 不在這張圖裡,因為 Lambda 連接 VPC 後經 NAT 閘道就能做到。
直接同步呼叫 先進佇列再消化 搶購尖峰(示意) Lambda並行已滿 超出的同步請求被節流(429) 下游資料庫連線數也一起爆量 API收單即回 SQS Lambda最大並行 50 尖峰被佇列吸收,訊息最多可保留 14 天 下游壓力固定,失敗訊息可進 DLQ
右邊的最大並行 50 是示意設定(SQS 事件來源對應可以設定最大並行數)。代價是使用者拿不到即時處理結果,要改成「已收單,稍後通知」的流程;對需要立即回應的查詢 API 就不適用。

判斷步驟

  1. 先看單次工作要跑多久:超過 900 秒,拆成 Step Functions 的多個步驟,或改用 Fargate、AWS Batch。
  2. 要長時間維持連線、在記憶體裡保存狀態、或跑常駐程序:選 Fargate(容器)或 EC2。
  3. 需要 GPU、要登入主機調整作業系統或核心參數:選 EC2。
  4. 流程有多個步驟、需要重試、補償或等待人工核准:用 Step Functions 串起來,每一步可以是 Lambda。
  5. 流量突發而且處理可以延後:API 收下請求寫進 SQS,Lambda 用事件來源對應依設定的並行消化。
  6. 剩下的短時間、事件驅動工作:直接用 Lambda;要對外提供 HTTPS API 就加上 API Gateway HTTP API,需要 API 金鑰、快取或 WAF 改用 REST API。
  7. 上線前用「每秒請求數 × 平均執行秒數」估算尖峰並行,和帳戶上限比較;不夠就申請提高配額、縮短執行時間,或用保留並行保護重要函式。

同一件事,用 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