使用 AWS re:Post 即表示您同意 AWS re:Post 使用條款

如何解決 AWS CloudFormation 中的「無法在指定的持續時間內收到 X 個資源訊號」錯誤?

2 分的閱讀內容
0

我收到下列錯誤訊息: 對於 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 指令碼,請完成下列步驟:

  1. 使用 SSH 連線至 Linux 執行個體

  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-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 範本中存在語法錯誤或不正確的值

若要尋找錯誤和不正確的值,請完成下列步驟:

  1. 在程式碼編輯器中,開啟堆疊的範本。然後,找到 UserData 屬性部分。
  2. 檢查是否有語法錯誤、遺漏空格、拼字錯誤和其他錯字。
  3. 確認堆疊、資源和 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 資源之前,請確認值的大小足以執行任務。

若要檢查逾時內容值並比較訊號與資源失敗時間戳記,請完成下列步驟:

  1. 在程式碼編輯器中,開啟堆疊的 CloudFormation 範本,以尋找逾時內容值。
    注意:****逾時內容值是 CloudFormation 在傳回錯誤之前等待訊號的最長時間。

  2. 若要取得 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
  3. 開啟 CloudFormation 主控台

  4. 選擇事件檢視。

  5. 選擇狀態原因。展開狀態原因為「無法在指定的持續時間內收到 X 個資源訊號」的事件列。

  6. 將訊號時間戳記與資源失敗時間戳記比較。
    **注意:**為成功完成,指令碼必須在建立執行個體或建立失敗之前傳送訊號。

不是從執行個體傳送 cfn-signal

驗證 CloudFormation 收到的訊號是否來自執行個體。檢查在 **/var/log/cfn-wire.log 中可用的 cfn 連線日誌。**如果回應不是 200,則您的執行個體與 CloudFormation 端點之間可能存在連線問題。

當您從不是您的執行個體的某個位置傳送訊號時,請使用 SignalResource API。例如,您可以使用 AWS Lambda 函數來呼叫 SignalResource API,然後將訊號傳送至堆疊。如果收到錯誤,請使用 CloudWatch 日誌來檢查 Lambda 日誌,以了解為什麼訊號未傳送到堆疊。

AWS 官方
AWS 官方已更新 8 個月前