使用 AWS CloudFormation 實作 AWS Lambda 支援的自訂資源時,我想要遵循最佳實務。
解決方案
使用 CloudFormation 實作 Lambda 支援的自訂資源時,請使用下列最佳實務。
建置自訂資源以報告、記錄和處理失敗
例外情況可能會導致函數程式碼退出而不傳送回應。CloudFormation 需要 HTTPS 回應來確認操作成功或失敗。未報告的例外情況會導致 CloudFormation 等到操作逾時後才開始堆疊復原。如果在復原期間再次發生例外情況,CloudFormation 就會再次等待操作逾時,最後復原失敗。在這段時間內,您無法使用堆疊。
為避免逾時問題,請在您為 Lambda 函數建立的程式碼中包含下列元素:
- 處理例外情況的邏輯
- 記錄失敗以進行情境疑難排解的能力
- 回傳確認操作失敗的 HTTPS 回應給 CloudFormation 的能力
- 可讓您擷取和處理不完整執行的無效字母佇列
- 用於將回應傳送至 CloudFormation 的 cfn-response 模組
設定合理的逾時時間,並在即將逾時時回報
如果操作未在其定義的逾時期間內執行,則函數會引發例外情況,且不會將回應傳送至 CloudFormation。
若要避免此錯誤,請執行下列操作:
- 將 Lambda 函數的逾時值調高至足以因應處理時間和網路條件的變化。
- 在函數中設定計時器,以在函數即將逾時時,將錯誤回應給 CloudFormation。
根據建立、更新和刪除事件建置
根據堆疊動作,CloudFormation 會傳送建立、更新或刪除事件給函數。由於每個事件的處理方式都不同,因此請確認函數在收到三種事件類型中的其中一種時,都不會出現意外行為。
如需詳細資訊,請參閱自訂資源請求類型。
了解 CloudFormation 如何識別和取代資源
更新取代實體資源時,CloudFormation 會將 Lambda 函數傳回的 PhysicalResourceId 和先前的 PhysicalResourceId 進行比較。如果識別碼不同,則 CloudFormation 會假設資源已取代為新的實體資源。
但是,為了允許進行可能的復原,CloudFormation 不會移除舊資源。堆疊更新完成後,CloudFormation 會傳送一個刪除事件請求,其中包含舊實體識別碼。如果堆疊更新失敗且發生復原,則 CloudFront 會在刪除事件中傳送新的實體識別碼。
使用 ** PhysicalResourceId** 來唯一識別資源,以便在函數收到刪除事件時,函數會在取代期間僅刪除正確的資源。
使用冪等性設計你的函數
您可以使用相同的輸入重複執行冪等函數多次,結果與僅執行一次相同。冪等可確保重試、更新和復原不會建立重複的資源或發生錯誤。
例如,CloudFormation 會叫用您的函數來建立資源,但沒有收到已成功建立資源的回應。CloudFormation 可能會再次叫用該函數,並建立第二個資源。然後,第一個資源可能會變成孤兒。
實作處理常式以正確處理復原
堆疊作業失敗時,CloudFormation 會嘗試將所有資源返回其先前的狀態。此動作會導致不同的行為,具體取決於更新是否導致資源取代。
若要確保 CloudFront 可以完成復原,請執行下列動作:
相關資訊
自訂資源