CodeDeployを使用したECS-FargateのBlue/Green Deploymentをしてみた。

2021.11.26

この記事は公開されてから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。