View a markdown version of this page

Lambda Web Functions 的最佳實務 - AWS Lambda

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

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 或前門容錯移轉。

  • 集中主區域中的操作檢視,但保留遙測延遲或中斷的復原路徑。