我收到下列錯誤訊息: 對於 AWS CloudFormation 中的 Linux Amazon Elastic Compute Cloud (Amazon EC2) 執行個體,收到「無法在指定的持續時間內收到 X 個資源訊號」。
簡短描述
對於其中使用 ResourceSignal 指定了 CreationPolicy 屬性的資源,若 CloudFormation 未收到成功訊號,您將會收到此錯誤。Amazon EC2 執行個體、Auto Scaling 群組或等候條件可能會發生錯誤。
**注意:**下列解決方法僅適用於您使用 Linux 執行個體建立的 CloudFormation 堆疊。對於 Windows 執行個體,請參閱如如何解決 AWS CloudFormation 中 EC2 Windows 執行個體的「無法在指定的持續時間內收到 X 個資源訊號」錯誤?
解決方法
根據您的使用案例,請使用下列疑難排解步驟來解決問題。
注意:為防止堆疊回滾,請在 CloudFormation 主控台中為堆疊失敗選項選擇保留已成功佈建的資源。此選項表示不會發生失敗回滾,而且在您刪除堆疊之前,執行個體將不會終止。
cfn-signal 指令碼未安裝在 CloudFormation 堆疊的執行個體上
若要確認在設定為將訊號傳送至堆疊的執行個體上已安裝 cfn-signal 指令碼,請完成下列步驟:
-
使用 SSH 連線至 Linux 執行個體。
-
使用下列其中一個指令碼確認 cfn-signal 指令碼已安裝。
若要確認 cfn-signal 指令碼位於您的目錄中,請執行下列命令:
$ sudo find / -name cfn-signal
/opt/aws/bin/cfn-signal
/opt/aws/apitools/cfn-init-1.4-30.amzn2/bin/cfn-sign
若要確認已安裝包含 cfn-signal 指令碼的 CloudFormation 協助程式指令碼套件,請執行下列命令:
$ sudo rpm -q aws-cfn-bootstrap
aws-cfn-bootstrap-1.4-30.amzn2.noarch
**重要:**上述命令僅適用於使用 RPM 套件管理員的發行版。依預設,Amazon Linux Amazon Machine Image (AMI) 上已安裝 CloudFormation 協助程式指令碼。若要安裝協助程式指令碼,請參閱 CloudFormation 協助程式指令碼參考。
CloudFormation 範本中存在語法錯誤或不正確的值
若要尋找錯誤和不正確的值,請完成下列步驟:
- 在程式碼編輯器中,開啟堆疊的範本。然後,找到 UserData 屬性部分。
- 檢查是否有語法錯誤、遺漏空格、拼字錯誤和其他錯字。
- 確認堆疊、資源和 AWS 區域屬性的值正確無誤。
**注意:**檢查包含在 UserData 屬性中的引導指令碼。指令碼呼叫 cfn-signal。檢查是否有語法錯誤或不正確的值。
如果您在 cfn-init 命令內發出訊號,請在 cfn-init 日誌中尋找訊號的相關資訊。若要搜尋 cloud-init 或 cfn-init 日誌中的錯誤,請使用 SSH 連線到您的執行個體。然後,使用關鍵字 "error" 或 "failure" 在下列日誌中搜尋詳細的錯誤或失敗訊息:
/var/log/cloud-init-output.log/var/log/cloud-init.log
/var/log/cfn-init.log
/var/log/cfn-init-cmd.log
/var/log/cfn-wire.log
若要剖析 /var/log/cfn 或 /var/log/cloud-init 檔案中字詞 "error" 或 "failure" 的所有執行個體,請執行下列命令:
grep -ni 'error\|failure' $(sudo find /var/log -name cfn\* -or -name cloud-init\*)
**注意:**上述命令會傳回檔名、行號和錯誤訊息。
CreationPolicy 屬性的逾時內容值太小
逾時內容值是由 CreationPolicy 屬性所定義。在 cfn-signal 指令碼傳送訊號到 CloudFormation 資源之前,請確認值的大小足以執行任務。
若要檢查逾時內容值並比較訊號與資源失敗時間戳記,請完成下列步驟:
-
在程式碼編輯器中,開啟堆疊的 CloudFormation 範本,以尋找逾時內容值。
注意:****逾時內容值是 CloudFormation 在傳回錯誤之前等待訊號的最長時間。
-
若要取得 cfn-signal 指令碼啟用時間的估計值,請使用 SSH 連線到執行個體。然後,執行下列命令:
less /var/log/cfn-init.log
在將 SUCCESS 訊號傳送至 CloudFormation 資源時,日誌檔會顯示時間戳記。
範例:
2019-01-11 12:46:40,101 [DEBUG] Signaling resource EC2Instance in stack XXXX with unique ID i-045a536a3dfc8ccad and status SUCCESS
-
開啟 CloudFormation 主控台。
-
選擇事件檢視。
-
選擇狀態原因。展開狀態原因為「無法在指定的持續時間內收到 X 個資源訊號」的事件列。
-
將訊號時間戳記與資源失敗時間戳記比較。
**注意:**為成功完成,指令碼必須在建立執行個體或建立失敗之前傳送訊號。
不是從執行個體傳送 cfn-signal
驗證 CloudFormation 收到的訊號是否來自執行個體。檢查在 **/var/log/cfn-wire.log 中可用的 cfn 連線日誌。**如果回應不是 200,則您的執行個體與 CloudFormation 端點之間可能存在連線問題。
當您從不是您的執行個體的某個位置傳送訊號時,請使用 SignalResource API。例如,您可以使用 AWS Lambda 函數來呼叫 SignalResource API,然後將訊號傳送至堆疊。如果收到錯誤,請使用 CloudWatch 日誌來檢查 Lambda 日誌,以了解為什麼訊號未傳送到堆疊。