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