當我在 AWS CloudFormation 中設定 Amazon Elastic Container Service (Amazon ECS) 藍/綠部署時,發生錯誤。
解決方法
當您在 CloudFormation 中使用 AWS::CodeDeploy::BlueGreen 勾點時,可能會收到錯誤訊息。若要對您的錯誤進行疑難排解,請遵循適用的解決方法章節。
剖析錯誤失敗
如果您沒有授予權限或在範本中包含 Weight 屬性,AWS CodeDeploy 將無法剖析提供的範本 Hooks (勾點) 區段。您可能會收到以下錯誤訊息:
「'CodeDeployBlueGreenHook' of type AWS::CodeDeploy::BlueGreen failed with message: Internal Failure」
當您建立會啟動藍/綠部署的變更集時,必須將 CloudFormation 服務 AWS Identity and Access Management (IAM) 角色附加到您的 CloudFormation 堆疊。若要解決此錯誤,請授予服務角色權限以執行堆疊操作。
**注意:**在 CodeDeploy 建立堆疊後,您無法從堆疊中移除服務角色。
如果您定義 DefaultAction 以包含 ForwardConfig 屬性,但未在 AWS::ElasticLoadBalancingV2::Listener 資源類型中包含 Weight 屬性,則 CodeDeploy 勾點將失敗。若要解決此錯誤,請確保在您的資源類型中包含 Weight 屬性。
附加資源錯誤
當您在同一次堆疊更新中,同時包含啟動綠色部署的資源更新與其他資源的更新時,會發生以下錯誤:
「Additional resource diff other than Amazon ECS application related resource update is detected,CodeDeploy can't perform BlueGreen style update properly.Diff resource logical Ids: []」
若要解決此錯誤,請完成以下步驟:
- 執行兩個獨立的堆疊更新操作。
**注意:**一次堆疊更新必須只包含啟動綠色部署的已更新資源 (AWS::ECS::TaskDefinition 和 AWS::ECS::TaskSet)。第二次堆疊更新必須包含其他資源的變更。
- 從您的 CloudFormation 範本中移除 Transform (轉換) 和 Hooks (勾點) 區段,然後執行堆疊更新。**注意:**在此情況下,CloudFormation 不會執行綠色部署。
不支援錯誤
不支援 CloudFormation 範本中的匯入或匯出組態。如果您宣告 Outputs (輸出) 或使用 Fn::ImportValue 從其他堆疊匯入值,以用於定義 Amazon ECS 藍/綠部署的範本,則會收到以下錯誤:
「Imports and exports are currently not supported on templates using hooks」
若要解決此錯誤,請勿在範本中使用匯入或匯出。
CodeDeploy 無法更新使用動態參考從第三方擷取其值的參數,或在綠色部署期間未定義 NoEcho 屬性的參數。當您使用動態參考時,您可能會收到以下錯誤:
「'CodeDeployBlueGreenHook' of type AWS::CodeDeploy::BlueGreen failed with message: NoEcho parameter Dynamic references is not supported in template when using AWS::CodeDeploy::BlueGreen Hook」
若要解決此錯誤,請勿在範本中使用動態參考。
測試接聽程式錯誤
如果您指定的測試接聽程式已經指向綠色目標群組,則 CodeDeploy 勾點將失敗,且您會收到以下錯誤:
「'CodeDeployBlueGreenHook' of type AWS::CodeDeploy::BlueGreen failed with message: Replacement target group [ALBTargetGroupGreen] is already serving traffic behind listener [ALBListenerTestTraffic]」
若要解決此錯誤,請確保在上傳 CloudFormation 範本時,Production (正式環境) 與 Test Listeners (測試接聽程式) 欄位具有相同的值。
缺少「轉換」錯誤
如果您未在更新的 CloudFormation 範本中包含 Transform (轉換) 區段,則系統不會調用「轉換」。如果藍/綠資源邏輯 ID 未轉換,您會收到以下錯誤:
「'CodeDeployBlueGreenHook' of type AWS::CodeDeploy::BlueGreen failed with message: The submitted template's primary task definition 'BlueTaskDefinition' was never updated.The template's 'AWS::CodeDeployBlueGreen' Transform might be missing or removed」
若要解決此錯誤,請確保在更新 CloudFormation 堆疊之前,於 CloudFormation 範本中包含 Transform (轉換) 區段。
負載平衡器錯誤
TrafficRoutingConfig 類型必須設定為 AllAtOnce。如果您在範本中包含 Network Load Balancer,並且使用 AWS::CodeDeploy::BlueGreen 勾點,且 TrafficRoutingConfig 類型設定為 TimeBasedCanary 或 TimeBasedLinear,則會收到以下錯誤:
「'CodeDeployBlueGreenHook' of type AWS::CodeDeploy::BlueGreen failed with message: Only AllAtOnce traffic routing config type is supported for network load balancers.」
若要解決此錯誤,請確保將 TrafficRoutingConfig 類型設定為 AllAtOnce。
如果您將負載平衡器 Amazon Resource Name (ARN) 設定為 Parameter (參數),並在 AWS::ElasticLoadBalancingV2::Listener 中使用 !Ref 來參考 LoadBalancerArn 屬性,您可能會收到以下錯誤:
「Transform AWS::CodeDeployBlueGreen failed with: Failed to transform template.Could not find AWS::ElasticLoadBalancingV2::LoadBalancer LoadBalancerArn」
若要解決此錯誤,請在範本中建立負載平衡器資源,並在 LoadBalancerArn 屬性中參考 ARN。或者,您也可以將負載平衡器 ARN 硬式編碼到 LoadBalancerArn 屬性中。
Amazon ECS 服務錯誤
如果您在 Hooks (勾點) 的 Applications 屬性下,新增兩個共用同一個 Application Load Balancer 的不同 Amazon ECS 服務目標,您可能會收到以下錯誤:
「'CodeDeployBlueGreenHook' of type AWS::CodeDeploy::BlueGreen failed with message: Handler failed: Applications must have at most one application in AWS::CodeDeploy::BlueGreen Hook」
若要解決此錯誤,請確保僅將一個 Amazon ECS 服務附加至 Application Load Balancer。