examlab .net 用最有效率的方法,考取最有價值的認證
Vol. I
本篇導覽 約 36 分鐘

AWS Lambda 基礎

7,100 字 · 約 36 分鐘閱讀 ·

DVA-C02 完整備考指南:深入解析 AWS Lambda 基礎,涵蓋各執行環境的 handler 簽名、同步 vs 非同步 vs Poll-based 事件來源、執行環境支援、記憶體 128–10240 MB、15 分鐘逾時上限、/tmp 最多 10 GB、KMS 加密的環境變數、Lambda Layers、Extensions、容器映像、VPC 設定、執行角色、Destinations、版本、別名、SnapStart、Provisioned 與 Reserved 並行控制……

立即做 20 題練習 → 免費 · 不用註冊 · DVA-C02

AWS Lambda 是整個 AWS Certified Developer Associate(DVA-C02)考試中出題頻率最高的單一服務。考綱任務說明 1.2「Develop code for AWS Lambda」只有一行字,但它衍生出的考題幾乎涵蓋 AWS Lambda 的每個角落:各執行環境的 handler 簽名、同步 vs 非同步 vs Poll-based 事件來源、記憶體與逾時調校、/tmp 暫存空間、Lambda Layers、Lambda Extensions、容器映像、VPC 網路、執行角色、Destinations、版本、別名、SnapStart、Provisioned Concurrency、Reserved Concurrency、X-Ray 主動追蹤,以及 Power Tuning。本章訓練你辨認 DVA-C02 可能考到的每一個 AWS Lambda 概念,並在時間壓力下精準對應到正確答案。AWS Lambda 值得你投入 10–15% 的總學習時間;熟透 AWS Lambda 基礎,是你在 DVA-C02 能做的單一報酬率最高的投資。

AWS Lambda 是什麼?

AWS Lambda 是一種無伺服器運算服務,會在回應事件時執行你的程式碼。使用 AWS Lambda,你只需上傳函式、設定觸發條件,AWS Lambda 便會自動佈建執行環境、擴展並行數、修補底層作業系統,並且只依程式碼實際執行的毫秒數計費。AWS Lambda 移除了 handler 函式以下的所有基礎架構管理層。在 DVA-C02 考試中,AWS Lambda 是事件驅動工作負載、API 後端、串流處理器,以及 AWS 服務間膠水程式碼的預設運算基礎。

AWS Lambda 在 DVA-C02 考試地圖上的位置

在 DVA-C02 中,AWS Lambda 橫跨每個領域:

  • 領域 1(開發,32%):handler 簽名、事件來源、並行控制、Layers、環境變數、Destinations、版本、別名。
  • 領域 2(安全,26%):AWS Lambda 執行角色、以資源為基礎的政策、AWS KMS 加密環境變數、VPC 設定。
  • 領域 3(部署,24%):AWS Lambda 容器映像、AWS SAM 範本、CodeDeploy 搭配 AWS Lambda 別名的金絲雀與線性流量切換。
  • 領域 4(疑難排解,18%):AWS Lambda 冷啟動、Provisioned Concurrency、Reserved Concurrency、X-Ray 主動追蹤、Lambda Power Tuning。

無論考題瞄準哪個領域,AWS Lambda 幾乎都是正確答案或關鍵配角。把 AWS Lambda 基礎背熟,領域 1 的得分就像開外掛。

AWS Lambda 執行模型鳥瞰

每次 AWS Lambda 呼叫都遵循相同生命週期:(1)AWS Lambda 透過 AWS SDK 或事件來源接收呼叫;(2)AWS Lambda 選擇現有的暖執行環境,或初始化一個新環境(冷啟動);(3)執行環境載入你的 handler;(4)handler 處理事件並回傳回應或拋出錯誤;(5)AWS Lambda 凍結環境以供重複使用。理解這個生命週期,就能解鎖考試中所有的最佳化題型,因為 AWS Lambda 的計費方式、冷啟動行為、連線重用,以及 /tmp 的持久性,全都源自這個模型。

白話文解釋 AWS Lambda

AWS Lambda 講白了就是「只丟食譜,廚房不用你管」的雲端函式服務。用下面三種類比,AWS Lambda 的幾個抽象概念一次就記牢。

類比一 — 雲端共享廚房

把 AWS Lambda 想成一間共享雲端廚房。你把食譜(handler code)寄給廚房,廚房才會開火;外送訂單來一張(event)就炒一盤;你最多只能讓廚師炒 15 分鐘(AWS Lambda 逾時上限 900 秒),炒完立刻熄火。廚房的瓦斯、鍋具、洗碗機(runtime、OS 修補、scaling)全由廚房方負責。你給多少瓦斯(memory 128–10240 MB),火力(CPU)就等比例加大。需要共用醬料罐(shared library)就交給共用食材櫃(Lambda Layers)。若菜色需要進儲藏室拿食材(VPC 內部資源),就得配鑰匙(ENI),但第一次進儲藏室會多花幾百毫秒(cold start)。

AWS Lambda = 雲端廚房,讓你只想食譜,不想油煙。

類比二 — 按次計費的水電工

AWS Lambda 也像「按次計費的水電工」。你家水管爆了(event),你打一通電話(invocation),師傅才上門,做完就走,只收工時費(GB-seconds)。想確保師傅隨時在門口待命?預約制 = Provisioned Concurrency,預先暖機、付待命費、沒有冷啟延遲。怕社區同時太多人叫水電工,把整個公司的師傅搶光?設配額 = Reserved Concurrency,保留 N 個師傅專屬你家。師傅在門口會帶工具包(execution context),下一次叫同一位師傅,他的工具還熱著(warm start)。

AWS Lambda = 按次叫工、隨需擴容、不用養人的雲端水電工。

類比三 — 機場行李輸送帶

AWS Lambda 事件模型像機場的行李輸送帶。同步(synchronous)呼叫像報到櫃檯——旅客(API Gateway request)站在櫃檯等 AWS Lambda 回話,最多等 29 秒(API Gateway 上限)。非同步(asynchronous)呼叫像行李託運——你把行李丟上 S3 櫃檯,人先走,AWS Lambda 自動重試最多 2 次,若失敗送到 DLQ / Destinations 做失物招領。Poll-based 事件來源像行李輸送帶的感應器——AWS Lambda 服務自己巡邏 SQS、Kinesis、DynamoDB Streams,把一批行李(batch)捆好一次處理。

三個類比串起來,AWS Lambda 的「無伺服器 × 事件驅動 × 預暖機 × 批次處理」四大特性就全清晰了。

AWS Lambda execution environment 是一個隔離的微型虛擬機器(Firecracker),負責承載單一並行呼叫。其中包含執行環境、你的部署套件(或容器映像)、/tmp 檔案系統,以及所有 Lambda Extensions。AWS Lambda 在兩次呼叫之間會凍結此環境,並在環境被回收前重複用於暖啟動。 Reference: https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html

AWS Lambda Handler:各執行環境的簽名

每個 AWS Lambda 函式只有一個進入點——handler。handler 簽名因執行環境而異,DVA-C02 很喜歡考哪種語言對應哪種簽名。

Node.js Handler 簽名

對於 Node.js(目前為 Node.js 18.x 與 20.x),AWS Lambda 期望一個 async 函式或 callback 風格的函式:

exports.handler = async (event, context) => {
  // event: 呼叫的 payload,已完成 JSON 解析
  // context: 執行環境後設資料(requestId、剩餘時間、log group)
  return { statusCode: 200, body: "ok" };
};

兩個標準參數為 event(呼叫 payload,已解析為 JSON)與 context(Lambda 執行環境後設資料)。Node.js 原生支援 async/await;舊式 callback 風格 (event, context, callback) 仍可使用。

Python Handler 簽名

對於 Python(3.9、3.10、3.11、3.12),AWS Lambda 期望模組中的一個雙參數函式:

def lambda_handler(event, context):
    return {"statusCode": 200, "body": "ok"}

在 AWS Lambda 主控台或 SAM 範本中,將 handler 設定為 module_name.lambda_handler

Java Handler 簽名

Java(11、17、21)支援兩種風格。AWS Lambda 介面 RequestHandler<I, O>

public class Handler implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {
  public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent event, Context context) { ... }
}

或用於二進位串流的原始 RequestStreamHandler。Java AWS Lambda 函式歷來有最嚴重的冷啟動問題——AWS Lambda SnapStart 正是為此而生。

.NET Handler 簽名

.NET(6、8)的 handler 為靜態或實例方法:

public class Function {
  public APIGatewayProxyResponse FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context) { ... }
}

Handler 設定為 AssemblyName::Namespace.Function::FunctionHandler

Go Handler 簽名

Go 以前有受管理的執行環境;AWS Lambda 現在要求 Go 在 provided.al2023 自訂執行環境或容器映像上搭配 AWS Lambda Go 函式庫執行:

func Handler(ctx context.Context, event events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { ... }
func main() { lambda.Start(Handler) }

Ruby Handler 簽名

Ruby(3.2、3.3)期望一個頂層方法:

def lambda_handler(event:, context:)
  { statusCode: 200, body: "ok" }
end

所有 AWS Lambda handler 都接受 (event, context)。Node.js 回傳值或 Promise;Python 回傳 dict;Java 實作 RequestHandler<I, O>;.NET 使用 ILambdaContext;Go 使用 lambda.Start(Handler);Ruby 使用關鍵字引數 (event:, context:)。記住「event + context,形狀因執行環境而異」,handler 考題就不會失分。 Reference: https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html

AWS Lambda 執行環境支援

AWS Lambda 提供受管理的執行環境,包含語言直譯器、AWS SDK,以及 Lambda runtime API shim。DVA-C02 要求你認識所有受支援的執行環境家族。

受管理執行環境

AWS Lambda 目前提供以下受管理執行環境:

  • Node.js — 18.x、20.x(LTS 版本)。
  • Python — 3.9、3.10、3.11、3.12。
  • Java — 11、17、21(Corretto)。
  • .NET — 6、8(LTS)。
  • Ruby — 3.2、3.3。

較舊的執行環境(Node.js 16、Python 3.7、Java 8、.NET Core 3.1)已棄用或處於「已棄用,執行環境已移除」狀態。在 DVA-C02 中,任何提到「已棄用 Lambda 執行環境」的題目,答案都是遷移至受支援版本。

自訂執行環境與 provided.al2 / provided.al2023

AWS Lambda 透過 provided.al2provided.al2023 基礎執行環境(Amazon Linux 2 與 Amazon Linux 2023)支援自訂執行環境。你需要實作 Lambda runtime API——一個包含 /runtime/invocation/next/runtime/invocation/{requestId}/response/runtime/invocation/{requestId}/error 端點的 HTTP 規範——並以 Lambda Layer 或部署套件的形式提供執行環境。Go、Rust 及任何自訂語言都走這條路。

容器映像部署

AWS Lambda 接受從 Amazon ECR 拉取、大小最多 10 GB 的容器映像。你可以從 AWS 提供的基礎映像(例如 public.ecr.aws/lambda/python:3.12)建立 Docker 映像,或從零開始建立,只要實作 Runtime API 即可。容器映像讓大型 ML 模型、自訂系統函式庫,以及現有容器化 CI/CD 流程都能輕鬆上 Lambda。其餘所有行為——觸發、並行、計費——與 ZIP 部署的 AWS Lambda 函式完全相同。

大多數 AWS Lambda 函式解壓縮後未超過 250 MB 時,選 ZIP 部署。當相依套件解壓縮後超過 250 MB、需要自訂系統函式庫,或團隊已在統一流程中發布容器映像時,選容器映像。10 GB 容器映像上限提供了巨大的相依空間(想想搭配 PyTorch 的 ML 推論)。 Reference: https://docs.aws.amazon.com/lambda/latest/dg/images-create.html

AWS Lambda 事件來源:同步 vs 非同步 vs Poll-based

這是 DVA-C02 上測試頻率最高的 AWS Lambda 概念。每個事件來源都屬於三大類別之一,每個類別的重試、DLQ 與並行行為各不相同。

同步呼叫(Synchronous Invocation)

在同步 AWS Lambda 呼叫中,呼叫端保持連線並等待回應。重試由呼叫端負責。常見同步事件來源:

  • Amazon API Gateway(REST、HTTP、WebSocket)。
  • Application Load Balancer(ALB 目標)。
  • Amazon Cognito(觸發器)。
  • AWS Lambda function URLs
  • AWS SDK Invoke API 搭配 InvocationType=RequestResponse(預設值)。
  • Amazon Lex、Alexa、CloudFront(Lambda@Edge)。

同步 payload 上限:請求與回應各 6 MB

非同步呼叫(Asynchronous Invocation)

在非同步 AWS Lambda 呼叫中,呼叫端將事件交給 AWS Lambda,AWS Lambda 在內部佇列排隊,呼叫端立即收到 202 Accepted。AWS Lambda 隨後再呼叫函式。常見非同步事件來源:

  • Amazon S3 事件通知
  • Amazon SNS
  • Amazon EventBridge(規則與排程器)。
  • AWS SDK Invoke 搭配 InvocationType=Event
  • AWS CodeCommitAWS ConfigAWS IoTAmazon SES(接收規則)。

非同步 payload 上限:每個事件 256 KB

函式回傳錯誤時,非同步呼叫會以指數退避方式重試最多 2 次(共 3 次嘗試)。最終失敗後,AWS Lambda 將事件送往 Dead-Letter Queue(DLQ)或 Lambda Destination(on-failure)。

Poll-based 呼叫(Event Source Mappings)

Poll-based 又稱 event source mappings,表示由 AWS Lambda 本身輪詢來源並批次投遞。常見 poll-based 來源:

  • Amazon SQS(標準佇列與 FIFO 佇列)。
  • Amazon Kinesis Data Streams
  • Amazon DynamoDB Streams
  • Amazon MQ(Apache ActiveMQ、RabbitMQ)。
  • Self-managed / Amazon MSK(Kafka)。
  • Amazon DocumentDB Streams。

AWS Lambda 將訊息批次(可設定批次大小)後同步呼叫函式,成功後從來源刪除訊息(SQS)或推進分片迭代器(Kinesis / DynamoDB Streams)。

同步 = 呼叫端等待、呼叫端重試、6 MB payload。非同步 = 呼叫端一丟了事、AWS Lambda 重試 2 次、256 KB payload、支援 DLQ/Destinations。Poll-based = AWS Lambda 輪詢、批次投遞、以 checkpoint 為基礎。背熟哪個來源屬於哪個類別——這張表能直接回答 30+ 種 DVA-C02 情境題型。 Reference: https://docs.aws.amazon.com/lambda/latest/dg/lambda-invocation.html

AWS Lambda 記憶體、CPU 與逾時

AWS Lambda 依分配的記憶體乘以執行時間計費——因此記憶體設定同時也是 CPU 與成本的決策。

記憶體:128 MB 至 10,240 MB

你可以在 128 MB 至 10,240 MB(10 GB) 之間以 1 MB 為單位設定 AWS Lambda 記憶體。CPU 按記憶體比例分配——約在 1,769 MB 時,函式獲得一個完整 vCPU;在 10,240 MB 時,大約獲得六個 vCPU。這意味著 AWS Lambda 的效能調校本質上就是記憶體調校。

逾時:最長 900 秒

每個 AWS Lambda 函式都有可設定的逾時,範圍從 1 秒到 900 秒(15 分鐘)。預設值為 3 秒——這是生產環境中常見的 bug 來源。若函式超過逾時,AWS Lambda 會終止該次呼叫並記錄 Task timed out after X.XX seconds

暫存空間(/tmp):最多 10 GB

每個 AWS Lambda 執行環境都附帶 /tmp,一個可寫入的暫存檔案系統。預設大小為 512 MB;可設定至最多 10,240 MB(10 GB)/tmp 在同一執行環境的暖啟動呼叫之間持久保留(適合快取已下載的檔案),但環境被回收時會消失。

Payload 上限

  • 同步呼叫:請求與回應各 6 MB。
  • 非同步事件:每個事件 256 KB。
  • 部署套件:直接上傳壓縮檔 50 MB、從 S3 解壓縮後 250 MB。
  • 容器映像:10 GB。

AWS Lambda 的常見生產 bug:保留預設 3 秒逾時,卻呼叫一個需要 5 秒的下游服務。函式逾時,客戶端重試,重複工作不斷堆積。在 DVA-C02 中,若情境提到「逾時」,務必計算:預設 3 秒加上下游延遲是否超過需求?請針對每個函式明確調整逾時設定。 Reference: https://docs.aws.amazon.com/lambda/latest/dg/configuration-function-common.html

AWS Lambda 環境變數與加密

AWS Lambda 環境變數讓你無需重新建置程式碼,就能注入設定(資料庫 URL、功能開關、區域端點)。

明文 vs 加密變數

預設情況下,AWS Lambda 使用 AWS 受管的 KMS 金鑰對靜態環境變數進行加密。若需要額外保護,或要在 Lambda 主控台傳輸過程中加密,可以啟用加密輔助工具並提供客戶自管的 KMS 金鑰。在 handler 內部呼叫 kms:Decrypt 來解密敏感值。DVA-C02 最佳實務:使用 AWS Secrets Manager 或 AWS Systems Manager Parameter Store 存放真正的機密,環境變數保留給非敏感設定。

總大小上限:4 KB

所有 AWS Lambda 環境變數合計不得超過 4 KB。若需要更多設定,可從 Parameter Store 掛載,或在啟動時從 /tmp 讀取。

保留環境變數

AWS Lambda 會注入幾個保留環境變數——AWS_REGIONAWS_LAMBDA_FUNCTION_NAMEAWS_LAMBDA_FUNCTION_VERSIONAWS_LAMBDA_LOG_GROUP_NAMEAWS_LAMBDA_FUNCTION_MEMORY_SIZE,以及憑證變數。你無法覆寫這些變數。

AWS Lambda Layers:共用程式碼與相依套件

Lambda Layers 讓你將共用相依套件與函式程式碼分開打包。

什麼是 Lambda Layer?

Lambda Layer 是一個包含函式庫、自訂執行環境或其他函式相依套件的 ZIP 壓縮檔,上傳一次即可掛載到多個 AWS Lambda 函式。呼叫時,AWS Lambda 會將 Layer 解壓縮到執行環境內的 /opt。你的 handler 從 /opt 匯入,就像這些檔案是打包在函式裡一樣。

Layer 限制

  • 單一 AWS Lambda 函式最多可引用 5 個 Layers
  • 函式程式碼加上所有掛載 Layers 的解壓縮總大小不得超過 250 MB
  • Layers 有版本管控——每次發布都會產生一個新的不可變版本。
  • Layers 可透過以資源為基礎的政策跨帳號共用。

典型 Layer 使用情境

  • 跨微服務群組的共用工具函式庫。
  • 太重而無法內嵌在每個函式中的第三方相依套件(NumPy、Pandas、Sharp)。
  • provided.al2023 基礎的自訂執行環境(Go、Rust、Bash)。
  • AWS Lambda Extensions(見下一節)。

每個 AWS Lambda 函式最多 5 個 Layers。函式程式碼加上所有 Layers 解壓縮後合計最多 250 MB。這兩個數字能直接回答大多數 DVA-C02 的 Layer 考題。 Reference: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html

AWS Lambda Extensions

Lambda Extensions 是在執行環境內與你的 handler 並行執行的伴隨程序。

Extensions 的功能

Extensions 掛入 AWS Lambda 生命週期——INITINVOKESHUTDOWN——並與函式並行執行。它們非常適合用於不應阻塞 handler 的可觀測性代理程式、機密快取,以及設定擷取器。熱門 extensions 包括 AWS AppConfig agent、AWS Parameters and Secrets Lambda Extension、Datadog、New Relic、Dynatrace 與 Lumigo。

內部 vs 外部 Extensions

  • 外部 extensions 以獨立程序執行。它們從 /opt/extensions/ 取得啟動指令、訂閱生命週期事件,並透過 Extensions API 與 AWS Lambda 通訊。在 SHUTDOWN 期間(最多 2 秒)可繼續執行以排清遙測資料。
  • 內部 extensions 在執行環境程序內執行(例如作為 Java 的 JVM agent)。

Extensions 以 Lambda Layers 的形式發布,因此共用 5 個 Layer 與 250 MB 解壓縮的限制。

AWS Lambda VPC 設定

AWS Lambda 函式預設在 AWS 受管的 VPC 中執行。若需要存取私有資源——私有子網路中的 Amazon RDS、ElastiCache、PrivateLink 後端的內部服務——才需要啟用 VPC 存取。

VPC 連接的 Lambda 如何運作

當你將 AWS Lambda 掛接到 VPC 時,需要選擇一或多個子網路和一或多個安全群組。AWS Lambda 使用 Hyperplane ENIs——共用彈性網路介面——即使並行呼叫擴展到數千個,也不會產生數千個 ENI。Hyperplane ENIs 在第一次建立函式或變更設定時延遲佈建,並持久保留以供重複使用。

對冷啟動的影響

歷史上(2019 年以前),VPC AWS Lambda 冷啟動會增加 10 秒以上,因為 AWS Lambda 每個沙箱都會掛接一個專屬 ENI。如今,Hyperplane ENIs 已將 VPC 冷啟動額外開銷縮短至數十毫秒。不過,DVA-C02 仍可能測試這段歷史——請記住,將 AWS Lambda 掛接至 VPC 不再是冷啟動的致命問題,但確實需要在多個可用區域佈建子網路以確保高可用性並規劃 IP 容量。

VPC 掛接 Lambda 的對外網際網路存取

VPC 掛接的 AWS Lambda 無法從私有子網路存取公共網際網路,除非子網路透過 NAT Gateway 路由對外流量,或透過 VPC Endpoint 存取特定 AWS 服務。常見部署模式:VPC 掛接 AWS Lambda + 為 Amazon S3、DynamoDB、Secrets Manager 等服務建立 VPC Endpoint,以避免 NAT 資料傳輸費用。

DVA-C02 經典陷阱:VPC 掛接的 AWS Lambda 因為私有子網路沒有通往網際網路的路由,無法連上 Stripe / Twilio / 公共 API。解法:在公有子網路加一個 NAT Gateway;若目標是 AWS 服務(S3、DynamoDB、Secrets Manager、KMS、STS),優先使用 VPC Endpoint。 Reference: https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html

AWS Lambda 執行角色與資源政策

AWS Lambda 的許可權透過兩個不同的 IAM 結構流動:執行角色與以資源為基礎的政策。

Lambda 執行角色

執行角色是 AWS Lambda 用來從函式內部呼叫 AWS API 的 IAM 角色。其信任政策允許 lambda.amazonaws.com 擔任此角色;許可政策授予程式碼所需的一切——dynamodb:PutItems3:GetObjectkms:Decryptlogs:CreateLogStream 等。每個 AWS Lambda 函式至少需要 AWS 受管的 AWSLambdaBasicExecutionRole 政策(CloudWatch Logs 寫入)。

Lambda 以資源為基礎的政策

以資源為基礎的政策(又稱函式政策)控制誰可以呼叫 AWS Lambda 函式,直接附加在函式上。當 Amazon S3、API Gateway、SNS 或 EventBridge 想要呼叫你的函式時,以資源為基礎的政策必須明確允許呼叫方的服務主體。通常透過 aws lambda add-permission 或 SAM Events: 區塊來設定。

兩個角色,兩個問題

  • 執行角色回答:「AWS Lambda 函式可以對 AWS 做什麼?」
  • 以資源為基礎的政策回答:「誰被允許呼叫這個 AWS Lambda 函式?」

在 DVA-C02 中,當考題問「為什麼 S3 無法觸發我的 Lambda?」,答案幾乎都是以資源為基礎的政策(函式政策),而不是執行角色。當考題問「為什麼我的 Lambda 無法從 DynamoDB 讀取?」,答案是執行角色。情境描述的方向常常互換,要格外留意。 Reference: https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html

AWS Lambda Destinations 與 Dead-Letter Queues

對於非同步呼叫,AWS Lambda 可以自動將結果(成功或失敗)路由到另一個 AWS 服務。

Lambda Destinations

Lambda Destinations 讓你為每個函式設定 on-success 目的地與 on-failure 目的地。支援的目的地包括 Amazon SQS、Amazon SNS、Amazon EventBridge,以及另一個 AWS Lambda 函式。Destinations 承載的後設資料比 DLQs 更豐富(原始事件、回應 payload 或錯誤資訊、呼叫情境),是現代最佳實務。

Dead-Letter Queues(DLQ)

較舊的機制是 Dead-Letter Queue——掛接在函式上的 SQS 佇列或 SNS 主題,在所有重試嘗試失敗後接收事件。DLQs 仍然有效,考試也仍會出現,但 AWS 建議新工作使用 Destinations,因為 payload 更豐富。

重試行為摘要

  • 同步:由呼叫端重試。AWS Lambda 本身不會重試。
  • 非同步:AWS Lambda 以指數退避方式重試最多 2 次(最長事件存活時間可設定,預設 6 小時)。失敗後送往 Destination(on-failure)或 DLQ。
  • Poll-based
    • SQS:訊息在可見性逾時後返回佇列;超過 maxReceiveCount 後送往 SQS DLQ。
    • Kinesis / DynamoDB Streams:AWS Lambda 以指數退避方式重試,直到達到 MaximumRetryAttemptsMaximumRecordAgeInSeconds 為止;可選的 BisectBatchOnFunctionError 會對分批次以隔離毒藥記錄;失敗記錄可送往 on-failure destination。

DVA-C02 上相當常見的陷阱:「API Gateway → Lambda 失敗,AWS Lambda 會自動重試嗎?」答案:不會。同步 AWS Lambda 將錯誤回傳給呼叫端。若 API Gateway 是呼叫端,客戶端必須自行重試(或透過整合 Step Functions 來重試)。DLQs 與 Destinations 不會在同步失敗時觸發。 Reference: https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html

AWS Lambda 版本與別名

AWS Lambda 版本與別名是安全部署 AWS Lambda 的基礎。

Lambda 版本

每次你發布一個 AWS Lambda 版本,AWS Lambda 就會將程式碼與設定凍結為帶有數字 ID(1、2、3……)的不可變快照。$LATEST 是可變的工作副本——不適合用於生產流量。已發布的版本會公開唯一的 ARN:arn:aws:lambda:REGION:ACCOUNT:function:NAME:VERSION

Lambda 別名

Lambda 別名是一個具名指標(例如 prodstagingcanary),指向特定版本,或在兩個版本之間分配加權流量。別名提供穩定的 ARN,讓呼叫端無論底層部署的是哪個版本都能使用。

加權別名的流量切換

別名支援加權路由——例如 95% 的呼叫流向版本 7,5% 流向版本 8。這是 AWS CodeDeploy 用來實作 AWS Lambda 金絲雀(先切換 X%,觀察,再切換到 100%)與線性(每 M 分鐘切換 N%)流量的基礎元件。DVA-C02 經常測試金絲雀 vs 線性 vs 一次到位的 AWS Lambda 部署設定。

AWS Lambda SnapStart

AWS Lambda SnapStart 是解決 Java 冷啟動延遲的特效藥。

SnapStart 的運作原理

SnapStart(適用於 Java 11、17 與 21 受管執行環境,以及較新版本中的 Python 與 .NET)在 INIT 階段結束後對已初始化的執行環境進行快照——包含 JVM heap、已載入的類別,以及執行環境初始化的任何狀態——並將其快取。冷呼叫時,AWS Lambda 從快照恢復而非從頭執行 INIT。Java 冷啟動時間從 2–6 秒降至 200–400 毫秒。

SnapStart 注意事項

  • 需要已發布的版本(不支援 $LATEST)。
  • 恢復後必須重新產生唯一性(隨機數、加密 RNG、快取的憑證、DB 連線 ID)。使用 CRaCResource 掛鉤(beforeCheckpoint / afterRestore)來刷新狀態。
  • 不額外收費(2022 年底推出時如此)。請查閱最新定價頁面確認。

對所有在 API Gateway 或 ALB 後端的延遲敏感 Java 函式啟用 AWS Lambda SnapStart。這是 Java 生態系中 AWS Lambda 效能開關裡報酬率最高的一個。對於 Node.js 與 Python,冷啟動本來就夠短,SnapStart 的幫助有限——若需要保證 100ms 以下的暖啟動,優先選用 Provisioned Concurrency。 Reference: https://docs.aws.amazon.com/lambda/latest/dg/snapstart.html

AWS Lambda 並行控制:Provisioned vs Reserved

並行控制是 DVA-C02 上最常被混淆的 AWS Lambda 主題。這是兩個目的截然不同的調節旋鈕。

帳號並行限制

每個 AWS 帳號的區域預設並行限制為 1,000 個同時執行的 AWS Lambda 函式(可透過支援票申請提高)。擴展時,AWS Lambda 在初始爆發(依區域不同,500–3000)之後,每分鐘增加 1,000 個並行額度。

Reserved Concurrency

Reserved Concurrency 從帳號資源池中切割出一個保證的份額給單一函式。若你對函式 A 設定 Reserved = 100:

  • 函式 A 最多可使用 100 個並行執行(且只能使用 100)。
  • 剩餘的 900 由帳號中所有其他函式共用。
  • Reserved Concurrency 同時充當下限(保證容量)與上限(限制函式)。

使用 Reserved Concurrency 的目的:(a)保護關鍵函式免於資源被搶占;(b)對呼叫有連線限制的下游服務(例如 RDS)的函式進行速率限制。

Provisioned Concurrency

Provisioned Concurrency 預先初始化 N 個執行環境,讓它們在流量到達時已完全暖機。若你對別名 prod 設定 Provisioned = 50:

  • 50 個沙箱已預暖,完整通過 INIT 階段。
  • 最多 50 個並行呼叫會打到暖環境,冷啟動延遲接近零。
  • 超過 50 個並行的呼叫會回退至隨需(可能發生冷啟動),除非你同時搭配 Reserved Concurrency。
  • 你需要為預暖容量支付少量的每 GB-秒費用,加上正常的呼叫費用。

Provisioned Concurrency 整合 Application Auto Scaling,支援排程式(上班時段)或目標追蹤擴展。

Reserved Concurrency = 切割並行資源池的份額(下限 + 上限),免費,不會消除冷啟動。Provisioned Concurrency = 預暖沙箱,需要費用,消除冷啟動。需要保證容量保證暖啟動延遲時,兩者同時使用。混淆這兩者是考試最常見的失分點之一。 Reference: https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html

AWS Lambda X-Ray 主動追蹤

AWS X-Ray 主動追蹤讓 AWS Lambda 函式成為分散式追蹤的一等公民。

啟用主動追蹤

在函式上切換 TracingConfig: Active(主控台核取方塊、SAM Tracing: Active,或 CLI --tracing-config Mode=Active)。兩件事隨之發生:

  • AWS Lambda 自動將每次呼叫包裝在一個 X-Ray 區段中,並記錄初始化、呼叫,以及所有 AWS SDK 呼叫(前提是你使用 X-Ray SDK 插樁的客戶端)。
  • 取樣決策由 AWS Lambda 本身做出——大約每秒 1 個請求加上額外請求的 5%(可透過 X-Ray 取樣規則設定)。

Segments、Subsegments、Annotations、Metadata

  • Segment:整個 AWS Lambda 呼叫。
  • Subsegment:下游呼叫(DynamoDB 查詢、HTTPS 呼叫)。
  • Annotations:可索引的鍵值對(可在 X-Ray 主控台篩選)。
  • Metadata:不可索引的結構化資料。

X-Ray 主題會深入探討這些內容;就 AWS Lambda 基礎而言,記住主動追蹤只需一個開關,且需要執行角色具備 AWSXRayDaemonWriteAccess(或相等的 xray:PutTraceSegmentsxray:PutTelemetryRecords)。

AWS Lambda Power Tuning

AWS Lambda Power Tuning 是一個開源狀態機(Step Functions),用來找出函式的最佳記憶體設定。

Power Tuning 的運作原理

你從 AWS Serverless Application Repository 部署 Power Tuning 狀態機。傳入函式 ARN、一個 payload,以及要測試的記憶體大小清單(例如 128、512、1024、1536、3008)。狀態機在每個記憶體設定下呼叫函式 N 次,測量執行時間與成本,並回傳視覺化圖表顯示甜蜜點——結果常常出乎意料,因為更高的記憶體帶來更多 CPU,有時能讓函式又快又便宜

Power Tuning 策略

  • Speed:純粹最佳化最短執行時間。
  • Cost:最佳化最低呼叫成本。
  • Balanced:兩者的加權混合。

在 DVA-C02 中,認識 AWS Lambda Power Tuning 是實證記憶體調校的推薦方法,而非憑感覺猜測。

AWS Lambda 限制速查表

背熟以下 AWS Lambda 硬限制:

  • 逾時:每次呼叫 1 秒 – 900 秒(15 分鐘)。
  • 記憶體:128 MB – 10,240 MB(10 GB)。
  • 暫存 /tmp:預設 512 MB,最多 10,240 MB(10 GB)。
  • 部署套件:直接上傳壓縮檔 50 MB、從 S3 解壓縮 250 MB、容器映像 10 GB。
  • Payload:同步 6 MB、非同步 256 KB。
  • Layers:每個函式 5 個,解壓縮總計(函式 + layers)250 MB。
  • 環境變數:總計 4 KB。
  • 同時執行:每個區域每個帳號預設 1,000(軟限制)。
  • 爆發並行:初始 500–3,000,之後每分鐘 +1,000。
  • 非同步重試次數:0、1 或 2(預設 2)。
  • 非同步事件最長存活時間:60 秒 – 6 小時(預設 6 小時)。
  • 函式 / layer / 別名名稱長度:64 個字元。

AWS Lambda 常見考試陷阱

了解陷阱的價值不亞於讀懂文件。

陷阱 1 — 同步 DLQ 不會觸發

DLQs 與 Destinations 只在非同步失敗時觸發。同步失敗(API Gateway、ALB、直接 SDK RequestResponse)會將錯誤回傳給呼叫端——AWS Lambda 不重試,DLQ 也不會收到任何東西。

陷阱 2 — 冷啟動緩解階梯

當考題問「如何消除冷啟動」時:

  1. 精簡部署套件,將耗重的初始化移到 handler 之外。
  2. 若是 Java,啟用 SnapStart
  3. 任何執行環境皆可啟用 Provisioned Concurrency(需要費用)。
  4. Reserved Concurrency 單獨使用不能消除冷啟動——這是干擾選項。

陷阱 3 — Reserved vs Provisioned Concurrency 命名混淆

「Reserved」聽起來像是預先保留容量,但它不會預暖沙箱。「Provisioned」才是預暖的那個。每當看到這兩個詞,務必放慢速度再讀一次。

陷阱 4 — VPC Lambda 對外網際網路存取

VPC 掛接的 AWS Lambda 在私有子網路中無法存取公共網際網路,除非加裝 NAT Gateway。若目標是 AWS 服務,優先使用 VPC Endpoints。

陷阱 5 — 執行角色 vs 函式資源政策

「為什麼 S3 無法呼叫我的 Lambda?」→ 以資源為基礎的政策。「為什麼我的 Lambda 無法寫入 DynamoDB?」→ 執行角色。方向不同。

陷阱 6 — Layers 與解壓縮總大小

5 個 Layers 是數量限制。250 MB 是函式程式碼加上所有 Layers 的合計解壓縮限制。忘記合計規則是考生常見失分點。

陷阱 7 — 容器映像 vs ZIP 限制

ZIP 部署 = 直接 50 MB / 解壓縮 250 MB。容器映像 = 10 GB。若情境描述「ML 模型 > 250 MB」,答案就是容器映像。

陷阱 8 — 非同步重試次數

AWS Lambda 非同步呼叫重試兩次(共 3 次嘗試),而不是三次。這個值可設定為 0、1 或 2。

非同步 AWS Lambda 重試是額外 0、1 或 2 次——預設額外重試 2 次,也就是共執行 3 次。在考試上寫「重試 3 次」是錯的。背熟:預設額外重試 2 次,共嘗試 3 次。 Reference: https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html

AWS Lambda vs EC2 vs Fargate — 何時選擇各服務

DVA-C02 常以三選一的方式出運算題。使用以下決策樹。

選 AWS Lambda 的時機

  • 工作負載是事件驅動或突發性的。
  • 每次執行在 15 分鐘以內。
  • 你希望零伺服器管理。
  • 閒置時計費應降至零。
  • Payload 在 6 MB(同步)或 256 KB(非同步)以下。

選 AWS Fargate 的時機

  • 工作負載在容器中執行。
  • 每個任務可能執行數小時或數天。
  • 你希望零主機管理但需要容器 API。
  • 你已使用 Amazon ECS 或 Amazon EKS。

選 Amazon EC2 的時機

  • 工作負載需要特定 OS 調校、持久連線或 GPU。
  • 你有 Reserved Instances 或 Savings Plans 可套用。
  • 你需要 Spot Instances 進行成本最佳化。
  • 你執行重啟後仍存活的有狀態工作負載。

AWS Lambda 可觀測性:CloudWatch Logs 與指標

每次 AWS Lambda 呼叫都會寫入 CloudWatch Logs 並發出內建指標。

內建 CloudWatch 指標

  • Invocations — 呼叫次數。
  • Duration — 執行時間(毫秒)。
  • Errors — 失敗次數。
  • Throttles — 被節流的呼叫次數(超過並行限制)。
  • IteratorAge(poll-based)— 最後處理記錄的存活時間。
  • ConcurrentExecutions — 目前並行數。
  • ProvisionedConcurrencyUtilization — Provisioned Concurrency 的使用比例。

CloudWatch Logs 自動佈建

每個 AWS Lambda 函式會寫入 /aws/lambda/FUNCTION_NAME。第一次呼叫之前,log group 不會自動建立;若你希望從一開始就套用特定的保留政策,請在 IaC 中預先建立它。

FAQ — AWS Lambda 基礎

Q1. DVA-C02 一句話解釋 AWS Lambda 是什麼?

AWS Lambda 是一種無伺服器運算服務,能在回應同步、非同步或 poll-based 事件時執行你的 handler 程式碼,無需任何伺服器佈建或修補,按執行時間乘以分配記憶體的毫秒數計費,且每次呼叫最長 15 分鐘、最大 10 GB 記憶體。在 DVA-C02 中,AWS Lambda 是「事件驅動」、「無伺服器管理」與「按用量付費」情境的預設答案。

Q2. 同步、非同步與 poll-based AWS Lambda 事件來源有何差異?

同步來源(API Gateway、ALB、AWS SDK RequestResponse)讓呼叫端等待 AWS Lambda 回應,並由呼叫端自行處理重試。非同步來源(S3、SNS、EventBridge、SDK Event)將事件移交後立即返回;AWS Lambda 最多重試 2 次,並可將失敗路由至 DLQ 或 Destination。Poll-based 來源(SQS、Kinesis、DynamoDB Streams、MSK、MQ)由 AWS Lambda 本身輪詢,批次投遞並在成功時 checkpoint。這三種分類決定了 DVA-C02 上的重試行為、DLQ 可用性、payload 限制與並行動態。

Q3. AWS Lambda 的 Reserved Concurrency 與 Provisioned Concurrency 有何差異?

Reserved Concurrency 是免費的下限加上限設定,為單一 AWS Lambda 函式保留帳號並行資源池的一個份額——它保證容量同時限制函式,但不消除冷啟動。Provisioned Concurrency 預先初始化執行環境,讓 N 個以內的並行呼叫落在暖沙箱上,冷啟動延遲接近零;它需要費用,且可搭配 Application Auto Scaling 擴展。需要同時保證容量保證暖啟動延遲時,兩者一起使用。

Q4. AWS Lambda 支援哪些記憶體範圍與逾時,兩者如何互動?

AWS Lambda 支援 128 MB 至 10,240 MB 以 1 MB 為單位的記憶體,以及 **1 秒至 900 秒(15 分鐘)**的逾時。CPU 按記憶體比例分配——約 1,769 MB 時獲得一個完整 vCPU,10,240 MB 時大約六個 vCPU。因此,增加記憶體通常能讓 AWS Lambda 更快、有時更便宜,是主要的效能調校旋鈕。使用 AWS Lambda Power Tuning 工具找出實證甜蜜點。

Q5. AWS Lambda Layers 是什麼,有哪些限制?

Lambda Layer 是一個包含共用程式碼或相依套件的 ZIP 檔,會解壓縮到執行環境內的 /opt。一個 AWS Lambda 函式最多可引用 5 個 Layers,函式程式碼加上所有掛載 Layers 的解壓縮總大小不得超過 250 MB。Layers 有版本管控,可透過以資源為基礎的政策跨帳號共用。使用 Layers 來共用工具函式庫、龐大的第三方相依套件、自訂執行環境以及 AWS Lambda Extensions。

Q6. AWS Lambda 執行角色與以資源為基礎的政策有何差異?

執行角色是 AWS Lambda 用來從函式內部呼叫 AWS API 的 IAM 角色——它回答「程式碼能做什麼?」。以資源為基礎的政策(函式政策)附加在函式上,回答「誰能呼叫這個函式?」。當 S3、SNS 或 API Gateway 觸發 AWS Lambda 時,以資源為基礎的政策必須允許呼叫方的服務;當 handler 呼叫 DynamoDB 或 S3 時,執行角色必須允許這些動作。混淆這兩者是 DVA-C02 最常見的陷阱之一。

Q7. AWS Lambda 在 VPC 中如何影響冷啟動與網際網路存取?

現代 VPC 掛接 AWS Lambda 使用延遲佈建且跨呼叫共用的 Hyperplane ENIs,因此 2018 年那種長達數秒的 VPC 冷啟動問題已成過去。目前 VPC 冷啟動額外開銷為數十毫秒。然而,私有子網路中的 VPC 掛接 AWS Lambda 在未加裝 NAT Gateway 的情況下無法對外存取網際網路;若目標是 AWS 服務,優先使用 VPC Endpoints(S3、DynamoDB 使用 Gateway Endpoints;Secrets Manager、KMS、STS 等使用 Interface Endpoints)以避免 NAT 資料傳輸費用。

Q8. AWS Lambda SnapStart 的作用是什麼,何時應該使用?

AWS Lambda SnapStart 對 INIT 後的執行環境(heap、類別、連線)進行快照,並在冷呼叫時從快照恢復。對於 Java 11 以上,SnapStart 可將冷啟動從數秒縮短至數百毫秒,且推出時不額外收費。在 API Gateway 或 ALB 後端的延遲敏感 Java 函式上使用 SnapStart。記得在 afterRestore 掛鉤中重新產生唯一性(RNG、DB 連線 ID)。Python 與 .NET 的 SnapStart 支援在較新的執行環境版本中已擴展。

Q9. AWS Lambda 版本與別名如何實現安全部署?

發布 AWS Lambda 版本會建立帶有數字 ID 的不可變快照(程式碼 + 設定)。別名是具名指標(prodstaging),指向某個版本——或在兩個版本之間分配加權流量。CodeDeploy 使用加權別名實作金絲雀(先切換 10%,觀察,再切換到 100%)與線性(每分鐘切換 10%)流量切換。讓呼叫端(API Gateway、EventBridge)指向別名 ARN,這樣部署時就不需要更改呼叫端設定。

Q10. DVA-C02 必須背熟哪些 AWS Lambda 限制?

必背:逾時上限 15 分鐘、記憶體上限 10 GB、/tmp 上限 10 GB、部署套件限制 50 MB / 250 MB / 10 GB(壓縮直傳 / S3 解壓縮 / 容器),payload 限制同步 6 MB / 非同步 256 KB、每個函式 5 個 Layers(解壓縮合計 250 MB)、環境變數總計 4 KB、預設同時執行 1000 個、非同步重試 2 次(共嘗試 3 次),以及初始爆發並行 500–3000 再加每分鐘 +1000。這些數字能直接回答超過一半的 AWS Lambda 純記憶考題。

總結 — AWS Lambda 基礎一覽

  • AWS Lambda 是 DVA-C02 的無伺服器運算核心;任務 1.2 加上與安全、部署、疑難排解領域的交叉重疊。
  • Handler 簽名因執行環境而異,但始終是 (event, context);支援 Node.js、Python、Java、.NET、Go(透過 provided.al2023)、Ruby 與自訂執行環境,以及最大 10 GB 的容器映像。
  • 事件來源分為同步(6 MB、呼叫端重試)、非同步(256 KB、Lambda 重試 2 次、DLQ/Destinations),以及 poll-based(批次、checkpoint)。
  • 記憶體 128 MB – 10,240 MB 同時決定 CPU 與成本;逾時上限 900 秒;/tmp 可擴展至 10 GB。
  • 環境變數總計最多 4 KB,靜態加密使用 KMS;真正的機密應放在 Secrets Manager 或 Parameter Store。
  • Lambda Layers 在函式之間共用程式碼——每個函式最多 5 個 Layer,解壓縮合計 250 MB。
  • Lambda Extensions 與 handler 並行執行,用於可觀測性與機密快取。
  • VPC 掛接使用 Hyperplane ENIs;沒有 NAT 或 VPC Endpoints 就無法存取公共網際網路。
  • 執行角色 = 函式能做什麼;以資源為基礎的政策 = 誰能呼叫函式。
  • Destinations(on-success/on-failure)是非同步場景中 DLQs 的現代演進。
  • 版本是不可變快照;別名是加權指標——金絲雀/線性流量切換的基礎。
  • SnapStart 解決 Java 冷啟動;Provisioned Concurrency 預暖沙箱;Reserved Concurrency 保證容量。
  • X-Ray 主動追蹤 + Lambda Power Tuning 是 DVA-C02 認可的可觀測性與效能調校組合。

熟透這些 AWS Lambda 基礎,任務 1.2 就會成為你在 DVA-C02 準確率最高的章節——而這套心智模型也能直接遷移到 SAA-C03 與 SOA-C02 的無伺服器考題,若你之後繼續走 AWS 認證之路的話。

官方資料來源

更多 DVA-C02 主題