AWS CloudFormation で Amazon Elastic Container Service (Amazon ECS) ブルー/グリーンデプロイを構成する際に、エラーが発生します。
解決策
CloudFormation で AWS::CodeDeploy::BlueGreen フックを使用すると、エラーメッセージが表示される場合があります。エラーをトラブルシューティングするには、各エラーに対応する解決策セクションの手順を実行します。
Failure to parse エラー
権限が付与されていない場合、またはテンプレートに Weight プロパティが含まれない場合、AWS CodeDeploy は指定されたテンプレートの Hooks セクションを解釈できません。次のエラーメッセージが表示される可能性があります。
"'CodeDeployBlueGreenHook' of type AWS::CodeDeploy::BlueGreen failed with message: Internal Failure"
ブルー/グリーンデプロイを有効にする変更セットを作成する際は、CloudFormation スタックに CloudFormation サービスの AWS Identity and Access Management (IAM) ロールをアタッチする必要があります。このエラーを解決するには、スタック操作を実行する権限をサービスロールに付与します。
注: CodeDeploy がスタックを作成した後は、スタックからサービスロールを削除することはできません。
DefaultAction の定義に ForwardConfig プロパティが含まれているものの、リソースタイプ AWS::ElasticLoadBalancingV2::Listener に Weight プロパティが含まれていない場合、CodeDeploy フックは失敗します。このエラーを解決するには、リソースタイプに Weight プロパティが含まれていることを確認します。
Additional resource エラー
同じスタック更新内に、グリーンデプロイを開始するリソースに対する更新と、その他のリソースに対する更新が含まれている場合、次のエラーが発生します。
"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: []"
このエラーを解決するには、次の手順を実行します。
- 2 つのスタック更新操作を別々に実行します。
注: 一方のスタック更新には、グリーンデプロイを開始するリソースの更新版のみを含める必要があります (AWS::ECS::TaskDefinition、AWS::ECS::TaskSet)。2 番目のスタック更新には、他のリソースに対する変更を含める必要があります。
- CloudFormation テンプレートから Transform セクションと Hooks セクションを削除した後、スタック更新を実行します。注: この場合、CloudFormation はグリーンデプロイを実行しません。
Not supported エラー
CloudFormation テンプレートでは、構成のインポートとエクスポートはサポートされません。Amazon ECS のブルー/グリーンデプロイを定義するテンプレートにおいて、他のスタックから値をインポートするために Outputs を宣言した場合、または Fn::ImportValue を使用した場合、次のエラーが発生します。
"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"
このエラーを解決するには、テンプレートでは動的参照の使用を避けます。
Test listener エラー
既にグリーンのターゲットグループを指すテストリスナーを指定した場合、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 の両フィールドに同じ値が含まれていることを確認します。
Transform missing エラー
更新版 CloudFormation テンプレートに Transform セクションが含まれていない場合、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 セクションが含まれていることを確認します。
Load Balancer エラー
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." (Network Load Balancer では、トラフィックルーティング構成のタイプには AllAtOnce のみがサポートされます)
このエラーを解決するには、TrafficRoutingConfig のタイプを AllAtOnce に設定したことを確認します。
ロードバランサーの Amazon リソースネーム (ARN) をパラメータとして構成し、!Ref を使用して AWS::ElasticLoadBalancingV2::Listener の LoadBalancerArn プロパティを参照している場合、次のエラーが発生する可能性があります。
"Transform AWS::CodeDeployBlueGreen failed with: Failed to transform template.Could not find AWS::ElasticLoadBalancingV2::LoadBalancer LoadBalancerArn"
このエラーを解決するには、テンプレート内にロードバランサーのリソースを作成し、LoadBalancerArn プロパティで ARN を参照します。または、LoadBalancerArn プロパティにロードバランサーの ARN をハードコードすることも可能です。
Amazon ECS service エラー
単一の Application Load Balancer を共有する、2 つの異なる Amazon ECS サービスのターゲットを Hooks Applications プロパティに追加した場合、次のエラーが発生する可能性があります。
"'CodeDeployBlueGreenHook' of type AWS::CodeDeploy::BlueGreen failed with message: Handler failed: Applications must have at most one application in AWS::CodeDeploy::BlueGreen Hook"
このエラーを解決するには、Application Load Balancer には 1 つの Amazon ECS サービスのみをアタッチします。