本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Lambda Web Functions 的最佳實務
保護每個端點
每個端點都可以從網際網路存取,因此您驗證來電者、設定前門的方式,以及範圍許可會決定誰可以連接您的應用程式及其可存取的內容。使用下列實務:
-
每個端點都可以從網際網路存取,無論其身分驗證類型為何。使用
ApplicationManaged時,Lambda 不會驗證請求,因此任何知道網域的用戶端都可以呼叫您的應用程式。在應用程式或前門中實作身分驗證、授權、輸入驗證、請求大小檢查和濫用保護。 -
當發起人可以簽署請求,且 IAM 政策提供必要的授權模型
IamAuth時,請使用 。將資源政策範圍限定在特定端點 ARNs 和主體。 -
當您需要自訂網域、 AWS WAF 檢查、快取或集中式邊緣控制時,請將 Amazon CloudFront 或 Amazon API Gateway 放在端點前面。限制原始伺服器,讓用戶端無法繞過前門。使用 CloudFront 時,請使用
IamAuth端點和原始存取控制 (OAC),如中所述CloudFront 整合。若使用其他前門,端點仍可直接連線,因此請在應用程式中驗證共用秘密或權杖。 -
使用具有最低權限許可的專用執行角色。分隔部署身分、程式碼上傳者、Lambda 服務主體、執行角色和端點發起人許可。
-
請勿將秘密放在部署套件或日誌中。在執行時間從適當的秘密存放區載入秘密、僅視需要快取秘密,以及修改敏感的請求欄位。
保留不可變的部署成品
-
在程式碼儲存貯體上啟用版本控制,並記錄每個部署的物件版本 ID。
-
請勿覆寫或刪除作用中或轉返修訂所使用的物件版本。只要修訂版參考物件,保留 Lambda 服務主體存取權。
-
在可重複的管道中建置部署套件。從鎖定檔案安裝生產相依性、排除開發檔案,並在上傳之前測試確切的封存。
-
建置 Arm64 的原生相依性。針對 x86_64 建置的原生模組不會在 Web 函數執行環境中執行。
-
當環境有不同的信任或保留要求時,請使用不同的儲存貯體、字首、角色或帳戶。
並行請求的設計
-
將請求特定資料保留在請求範圍內。請勿在全域變數中存放登入資料、客戶資料、回應物件或可變的每次請求狀態。
-
使用非同步 I/O。 同步 CPU 或檔案系統工作會封鎖Node.js事件迴圈,並延遲環境中的每個傳輸中請求。
-
worker_threads用於應該使用多個 vCPUs或更低的 CPU 密集型工作maxConcurrencyPerEnvironment,以減少爭用。 -
將Node.js堆積與環境記憶體分開計算。環境有 2 GB,而預設 V8 堆積為 1,024 MB。如果您在
--max-old-space-size中使用 提升堆積NODE_OPTIONS,請保留緩衝區、原生模組、執行時間和並行請求的記憶體。 -
在請求之間重複使用初始化的用戶端和連線集區,但驗證過時的連線和繫結快取成長。在執行環境外持續必要狀態。
-
讓傳出連線保持運作狀態,以便對資料庫和其他相依性的請求重複使用它們,而不是每次開啟新的連線。 會在其全域 HTTP 代理程式中預設Node.js啟用保持連線。如果您建立自己的代理程式或設定 SDK 用戶端,請保持啟用狀態。同時處理遠端在閒置時關閉的連線。
-
使用臨時檔案的唯一名稱,並在不再需要它們時將其移除。多個請求共用環境的 512 MB
/tmp檔案系統,而且檔案可以在請求之間保留,直到環境移除為止。
保持可預測的啟動
-
立即啟動 HTTP 伺服器,並接聽 的確切值
AWS_LAMBDA_HTTP_ENDPOINT。 -
保持套件小型,並移除未使用的生產相依性。
-
僅初始化伺服器可接受流量之前所需的資源。延遲執行選用工作,但防止並行請求重複昂貴的初始化。
-
SIGTERM處理在 1 秒內完成的清除,但不依賴關機回呼來保留所需的資料。
設定測量行為的限制
-
使用與生產中使用的相同應用程式相依性和下游服務進行負載測試。增加並行,直到延遲、CPU 耗用量、記憶體或下游容量成為繫結限制條件為止。
-
使用
maxConcurrencyPerEnvironment來繫結每個程序爭用、maxEnvironments繫結水平擴展,以及rateLimit保護下游相依性免於請求爆量。 -
在效能測試和啟動之前,檢查套用的帳戶和區域限制。端點組態無法建立超過帳戶限制的容量。
-
重試沒有
lambda-web-error-type標頭的 HTTP 429 回應和 HTTP 503 回應。使用退避和抖動,並只在操作為等冪時重試。使用等冪索引鍵或應用程式層級重複資料刪除進行寫入。
使用明確驗證和復原進行部署
-
針對生產端點使用手動修訂權重。為可接受立即推展的開發環境保留自動最新修訂部署。
-
等到新修訂完成
Active,且端點更新完成,再進行評估。對於MultiRegion和PerRegion端點,驗證每個區域中的更新狀態。 -
在 Canary 部署期間,使用包含修訂識別符的應用程式日誌或自訂指標。服務提供的指標不包含修訂維度。
-
在轉移流量之前,請定義新修訂必須符合的指標,以及您觀察它們的時間長度 (喚醒條件),以及觸發轉返的閾值。保留先前修訂版的程式碼物件版本、金鑰存取和組態,直到復原視窗結束為止。當 Web 函數超過其修訂限制時,Lambda 會自動刪除沒有端點路由到的最舊修訂,因此請將復原修訂保留在端點 (例如測試端點) 上,或從相同的物件版本重新建立它。如需詳細資訊,請參閱修訂限制和自動清除。
建置操作基準
-
發出具有請求 ID、修訂 ID、路由、狀態碼、持續時間和診斷下游故障所需識別符的結構化應用程式日誌。請勿記錄登入資料、字符或敏感請求內文。
-
對 5xx 回應和調節發出警示,並監控已執行的請求、作用中的環境和帳戶容量。設定稀疏錯誤指標,以適當地處理遺失的資料。
-
使用回應請求 ID 和日誌串流標頭,將用戶端失敗與日誌建立關聯。只有在您需要其他事件時,才啟用 DEBUG 系統日誌。
-
當您的稽核需求需要時,在 中 AWS CloudTrail 記錄管理操作和端點叫用資料事件。
將 MultiRegion 和 PerRegion 端點操作為分散式系統
-
讓每個可接收流量的區域都能使用應用程式資料、秘密、金鑰和下游相依性。
-
測試部分部署失敗和區域相依性失敗。在所有區域更新報告成功之前,請勿假設所有區域都執行相同的修訂。
-
每次端點更新後,請檢查 中的
updateStatus每個項目regionalEndpoints。複寫在某些區域中可能會在其他區域中成功時失敗。因此,可以部分套用更新。請先重試或轉返,再將部署視為完成。 -
對於
PerRegion端點,請獨立於 Web 函數部署測試外部 DNS 或前門容錯移轉。 -
集中主區域中的操作檢視,但保留遙測延遲或中斷的復原路徑。