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