CloudFormationでCodeDeployのECSのBlue/Greenデプロイメントを作成する

CloudFormationでCodeDeployのアプリケーションとデプロイグループ作成しました。
作成時に発生したエラーと解決方法を記事にします。

以下、デプロイの要件です。

  • ECSのデプロイ
  • Blue/Greenデプロイメント

正常に動作したCloudFormationファイル

Resources:
# ------------------------------------------------------------#
# CodeDeploy
# ------------------------------------------------------------#
  CodeDeployApplication:
    Type: "AWS::CodeDeploy::Application"
    Properties:
      ApplicationName: "test-codedeploy-web-ap"
      ComputePlatform: "ECS"

  CodeDeployDeploymentGroup:
    Type: "AWS::CodeDeploy::DeploymentGroup"
    Properties:
      ApplicationName: !Ref CodeDeployApplication
      DeploymentGroupName: "test-codedeploy-web-dg"
      DeploymentConfigName: "CodeDeployDefault.ECSAllAtOnce"
      ServiceRoleArn: !Sub "arn:aws:iam::${AWS::AccountId}:role/test-role-codedeploy-ecscmn"
      AlarmConfiguration: 
        Enabled: false
        IgnorePollAlarmFailure: false
      DeploymentStyle: 
        DeploymentType: "BLUE_GREEN"
        DeploymentOption: "WITH_TRAFFIC_CONTROL"
      BlueGreenDeploymentConfiguration:
        TerminateBlueInstancesOnDeploymentSuccess:
          Action: TERMINATE
          TerminationWaitTimeInMinutes: 5
        DeploymentReadyOption:
          ActionOnTimeout: CONTINUE_DEPLOYMENT
          WaitTimeInMinutes: 0
      ECSServices:
        - ServiceName: "test-ecs-web-service"
          ClusterName: "test-ecs-web-cluster"
      LoadBalancerInfo:
        TargetGroupPairInfoList:
          - TargetGroups:
              - Name: "test-tg-web-1"
              - Name: "test-tg-web-2"
            ProdTrafficRoute:
              ListenerArns: 
                - {'Fn::ImportValue': 'test-alblistener-web'}


エラーと対応方法

↑に正常に動作したCloudFormationファイルがありますが、作成時に発生したエラーと対応方法を書いていきます。

1、LoadBalancerInfo 不要エラー

エラーメッセージ
Property LoadBalancerInfo cannot be specified.
原因

ComputePlatform: "ECS" を指定している場合、LoadBalancerInfo を直接指定することができないため
※後々にLoadBalancerInfoは必要だと分かる

対応方法

「LoadBalancerInfo 」を削除


2、LoadBalancerInfo 必須エラー

エラーメッセージ
For ECS deployment group, loadBalancerInfo must be specified (Service: AmazonCodeDeploy; Status Code: 400; Error Code: InvalidLoadBalancerInfoException; Request ID: 20347954-XXXX-XXXX-XXXX-XXXXXXXXXX; Proxy: null)
原因

ECSのBlue/Greenデプロイには LoadBalancerInfoが必須である。

対応方法

LoadBalancerInfoにTargetGroupPairInfoListを使って指定する。
ListenerArnsはALBリスナー作成時にOutputsでExportした。

      LoadBalancerInfo:
        TargetGroupPairInfoList:
          - TargetGroups:
              - Name: !Sub "test-tg-web-1"
              - Name: !Sub "test-tg-web-2"
            ProdTrafficRoute:
              ListenerArns: 
                - {'Fn::ImportValue':  'test-alblistener-web'}

ALBリスナー作成時のCloudFormation(OutPuts部分を抜粋)

Outputs:
  ALBListener:
    Value: !Ref ALBListener
    Export:
      Name:  "test-alblistener-web"


3、blueGreenDeploymentConfiguration 必須エラー

エラーメッセージ
For ECS deployment group, blueGreenDeploymentConfiguration must be specified (Service: AmazonCodeDeploy; Status Code: 400; Error Code: InvalidBlueGreenDeploymentConfigurationException; Request ID: 41a1246f-XXXX-XXXX-XXXX-XXXXXXXXXX; Proxy: null)
原因

ECSの Blue/Greenデプロイ を使用する場合に、blueGreenDeploymentConfiguration プロパティが必須であるため

対応方法

blueGreenDeploymentConfiguration を追加

      BlueGreenDeploymentConfiguration:
        TerminateBlueInstancesOnDeploymentSuccess:
          Action: TERMINATE
          TerminationWaitTimeInMinutes: 5
        DeploymentReadyOption:
          ActionOnTimeout: CONTINUE_DEPLOYMENT
          WaitTimeInMinutes: 0

■ 補足
・TerminationWaitTimeInMinutes:新しいバージョンへのトラフィック切り替えが完了した後、古いバージョンを終了するまでの待機時間。
開発や検証環境では「0」を設定し、本番環境では「5~15」を設定

・WaitTimeInMinutes:テストトラフィック(Test Listener)で新しいバージョンを検証するために待機する時間。
今回はテストを実施しないので「0」を設定


最後に一言二言

今回は手動で作成したサービスをFomer2を利用してCloudFormationを作成しました。
Fomer2は出力がシンプルなのですが、出力できない設定もあります。
IaC ジェネレーターは出力が多すぎて、どちらを使った方が良いのか悩ましいです。
以下はIaC ジェネレーターで対応サービスの一覧です。(未対応のサービス半分ぐらい?) docs.aws.amazon.com