Blue/Green デプロイメントを利用して ECS on EC2 から ECS on Fargate へ移行してみた

Blue/Green デプロイメントを利用して ECS on EC2 から ECS on Fargate へ移行してみた

Clock Icon2025.06.15

こんにちは!クラウド事業本部コンサルティング部のたかくに(@takakuni_)です。

先日、Amazon ECS サービスでキャパシティプロバイダー戦略の更新がサポートされました。

https://dev.classmethod.jp/articles/amazon-ecs-capacity-provider-configuration-ec/

これにより、プラットフォームを柔軟に変更できるようになったわけですが、Blue/Green デプロイメントを行っている ECS サービスでも同様にプラットフォームの切り替えが可能になっています。

今回は Blue/Green デプロイメントでキャパシティプロバイダー戦略の切り替えを行ってみたいと思います。

はじめに

前提をそろえます。今回は EC2 ASG キャパシティプロバイダーを利用している ECS サービスから Fargate への移行をやってみます。

2025-06-15 at 17.21.50-サービスタスク  Elastic Container Service  ap-northeast-1@2x.png

デプロイメントは次のように CodeDeploy を利用した Blue/Green デプロイメントを利用しています。

2025-06-15 at 17.22.29-サービスデプロイ  Elastic Container Service  ap-northeast-1@2x.png

appspec.yaml の更新

プラットフォームの切り替えは appspec.yaml を更新して行います。CapacityProviderStrategy で切り替えできます。

ちなみに、指定していない場合は ECS クラスターに設定されたデフォルトキャパシティプロバイダーが選択されます。

Resources:
  - TargetService:
      Type: AWS::ECS::Service
      Properties:
        TaskDefinition: "task-definition-arn"
        LoadBalancerInfo: 
          ContainerName: "ecs-container-name" 
          ContainerPort: "ecs-application-port"
# Optional properties
        PlatformVersion: "ecs-service-platform-version"
        NetworkConfiguration:
          AwsvpcConfiguration:
            Subnets: ["ecs-subnet-1","ecs-subnet-n"] 
            SecurityGroups: ["ecs-security-group-1","ecs-security-group-n"] 
            AssignPublicIp: "ENABLED | DISABLED"
        CapacityProviderStrategy:
          - Base: integer
            CapacityProvider: "capacityProviderA"
            Weight: integer
          - Base: integer
            CapacityProvider: "capacityProviderB"
            Weight: integer

https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/reference-appspec-file-structure-resources.html#reference-appspec-file-structure-resources-ecs

たとえば、今回のように AWS Fargate へ移行したい場合は、以下のように変更します。

version: 0.0
Resources:
  - TargetService:
      Type: AWS::ECS::Service
      Properties:
        TaskDefinition: <TASK_DEFINITION>
        LoadBalancerInfo:
          ContainerName: "task-dev"
          ContainerPort: 80
        CapacityProviderStrategy:
          - Base: 0
+            CapacityProvider: "FARGATE"
-            CapacityProvider: "ec2-asg-provider" # 
            Weight: 1

プッシュすると、パイプラインが動き始めました。

2025-06-15 at 17.54.10-codepipeline-dev  CodePipeline  ap-northeast-1@2x.png

CodeDeploy を見ると Blue/Green が働いていますね。

2025-06-15 at 17.56.44-d-66A5Y2FZC  CodeDeploy  ap-northeast-1@2x.png

ECS サービスを見ると Fargate と EC2 でホストされたタスクが混在していますね。

2025-06-15 at 17.55.39-サービスタスク  Elastic Container Service  ap-northeast-1@2x.png

トラフィックを Green 側に切り替え問題ないことを確認しました。デプロイが完了しています。

2025-06-15 at 17.57.16-d-66A5Y2FZC  CodeDeploy  ap-northeast-1@2x.png

EC2 でホストしたタスクが停止中となっていました。(一番下の停止済みのタスクは、デプロイとは別の問題で止まったものです)

2025-06-15 at 17.57.42-サービスタスク  Elastic Container Service  ap-northeast-1@2x.png

最終的に停止済みとなりました。

2025-06-15 at 17.58.11-サービスタスク  Elastic Container Service  ap-northeast-1@2x.png

ECS クラスター内の ECS サービスで、 EC2 を使うことがなくなったら、削除しておきましょう。

2025-06-15 at 17.58.33-クラスターインフラストラクチャ  Elastic Container Service  ap-northeast-1@2x.png

Fargate から EC2 への移行は?

色々な事情で Fargate から EC2 へ移行したくなる時もあると思います。

その時は ECS クラスター上でキャパシティプロバイダーを作成したのちに、appspec.yaml を逆に設定してあげると完了です。

version: 0.0
Resources:
  - TargetService:
      Type: AWS::ECS::Service
      Properties:
        TaskDefinition: <TASK_DEFINITION>
        LoadBalancerInfo:
          ContainerName: "task-dev"
          ContainerPort: 80
        CapacityProviderStrategy:
          - Base: 0
+            CapacityProvider: "ec2-asg-provider" # 
-            CapacityProvider: "FARGATE"
            Weight: 1

まとめ

以上、「Blue/Green デプロイメントを利用して ECS on EC2 から ECS on Fargate へ移行してみた」でした。

当たり前ではあるのですが、Blue/Green デプロイメントで切り替える場合は、 UpdateService API を直接実行するのではなく、appspec.yaml から変更していきましょう。と伝えたかっただけです。

このブログがどなたかの参考になれば幸いです。クラウド事業本部コンサルティング部のたかくに(@takakuni_)でした!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.