Tutorial: como criar um serviço usando uma implantação azul/verde - Amazon Elastic Container Service

Tutorial: como criar um serviço usando uma implantação azul/verde

O Amazon ECS integrou as implantações azul/verde ao assistente Create Service (Criar serviço) no console do Amazon ECS. Para obter mais informações, consulte Criação de uma implantação de atualização contínua do Amazon ECS.

O tutorial a seguir mostra como criar um serviço do Amazon ECS contendo uma tarefa do Fargate que usa o tipo de implantação azul/verde com a AWS CLI.

nota

Adicionado suporte para executar uma implantação azul/verde para AWS CloudFormation. Para obter mais informações, consulte Executar implantações azuis/verdes do Amazon ECS por meio do CodeDeploy usando o AWS CloudFormation no Guia do usuário do AWS CloudFormation.

Pré-requisitos

Este tutorial pressupõe que você concluiu os seguintes pré-requisitos:

Etapa 1: criar um Application Load Balancer

Os serviços do Amazon ECS que usam o tipo de implantação azul/verde exigem o uso de um Application Load Balancer ou de um Network Load Balancer. Este tutorial usa um Application Load Balancer.

Para criar um Application Load Balancer
  1. Use o comando create-load-balancer para criar um Application Load Balancer. Especifique duas sub-redes que não estejam na mesma Zona de disponibilidade, bem como um grupo de segurança.

    aws elbv2 create-load-balancer \ --name bluegreen-alb \ --subnets subnet-abcd1234 subnet-abcd5678 \ --security-groups sg-abcd1234 \ --region us-east-1

    O resultado inclui o Nome de recurso da Amazon (ARN) do load balancer, com o seguinte formato:

    arn:aws:elasticloadbalancing:region:aws_account_id:loadbalancer/app/bluegreen-alb/e5ba62739c16e642
  2. Use o comando create-target-group para criar um grupo de destino. Esse grupo de destino roteará o tráfego para a tarefa original definida no seu serviço.

    aws elbv2 create-target-group \ --name bluegreentarget1 \ --protocol HTTP \ --port 80 \ --target-type ip \ --vpc-id vpc-abcd1234 \ --region us-east-1

    A saída inclui o ARN do grupo de destino, com o seguinte formato:

    arn:aws:elasticloadbalancing:region:aws_account_id:targetgroup/bluegreentarget1/209a844cd01825a4
  3. Use o comando create-listener para criar um listener do load balancer com uma regra padrão que encaminha solicitações ao grupo de destino.

    aws elbv2 create-listener \ --load-balancer-arn arn:aws:elasticloadbalancing:region:aws_account_id:loadbalancer/app/bluegreen-alb/e5ba62739c16e642 \ --protocol HTTP \ --port 80 \ --default-actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:region:aws_account_id:targetgroup/bluegreentarget1/209a844cd01825a4 \ --region us-east-1

    A saída inclui o ARN do listener, com o seguinte formato:

    arn:aws:elasticloadbalancing:region:aws_account_id:listener/app/bluegreen-alb/e5ba62739c16e642/665750bec1b03bd4

Etapa 2: criar um cluster do Amazon ECS

Use o comando create-cluster para criar um cluster chamado tutorial-bluegreen-cluster a ser usado.

aws ecs create-cluster \ --cluster-name tutorial-bluegreen-cluster \ --region us-east-1

A saída inclui o ARN do cluster, com o seguinte formato:

arn:aws:ecs:region:aws_account_id:cluster/tutorial-bluegreen-cluster

Etapa 3: registrar uma definição de tarefa

Use o comando register-task-definition para registrar uma definição de tarefa compatível com o Fargate. Ele exige o uso do modo de rede awsvpc. Veja a seguir o exemplo de definição de tarefa usado para este tutorial.

Primeiro, crie um arquivo chamado fargate-task.json com os conteúdos a seguir. Certifique-se de usar o ARN para a sua função de execução da tarefa. Para obter mais informações, consulte Função do IAM de execução de tarefas do Amazon ECS.

{ "family": "sample-fargate", "networkMode": "awsvpc", "containerDefinitions": [ { "name": "sample-app", "image": "public.ecr.aws/docker/library/httpd:latest", "portMappings": [ { "containerPort": 80, "hostPort": 80, "protocol": "tcp" } ], "essential": true, "entryPoint": [ "sh", "-c" ], "command": [ "/bin/sh -c \"echo '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p> </div></body></html>' > /usr/local/apache2/htdocs/index.html && httpd-foreground\"" ] } ], "requiresCompatibilities": [ "FARGATE" ], "cpu": "256", "memory": "512" }

Em seguida, registre a definição de tarefa usando o arquivo fargate-task.json criado.

aws ecs register-task-definition \ --cli-input-json file://fargate-task.json \ --region us-east-1

Etapa 4: criar um serviço do Amazon ECS

Use o comando create-service para criar um serviço.

Primeiro, crie um arquivo chamado service-bluegreen.json com os conteúdos a seguir.

{ "cluster": "tutorial-bluegreen-cluster", "serviceName": "service-bluegreen", "taskDefinition": "tutorial-task-def", "loadBalancers": [ { "targetGroupArn": "arn:aws:elasticloadbalancing:region:aws_account_id:targetgroup/bluegreentarget1/209a844cd01825a4", "containerName": "sample-app", "containerPort": 80 } ], "launchType": "FARGATE", "schedulingStrategy": "REPLICA", "deploymentController": { "type": "CODE_DEPLOY" }, "platformVersion": "LATEST", "networkConfiguration": { "awsvpcConfiguration": { "assignPublicIp": "ENABLED", "securityGroups": [ "sg-abcd1234" ], "subnets": [ "subnet-abcd1234", "subnet-abcd5678" ] } }, "desiredCount": 1 }

Em seguida, crie o seu serviço usando o arquivo service-bluegreen.json que você criou.

aws ecs create-service \ --cli-input-json file://service-bluegreen.json \ --region us-east-1

A saída inclui o ARN do serviço, com o seguinte formato:

arn:aws:ecs:region:aws_account_id:service/service-bluegreen

Etapa 5: criar os recursos do AWS CodeDeploy

Use as etapas a seguir para criar a aplicação do CodeDeploy, o grupo de destino do Application Load Balancer para o grupo de implantação do CodeDeploy e o grupo de implantação do CodeDeploy.

Para criar recursos do CodeDeploy
  1. Use o comando create-application para criar uma aplicação do CodeDeploy. Especifique a plataforma de computação ECS.

    aws deploy create-application \ --application-name tutorial-bluegreen-app \ --compute-platform ECS \ --region us-east-1

    A saída inclui o ID do aplicativo, com o seguinte formato:

    {
        "applicationId": "b8e9c1ef-3048-424e-9174-885d7dc9dc11"
    }
  2. Use o comando create-target-group para criar um segundo grupo de destino do Application Load Balancer, que será usado quando for criado o grupo de implantação do CodeDeploy.

    aws elbv2 create-target-group \ --name bluegreentarget2 \ --protocol HTTP \ --port 80 \ --target-type ip \ --vpc-id "vpc-0b6dd82c67d8012a1" \ --region us-east-1

    A saída inclui o ARN para o grupo de destino, com o seguinte formato:

    arn:aws:elasticloadbalancing:region:aws_account_id:targetgroup/bluegreentarget2/708d384187a3cfdc
  3. Use o comando create-deployment-group para criar um grupo de implantação do CodeDeploy.

    Primeiro, crie um arquivo chamado tutorial-deployment-group.json com os conteúdos a seguir. Este exemplo usa o recurso que você criou. Para o serviceRoleArn, especifique o ARN da função do IAM do CodeDeploy do Amazon ECS. Para obter mais informações, consulte Função do IAM para CodeDeploy do Amazon ECS.

    { "applicationName": "tutorial-bluegreen-app", "autoRollbackConfiguration": { "enabled": true, "events": [ "DEPLOYMENT_FAILURE" ] }, "blueGreenDeploymentConfiguration": { "deploymentReadyOption": { "actionOnTimeout": "CONTINUE_DEPLOYMENT", "waitTimeInMinutes": 0 }, "terminateBlueInstancesOnDeploymentSuccess": { "action": "TERMINATE", "terminationWaitTimeInMinutes": 5 } }, "deploymentGroupName": "tutorial-bluegreen-dg", "deploymentStyle": { "deploymentOption": "WITH_TRAFFIC_CONTROL", "deploymentType": "BLUE_GREEN" }, "loadBalancerInfo": { "targetGroupPairInfoList": [ { "targetGroups": [ { "name": "bluegreentarget1" }, { "name": "bluegreentarget2" } ], "prodTrafficRoute": { "listenerArns": [ "arn:aws:elasticloadbalancing:region:aws_account_id:listener/app/bluegreen-alb/e5ba62739c16e642/665750bec1b03bd4" ] } } ] }, "serviceRoleArn": "arn:aws:iam::aws_account_id:role/ecsCodeDeployRole", "ecsServices": [ { "serviceName": "service-bluegreen", "clusterName": "tutorial-bluegreen-cluster" } ] }

    Em seguida, cria um grupo de implantação do CodeDeploy.

    aws deploy create-deployment-group \ --cli-input-json file://tutorial-deployment-group.json \ --region us-east-1

    A saída inclui o ID do grupo de implantação, com o seguinte formato:

    {
        "deploymentGroupId": "6fd9bdc6-dc51-4af5-ba5a-0a4a72431c88"
    }

Etapa 6: criar e monitorar uma implantação do CodeDeploy

Use as seguintes etapas para criar e carregar um arquivo de especificação de aplicação (arquivo AppSpec) e uma implantação do CodeDeploy.

Para criar e monitorar uma implantação do CodeDeploy
  1. Crie e faça upload de um arquivo AppSpec usando as etapas a seguir.

    1. Crie um arquivo denominado appspec.yaml com o conteúdo do grupo de implantação do CodeDeploy. Este exemplo usa os recursos criados por você anteriormente no tutorial.

      version: 0.0 Resources: - TargetService: Type: AWS::ECS::Service Properties: TaskDefinition: "arn:aws:ecs:region:aws_account_id:task-definition/first-run-task-definition:7" LoadBalancerInfo: ContainerName: "sample-app" ContainerPort: 80 PlatformVersion: "LATEST"
    2. Use o comando s3 mb para criar um bucket do Amazon S3 para o arquivo AppSpec.

      aws s3 mb s3://tutorial-bluegreen-bucket
    3. Use o comando s3 cp para carregar o arquivo AppSpec para o bucket do Amazon S3.

      aws s3 cp ./appspec.yaml s3://tutorial-bluegreen-bucket/appspec.yaml
  2. Crie a implantação do CodeDeploy usando as etapas a seguir.

    1. Crie um arquivo denominado create-deployment.json com o conteúdo da implantação do CodeDeploy. Este exemplo usa os recursos criados por você anteriormente no tutorial.

      { "applicationName": "tutorial-bluegreen-app", "deploymentGroupName": "tutorial-bluegreen-dg", "revision": { "revisionType": "S3", "s3Location": { "bucket": "tutorial-bluegreen-bucket", "key": "appspec.yaml", "bundleType": "YAML" } } }
    2. Use o comando create-deployment para criar uma implantação.

      aws deploy create-deployment \ --cli-input-json file://create-deployment.json \ --region us-east-1

      A saída inclui o ID de implantação, com o seguinte formato:

      {
          "deploymentId": "d-RPCR1U3TW"
      }
    3. Use o comando get-deployment-target para obter os detalhes da implantação, especificando o deploymentId da saída anterior.

      aws deploy get-deployment-target \ --deployment-id "d-IMJU3A8TW" \ --target-id tutorial-bluegreen-cluster:service-bluegreen \ --region us-east-1

      Continue a recuperar os detalhes de implantação até que o status seja Succeeded, como mostra a saída a seguir.

      {
          "deploymentTarget": {
              "deploymentTargetType": "ECSTarget",
              "ecsTarget": {
                  "deploymentId": "d-RPCR1U3TW",
                  "targetId": "tutorial-bluegreen-cluster:service-bluegreen",
                  "targetArn": "arn:aws:ecs:region:aws_account_id:service/service-bluegreen",
                  "lastUpdatedAt": 1543431490.226,
                  "lifecycleEvents": [
                      {
                          "lifecycleEventName": "BeforeInstall",
                          "startTime": 1543431361.022,
                          "endTime": 1543431361.433,
                          "status": "Succeeded"
                      },
                      {
                          "lifecycleEventName": "Install",
                          "startTime": 1543431361.678,
                          "endTime": 1543431485.275,
                          "status": "Succeeded"
                      },
                      {
                          "lifecycleEventName": "AfterInstall",
                          "startTime": 1543431485.52,
                          "endTime": 1543431486.033,
                          "status": "Succeeded"
                      },
                      {
                          "lifecycleEventName": "BeforeAllowTraffic",
                          "startTime": 1543431486.838,
                          "endTime": 1543431487.483,
                          "status": "Succeeded"
                      },
                      {
                          "lifecycleEventName": "AllowTraffic",
                          "startTime": 1543431487.748,
                          "endTime": 1543431488.488,
                          "status": "Succeeded"
                      },
                      {
                          "lifecycleEventName": "AfterAllowTraffic",
                          "startTime": 1543431489.152,
                          "endTime": 1543431489.885,
                          "status": "Succeeded"
                      }
                  ],
                  "status": "Succeeded",
                  "taskSetsInfo": [
                      {
                          "identifer": "ecs-svc/9223370493425779968",
                          "desiredCount": 1,
                          "pendingCount": 0,
                          "runningCount": 1,
                          "status": "ACTIVE",
                          "trafficWeight": 0.0,
                          "targetGroup": {
                              "name": "bluegreentarget1"
                          }
                      },
                      {
                          "identifer": "ecs-svc/9223370493423413672",
                          "desiredCount": 1,
                          "pendingCount": 0,
                          "runningCount": 1,
                          "status": "PRIMARY",
                          "trafficWeight": 100.0,
                          "targetGroup": {
                              "name": "bluegreentarget2"
                          }
                      }
                  ]
              }
          }
      }

Etapa 7: limpar

Ao concluir este tutorial, limpe os recursos associados a ele para evitar cobranças por recursos que você não está usando.

Limpando os recursos do tutorial
  1. Use o comando delete-deployment-group para excluir o grupo de implantação do CodeDeploy.

    aws deploy delete-deployment-group \ --application-name tutorial-bluegreen-app \ --deployment-group-name tutorial-bluegreen-dg \ --region us-east-1
  2. Use o comando delete-application para excluir a aplicação do CodeDeploy.

    aws deploy delete-application \ --application-name tutorial-bluegreen-app \ --region us-east-1
  3. Use o comando delete-service para excluir o serviço do Amazon ECS. Usar o sinalizador --force permite que você exclua um serviço, ainda que ele não tenha sido reduzido a zero tarefas.

    aws ecs delete-service \ --service arn:aws:ecs:region:aws_account_id:service/service-bluegreen \ --force \ --region us-east-1
  4. Use o comando delete-cluster para excluir o cluster do Amazon ECS.

    aws ecs delete-cluster \ --cluster tutorial-bluegreen-cluster \ --region us-east-1
  5. Use o comando s3 rm para excluir o arquivo AppSpec do bucket do Amazon S3.

    aws s3 rm s3://tutorial-bluegreen-bucket/appspec.yaml
  6. Use o comando s3 rb para excluir o bucket do Amazon S3.

    aws s3 rb s3://tutorial-bluegreen-bucket
  7. Use o comando delete-load-balancer para excluir o Application Load Balancer.

    aws elbv2 delete-load-balancer \ --load-balancer-arn arn:aws:elasticloadbalancing:region:aws_account_id:loadbalancer/app/bluegreen-alb/e5ba62739c16e642 \ --region us-east-1
  8. Use o comando delete-target-group para excluir os dois grupos de destino do Application Load Balancer.

    aws elbv2 delete-target-group \ --target-group-arn arn:aws:elasticloadbalancing:region:aws_account_id:targetgroup/bluegreentarget1/209a844cd01825a4 \ --region us-east-1
    aws elbv2 delete-target-group \ --target-group-arn arn:aws:elasticloadbalancing:region:aws_account_id:targetgroup/bluegreentarget2/708d384187a3cfdc \ --region us-east-1