Blue/Green デプロイメントを利用して ECS on EC2 から ECS on Fargate へ移行してみた
こんにちは!クラウド事業本部コンサルティング部のたかくに(@takakuni_)です。
先日、Amazon ECS サービスでキャパシティプロバイダー戦略の更新がサポートされました。
これにより、プラットフォームを柔軟に変更できるようになったわけですが、Blue/Green デプロイメントを行っている ECS サービスでも同様にプラットフォームの切り替えが可能になっています。
今回は Blue/Green デプロイメントでキャパシティプロバイダー戦略の切り替えを行ってみたいと思います。
はじめに
前提をそろえます。今回は EC2 ASG キャパシティプロバイダーを利用している ECS サービスから Fargate への移行をやってみます。
デプロイメントは次のように CodeDeploy を利用した Blue/Green デプロイメントを利用しています。
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
たとえば、今回のように 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
プッシュすると、パイプラインが動き始めました。
CodeDeploy を見ると Blue/Green が働いていますね。
ECS サービスを見ると Fargate と EC2 でホストされたタスクが混在していますね。
トラフィックを Green 側に切り替え問題ないことを確認しました。デプロイが完了しています。
EC2 でホストしたタスクが停止中となっていました。(一番下の停止済みのタスクは、デプロイとは別の問題で止まったものです)
最終的に停止済みとなりました。
ECS クラスター内の ECS サービスで、 EC2 を使うことがなくなったら、削除しておきましょう。
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_)でした!