この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
Blue/Green Deploymentとは?
Blue/Green Deploymentでは、2つの環境を作成します。1つの環境(Blue)は現在のアプリケーションバージョンを実行し、もう1つの(Green)は新しいアプリケーションバージョンを実行します。Green環境でのテストが完了すると、アプリケーショントラフィックはGreen環境に転送されて、Blue環境は非推奨になります。
この記事では、CodeDeployを使用したFargateのblue/green deploymentをしてみました。
やってみた
Application Load Balancer の作成
Target Groupsの作成
- EC2 コンソールで、Load Balancingで Target Groupsを選択しておきます。
- Create target group を選択して、以下の設定で2つのTarget Groupsを作成しておきます。
- Target type : IP
- Target Group1 name : BlueGreenTarget1
- Target Group2 name : BlueGreenTarget2
- Protocol : HTTP
- Port : 80
Application Load Balancer の作成
- EC2 コンソールでLoad Balancersを選択して、Create Load Balancer を選択しておきます。
- ロードバランサーの名前を入力し、VPC、サブネット、セキュリティグループを選択しておきます。
- この設定でListenerを追加しておきます。
- Protocol : HTTP
- Port : 80
- Forward to : 前の手順で作成されたTarget Group1(BlueGreenTarget1)
ECS-Fargateの作成
IAMロールの作成
- この設定でIAMロールを作成しておきます。
- 信頼されたエンティティの種類 : AWS のサービス
- ユースケース : Elastic Container Service - Elastic Container Service Task
- ポリシー : AmazonECSTaskExecutionRolePolicy
- ロールの名前 : ecsTaskExecutionRole
ECS クラスターの作成
- このコマンドを使用して、名前でクラスターを作成しておきます。
aws ecs create-cluster --cluster-name BlueGreenCluster --region us-east-1
タスク定義の登録
Fargateタスク定義ファイル [ JSON File ] を作成しておきます「task.json」。ファイルで前の手順で作成されたロールのArnを使用します。
{
"family": "BlueGreenTask",
"networkMode": "awsvpc",
"requiresCompatibilities": [ "FARGATE" ],
"cpu": "256",
"memory": "512",
"executionRoleArn": "arn:aws:iam::account-id:role/ecsTaskExecutionRole",
"containerDefinitions": [
{
"name": "fargate-app",
"image": "httpd:2.4",
"portMappings": [
{
"containerPort": 80,
"hostPort": 80,
"protocol": "tcp"
}
],
"essential": true,
"entryPoint": [ "sh", "-c" ],
"command": [ "/bin/sh -c \"echo '<html> <head> <title>ECS FARGATE</title> </head><body> <h2>Application hosted using ECS-Fargate</h2></body></html>' > /usr/local/apache2/htdocs/index.html && httpd-foreground\"" ]
}
]
}
- このコマンドを使用してタスク定義を登録しておきます。
aws ecs register-task-definition --cli-input-json file://task.json --region us-east-1
ECSサービスの作成
[Service.json]ファイルを作成しておきます。このファイルには、Deployment、ロードバランサー、およびネットワーク設定があります。
{
"launchType": "FARGATE",
"taskDefinition": "BlueGreenTask",
"platformVersion": "LATEST",
"cluster": "BlueGreenCluster",
"serviceName": "BlueGreenService",
"schedulingStrategy": "REPLICA",
"deploymentController": {
"type": "CODE_DEPLOY"
},
"networkConfiguration": {
"awsvpcConfiguration": {
"assignPublicIp": "ENABLED",
"securityGroups": [ "sg-id" ],
"subnets": [ "subnet-id1", "subnet-id2" ]
}
},
"loadBalancers": [
{
"targetGroupArn": "arn:aws:elasticloadbalancing:us-east-1:account-id:targetgroup/BlueGreenTagret1/e123456789",
"containerName": "fargate-app",
"containerPort": 80
}
],
"desiredCount": 1
}
- このコマンドを使用して、ECSサービスを作成しておきます。
aws ecs create-service --cli-input-json file://service.json --region us-east-1
CodeDeployの作成
CodeDeploy IAMロールの作成
- この設定でIAMロールを作成しておきます。
- 信頼されたエンティティの種類 : AWS のサービス
- ユースケース : CodeDeploy , CodeDeploy - ECS
- ポリシー : AWSCodeDeployRoleForECS
- ロールの名前 : ecsCodeDeployRole
アプリケーションの作成
- CodeDeploy コンソールで、Create application を選択しておきます。
- アプリケーション名を入力して、Compute PlatformでAmazon ECSを選択して、アプリケーションを作成しておきます。
デプロイ-グループの作成
- CodeDeploy コンソールのアプリケーションページで、Create deployment groupを選択します。
- デプロイグループ名を入力して、前の手順で作成したサービスロールをアタッチしておきます。
- 環境設定で前の手順で作成したECS クラスター名とECS サービス名を選択しておきます。
- Load balancerで前の手順で作成したLoad balancer、本稼働リスナーポート、ターゲットグループ 1 の名前、とターゲットグループ 2 の名前を選択しておきます。
- デプロイ設定:
- Traffic rerouting : すぐにトラフィックを再ルーティング
- Deployment configuration : ECSLinear10PercentEvery1Minutes
- Original revision termination : 10Minutes
- 詳細 – オプションで、「デプロイが失敗したときにロールバックする」を有効にして、デプロイ-グループを作成します。
AppSpecファイルの作成
CodeDeploy デプロイグループの内容で appspec.yamlファイルを作成します。このファイルをs3バケットにアップロードしておきます。
version: 0.0
Resources:
- TargetService:
Type: AWS::ECS::Service
Properties:
TaskDefinition: "arn:aws:ecs:us-east-1:account-id:task-definition/BlueGreenTask:1"
LoadBalancerInfo:
ContainerName: "fargate-app"
ContainerPort: 80
PlatformVersion: "LATEST"
Deploymentの作成
- CodeDeploy コンソールのアプリケーションページで、Create deployment を選択します。
- デプロイグループを選択して、S3 URIを入力して、Deploymentを作成しておきます。
トラフィック移行の進行状況確認する
下の画像から、トラフィックの10%が毎分移行されています。
すべてのトラフィックが移行された後、元のタスクは終了されました。
最初にtarget1をリスナーとして追加しましたが、トラフィックが移行された後、target2が新しいリスナーとして追加されました。
まとめ
CodeDeployを使用したECS-FargateのBlue/Green Deploymentをしてみた。Blue/Green Deploymentを使用すると、アプリケーションの可用性が向上し、デプロイメントのリスクが軽減されます。Elastic Beanstalk、OpsWorks、CloudFormation、CodeDeploy、Amazon ECSなど、多くのAWSデプロイメントサービスがBlue/Green Deploymentをサポートされますs。