當我嘗試在 CloudFormation 中建立或更新堆疊時,如何解決「內部故障」錯誤?

2 分的閱讀內容
0

我想要解決 AWS CloudFormation 中的「內部故障」錯誤。

簡短說明

如果您正在建立或更新 CloudFormation 堆疊,您可能會在對資源進行作業失敗時收到「內部故障」錯誤。如果堆疊無法部署,您還可能會收到此錯誤。

在下列情況下,對資源進行作業可能會失敗:

  • 您的資源或內容設為不正確的值。若要解決此問題,請完成「部署測試堆疊以尋找資源或內容的不正確值」區段中的步驟。
  • 內部工作流程失敗。若要使用 AWS CloudTrail 解決此問題,請完成「在 CloudTrail 事件日誌中尋找失敗的 API 作業」區段中的步驟。

最後,如果您將不正確的值傳遞至 CloudFormation 範本的「輸出」區段,您的堆疊可能無法部署。若要解決此錯誤,請完成「檢查 CloudFormation 範本的輸出區段中的值」區段中的步驟。

**注意事項:**下列步驟僅適用於您嘗試在 CloudFormation 中建立或更新堆疊時收到的「內部故障」錯誤。

解決方案

部署測試堆疊以尋找資源或內容的不正確值

若要尋找資源內容或屬性的不正確值,請使用僅包含失敗資源的 CloudFormation 範本部署測試堆疊。

如果您的測試堆疊成功部署,請遵循「在 CloudTrail 事件日誌中尋找失敗的 API 作業」區段中的步驟。

如果您的測試堆疊部署失敗,請繼續從測試堆疊中移除非必要的內容,直到找到不正確的值。

在下列範例情況中,當 CloudFormation 嘗試使用 AWS Config 建立 AWS::Config::ConformancePack 時,您會收到「內部故障」錯誤。您會收到錯誤,因為 DeliveryS3Bucket 內容使用不正確的語法。DeliveryS3Bucket 內容僅接受儲存貯體名稱作為值 (例如:bucketname)。包含儲存貯體名稱的檔案路徑不是可接受的值 (例如:s3://bucketname)。

AWSTemplateFormatVersion: 2010-09-09
Resources:
  CloudFormationCanaryPack:
    Type: AWS::Config::ConformancePack
    Properties:
      ConformancePackName: ConformancePackName
      DeliveryS3Bucket: s3://bucketname            # Incorrect value for DeliveryS3Bucket
      TemplateS3Uri: s3://bucketname/prefix

在 CloudTrail 事件日誌中尋找失敗的 API 作業

1.    開啟 CloudTrail 主控台

2.    在導覽窗格中,選擇「事件歷史記錄」。

3.    針對「時間範圍」,輸入時間範圍以隔離失敗的 API 呼叫,然後選擇「套用」。

**提示:**針對「開始」時間,輸入資源在 CloudFormation 堆疊中進入 CREATE_IN_PROGRESS 或 UPDATE_IN_PROGRESS 狀態的時間。針對「結束」時間,輸入 API 呼叫失敗的時間。

4.    若要在「事件歷史記錄」中事件的預設顯示範圍之外進行搜尋,請使用屬性篩選條件

**注意事項:**依預設,「事件歷程記錄」會使用設為 false 的「唯讀」篩選條件。「唯讀」篩選結果僅顯示 API 活動的寫入事件,並從顯示的事件清單中排除唯讀事件。

您可以使用 EventName 依傳回事件的名稱進行篩選。如果您知道用來建立或更新資源的 API 動作,則僅能針對特定 API 呼叫使用 EventName 篩選條件。例如,CloudFormation 堆疊建立 AWS::Config::ConformancePack 資源時,即會使用 AWS Config API 動作 PutConformancePack。這表示您僅能針對 PutConformancePack API 進行篩選。您可以使用 EventSource 依發出 API 請求的 AWS 服務進行篩選。這表示您可以捲動事件來源清單,並選擇用於 CloudFormation 範本中的適當資源。

5.    若要識別失敗的根本原因,請檢閱傳回事件的錯誤訊息。

**注意事項:**某些 API 作業失敗會要求您更新原始 CloudFormation 範本,然後執行測試部署以確認已解決錯誤。

檢查 CloudFormation 範本的「輸出」區段中的值

在 CloudFormation 範本中,確認「輸出」區段中的值不包含語法錯誤。例如,移除任何結尾空格。

如果您擷取含有動態參考的資源屬性,則必須確認堆疊部署期間會提供這些屬性。若要在 CloudFormation 外部模擬此項目,請執行下列動作:

1.    對具有失敗屬性的資源類型進行 Create* 或 Update* API 呼叫 (以建立或修改)。

2.    進行 Describe* API 呼叫,以在堆疊建立或更新程序期間擷取資源的目前屬性。

下列範例情況會示範在 AWS::DMS::ReplicationInstance 資源的 ReplicationInstancePrivateIpAddresses 屬性傳遞至「輸出」時,堆疊傳回的內部錯誤。

在下列範例中,僅限在 ReplicationInstance 資源已將狀態切換為「可用」之後,才能使用執行個體的私有 IP 屬性。如果在堆疊處理「輸出」時 ReplicationInstance 資源未處於「可用」狀態,則 CloudFormation 無法擷取私有 IP 屬性。然後,部署會失敗。

AWSTemplateFormatVersion: 2010-09-09
Resources:
  BasicReplicationInstance:
    Type: AWS::DMS::ReplicationInstance
    Properties:
      ReplicationInstanceClass: dms.t2.small
Outputs:
  DmsInstanceIP:
    Value: !GetAtt BasicReplicationInstance.ReplicationInstancePrivateIpAddresses

相關資訊

疑難排解 AWS CloudFormation

檢視 CloudTrail 事件歷史記錄的事件

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