如何解決 AWS CloudFormation 中的「無法在指定的持續時間內收到 X 個資源訊號」錯誤?
在 AWS CloudFormation 中,我收到下列錯誤訊息: 「無法在指定的持續時間內收到 X 個資源訊號。」 我該如何解決此錯誤?
簡短說明
當 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體、Auto Scaling 群組或 WaitCondition 在 CreationPolicy 屬性指定的時段內未收到來自一或多個執行個體的成功訊號時,您會收到此錯誤。
此錯誤可能會在下列其中一種情況下發生:
- 情況 1: 在 AWS CloudFormation 堆疊的一或多個執行個體上未安裝 cfn-signal 指令碼。
- 情況 2: AWS CloudFormation 範本中存在語法錯誤或不正確的值。
- 情況 3: CreationPolicy 屬性的「逾時」內容值太低。
- 情況 4: 不是從 Amazon EC2 執行個體傳送 cfn-signal。
**注意事項:**此錯誤的疑難排解情況僅適用於使用 Linux 執行個體建立的 AWS CloudFormation 堆疊。這些情況不適用於 Windows 執行個體。如需詳細資訊,請參閱如何疑難排解堆疊建立問題。
解決方案
在遵循疑難排解情況中的步驟之前,先將 AWS CloudFormation 堆疊的「失敗時回復」選項設為「否」。
情況 1: 在 AWS CloudFormation 堆疊的一或多個執行個體上未安裝 cfn-signal 指令碼
若要確認在設定為將訊號傳送至 AWS CloudFormation 資源的執行個體上已安裝 cfn-signal 指令碼,請完成下列步驟:
2. 確認使用下列任一命令來安裝 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-signal
若要確認已安裝包含 cfn-signal 指令碼的 AWS CloudFormation 協助程式指令碼套件,請執行下列命令:
$ sudo rpm -q aws-cfn-bootstrap aws-cfn-bootstrap-1.4-30.amzn2.noarch
**重要事項:**上述命令僅適用於使用 RPM 套件管理員的發行版。
**注意事項:**依預設,Amazon Linux Amazon Machine Image (AMI) 上已安裝 AWS CloudFormation 協助程式指令碼。如果未安裝 AWS CloudFormation 協助程式指令碼,請參閱 CloudFormation 協助程式指令碼參考以取得安裝指示。
情況 2: AWS CloudFormation 範本中存在語法錯誤或不正確的值
若要確認是否 UserData 內容已設定對由 CreationPolicy 屬性指定的 AWS CloudFormation 資源發出訊號,請完成下列步驟:
1. 在程式碼編輯器中,開啟堆疊的 AWS CloudFormation 範本,然後尋找 UserData 內容區段。
2. 檢查是否有錯誤,包括語法錯誤、遺漏空格、拼字錯誤和其他錯字。
3. 確認堆疊、資源和區域內容的值正確無誤。
**注意事項:**如果您使用包含 UserData 內容的啟動程序指令碼並呼叫 cfn-signal 指令碼,請檢查啟動程序指令碼是否有語法錯誤或不正確的值。
如果您在 cfn-init 命令金鑰內發出訊號,請在 cfn-init 日誌中尋找訊號的相關資訊。若要搜尋 cloud-init 日誌或 cfn-init 日誌中的錯誤,請使用 SSH 連接至 Amazon EC2 執行個體。然後,在下列日誌中搜尋關鍵字 "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\*)
**注意事項:**上述命令會傳回檔名、行號和錯誤訊息。
情況 3: CreationPolicy 屬性的「逾時」內容值太低
「逾時」內容值是由 CreationPolicy 屬性所定義。若要在 cfn-signal 指令碼將訊號傳送至 AWS CloudFormation 資源之前,確認該值是否足以讓任務執行,請完成下列步驟。
**重要事項:**僅限未終止執行個體 (例如,由 Auto Scaling 群組) 時,適用於下列步驟。您已將 AWS CloudFormation 堆疊的「失敗時回復」選項設為「否」。此選項表示沒有失敗回復,並且在刪除堆疊之前不會終止執行個體。您可以使用 SSH 連接至執行個體,然後繼續執行下列疑難排解步驟。
1. 在程式碼編輯器中,開啟堆疊的 AWS CloudFormation 範本,然後尋找「逾時」內容值。
注意事項:「逾時」內容值是 AWS CloudFormation 在傳回錯誤之前等待訊號的時間上限。
2. 若要取得觸發 cfn-signal 指令碼的預估值,請使用 SSH 連接至執行個體,然後執行下列命令:
less /var/log/cfn-init.log
在將 SUCCESS 訊號傳送至 AWS CloudFormation 資源時,日誌檔案會顯示時間戳記。請參閱下列範例:
2019-01-11 12:46:40,101 [DEBUG] Signaling resource EC2Instance in stack XXXX with unique ID i-045a536a3dfc8ccad and status SUCCESS
3. 開啟 AWS CloudFormation 主控台。
4. 若要查看「無法在指定的持續時間內收到 X 個資源訊號」事件的資源失敗時間戳記,請選擇「事件」視圖。
5. 針對「狀態原因」,展開狀態原因為「無法在指定的持續時間內收到 X 個資源訊號」的事件列。
6. 將訊號時間戳記與資源失敗時間戳記比較。
**注意事項:**請注意,無法建立 Amazon EC2 資源之後傳送了該訊號。在建立或無法建立 Amazon EC2 資源之前傳送了該訊號。
情況 4: 不是從 Amazon EC2 執行個體傳送 cfn-signal
在您想要從 Amazon EC2 執行個體以外的任何地方傳送訊號時,SignalResource API 非常有用。
例如,您可以使用 AWS Lambda 函數來呼叫 SignalResource API,然後將訊號傳送至 AWS CloudFormation 堆疊。在這種情況下,請使用 Amazon CloudWatch Logs 檢查您的 Lambda 日誌。這些日誌可協助您找出訊號未傳送至 AWS CloudFormation 堆疊的原因。
相關內容
- 已提問 1 年前lg...
- 已提問 7 個月前lg...
- 已提問 5 個月前lg...
- 已提問 7 個月前lg...
- AWS 官方已更新 1 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 1 年前