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

2 分的閱讀內容
0

在 AWS CloudFormation 中,我收到下列錯誤訊息: 「無法在指定的持續時間內收到 X 個資源訊號。」 我該如何解決此錯誤?

簡短說明

當 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體、Auto Scaling 群組WaitConditionCreationPolicy 屬性指定的時段內未收到來自一或多個執行個體的成功訊號時,您會收到此錯誤。

此錯誤可能會在下列其中一種情況下發生:

  • 情況 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 指令碼,請完成下列步驟:

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-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 堆疊的原因。


AWS 官方
AWS 官方已更新 1 年前