

# Creación de una implementación azul/verde de Amazon ECS
<a name="deploy-blue-green-service"></a>

 Con las implementaciones azul/verde de Amazon ECS, puede realizar y comprobar cambios en el servicio antes de implementarlos en un entorno de producción. 

## Requisitos previos
<a name="deploy-blue-green-service-prerequisites"></a>

Realice las siguientes operaciones antes de iniciar una implementación azul/verde. 

1. Configure los permisos adecuados.
   + Para obtener información sobre los permisos de Elastic Load Balancing, consulte [Rol de IAM de infraestructura de Amazon ECS para los equilibradores de carga](AmazonECSInfrastructureRolePolicyForLoadBalancers.md).
   + Para obtener información acerca de los permisos de Lambda, consulte [Permisos necesarios para las funciones de Lambda en las implementaciones azul/verde de Amazon ECS](blue-green-permissions.md)

1. Las implementaciones azul/verde de Amazon ECS requieren que su servicio utilice una de las siguientes características: configure los recursos adecuados.
   + Equilibrador de carga de aplicación: para más información, consulte [Recursos de equilibrador de carga de aplicación para las implementaciones azul/verde, las implementaciones lineales y las implementaciones canario](alb-resources-for-blue-green.md).
   + Equilibrador de carga de red: para más información, consulte [Recursos de Equilibrador de carga de red para las implementaciones azul/verde, las implementaciones lineales y las implementaciones canario de Amazon ECS](nlb-resources-for-blue-green.md).
   + Service Connect: para más información, consulte [Recursos de Service Connect para las implementaciones azul/verde, las implementaciones lineales y las implementaciones canario de Amazon ECS](service-connect-blue-green.md).

1. Decida si quiere ejecutar las funciones de Lambda para las etapas del ciclo de vida.
   + PRE\$1SCALE\$1UP
   + POST\$1SCALE\$1UP
   + TEST\$1TRAFFIC\$1SHIFT
   + POST\$1TEST\$1TRAFFIC\$1SHIFT
   + PRODUCTION\$1TRAFFIC\$1SHIFT
   + POST\$1PRODUCTION\$1TRAFFIC\$1SHIFT

   Para más información, consulte [Cree una función de Lambda con la consola](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html#getting-started-create-function) en la *Guía para desarrolladores de AWS Lambda*.

## Procedimiento
<a name="deploy-blue-green-service-procedure"></a>

Puede utilizar la consola o la AWS CLI para crear un servicio azul/verde de Amazon ECS.

------
#### [ Console ]

1. Abra la consola en [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2).

1. Determine el recurso desde el que lanza el servicio.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/AmazonECS/latest/developerguide/deploy-blue-green-service.html)

   Aparecerá la página **Crear servicio**.

1. En **Detalles del servicio**, haga lo siguiente:

   1. En **Familia de definiciones de tareas**, elija la definición de tarea que se va a utilizar. A continuación, en **Revisión de la definición de tareas**, introduzca la revisión que desee utilizar.

   1. En **Service name** (Nombre del servicio), ingrese un nombre para el servicio.

1. Para ejecutar el servicio en un clúster existente, en **Clúster existente**, elija el clúster. Para ejecutar el servicio en un clúster nuevo, seleccione **Crear clúster** 

1. Elija cómo distribuir las tareas en la infraestructura de clúster. En **Configuración de computación**, elija su opción.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/AmazonECS/latest/developerguide/deploy-blue-green-service.html)

1. En **Configuración de implementación**, haga lo siguiente:

   1. En **Tipo de servicio**, seleccione **Réplica**.

   1. En **Desired tasks** (Tareas deseadas), ingrese el número de tareas que se lanzarán y mantendrán en el servicio.

   1. Para que Amazon ECS monitoree la distribución de las tareas entre las zonas de disponibilidad y las redistribuya cuando haya un desequilibrio, en **Reequilibrio del servicio de zonas de disponibilidad**, seleccione **Reequilibrio del servicio de zonas de disponibilidad**.

   1. En **Periodo de gracia de la comprobación de estado**, introduzca la cantidad de tiempo (en segundos) durante la cual el programador de servicios ignora las comprobaciones de estado de Elastic Load Balancing, VPC Lattice y contenedores en mal estado después de que se haya iniciado una tarea por primera vez. Si no se especifica ningún valor para el período de gracia de comprobación de estado, se utiliza el valor predeterminado: 0.

1. 

   1. En **Tiempo de incorporación**, introduzca el número de minutos que las revisiones de servicio azul y verde durarán simultáneamente antes de que finalice la revisión azul. Esto permite disponer de tiempo para la verificación y la comprobación.

   1. (Opcional) Ejecute las funciones de Lambda que se van a ejecutar en etapas específicas de la implementación. En **Enlaces de ciclo de vida de la implementación**, seleccione las etapas para ejecutar los enlaces de ciclo de vida.

      Para agregar un enlace de ciclo de vida:

      1. Elija **Agregar**.

      1. En **Función de Lambda**, introduzca el nombre o el ARN de la función.

      1. En **Rol**, selecione el rol de IAM que tiene permiso para invocar la función de Lambda.

      1. En **Etapas del ciclo de vida**, seleccione las etapas en las que debe ejecutarse la función de Lambda.

1. Para configurar el modo en que Amazon ECS detecta y gestiona los errores de implementación, expanda **Deployment failure detection** (Detección de errores de implementación) y, a continuación, elija sus opciones. 

   1. Para detener una implementación cuando las tareas no puedan iniciarse, seleccione **Use the Amazon ECS deployment circuit breaker** (Utilizar el interruptor de circuito de implementación de Amazon ECS).

      Para que el software restaure automáticamente la implementación a su último estado completado cuando el disyuntor de implementación establezca un estado con error, seleccione **Restauración en caso de error**.

   1. Para detener una implementación en función de las métricas de la aplicación, seleccione **Use CloudWatch alarms**. A continuación, elija las alarmas en **Nombre de la alarma de CloudWatch**. Para crear una alarma nueva, vaya a la consola de CloudWatch.

      Para que el software restaure automáticamente la implementación a su último estado de implementación completada cuando una alarma de CloudWatch establezca un estado con error, seleccione **Restauración en caso de error**.

1. (Opcional) Para interconectar su servicio con Service Connect, expanda **Service Connect** y, a continuación, especifique lo siguiente:

   1.  Seleccione **Activar Service Connect**.

   1. En **Service Connect configuration** (Configuración de Service Connect), especifique el modo cliente.
      + Si su servicio ejecuta una aplicación cliente de red que solo necesita conectarse a otros servicios del espacio de nombres, elija **Solo en el lado del cliente**.
      + Si su servicio ejecuta una aplicación de servicio web o red y necesita proporcionar puntos de conexión para este servicio y se conecta a otros servicios del espacio de nombres, elija **Client and server** (Cliente y servidor).

   1. Para usar un espacio de nombres que no sea el espacio de nombres predeterminado del clúster, en **Namespace** (Espacio de nombres), elija el espacio de nombres del servicio. Puede ser un espacio de nombres creado por separado en la misma Región de AWS de su Cuenta de AWS o un espacio de nombres en la misma región que se comparta con su cuenta mediante AWS Resource Access Manager (AWS RAM). Para obtener más información sobre los espacios de nombres de AWS Cloud Map compartidos, consulte [Cross-account AWS Cloud Map namespace sharing](https://docs.aws.amazon.com/cloud-map/latest/dg/sharing-namespaces.html) en la *Guía para desarrolladores de AWS Cloud Map*.

   1. (Opcional) Configure las reglas de encabezado de tráfico de prueba para las implementaciones azul/verde. En **Enrutamiento de tráfico de prueba**, especifique lo siguiente:

      1. Seleccione **Habilitar las reglas de encabezado de tráfico de prueba** para enrutar solicitudes específicas a la revisión de servicio verde durante las pruebas.

      1. En **Reglas de coincidencia de encabezados**, configure los criterios para enrutar el tráfico de prueba:
         + **Nombre del encabezado**: introduzca el nombre del encabezado HTTP que desee que coincida (por ejemplo, `X-Test-Version` o `User-Agent`).
         + **Tipo de coincidencia**: elija los criterios de coincidencia:
           + **Coincidencia exacta**: se enrutan las solicitudes en las que el valor del encabezado coincida exactamente con el valor especificado.
           + **Encabezado presente**: se enrutan las solicitudes que contienen el encabezado especificado, independientemente del valor.
           + **Coincidencia de patrones**: se enrutan las solicitudes en las que el valor del encabezado coincide con un patrón especificado.
         + **Valor del encabezado** (si se utiliza una coincidencia exacta o una coincidencia de patrón): introduzca el valor o patrón con el que desea que haya coincidencia.

         Puede agregar varias reglas de coincidencia de encabezados para crear una lógica de enrutamiento compleja. Las solicitudes que coincidan con alguna de las reglas configuradas se enrutarán a la revisión de servicio verde para su comprobación.

      1. Elija **Agregar regla de encabezado** para configurar condiciones de coincidencia de encabezados adicionales.
**nota**  
Las reglas de encabezado de tráfico de prueba le permiten validar la nueva funcionalidad con tráfico controlado antes de finalizar la implementación completa. Esto le permite comprobar la revisión de servicio verde con solicitudes específicas (como las de las herramientas de pruebas internas o de los usuarios de la versión beta) y, al mismo tiempo, mantener un flujo de tráfico normal hacia la revisión de servicio azul.

   1. (Opcional) Especifique una configuración de registro. Seleccione **Utilizar colección de registros**. La opción predeterminada envía registros de contenedor a los Registros de CloudWatch. Las demás opciones del controlador de registro se configuran mediante AWS FireLens. Para obtener más información, consulte [Envío de registros de Amazon ECS a un servicio de AWS o AWS Partner](using_firelens.md).

      A continuación, se describe con más detalle cada uno de los destinos de registro de contenedor.
      + **Amazon CloudWatch**: configure la tarea para enviar registros de contenedor a CloudWatch Logs. Se proporcionan las opciones de controlador de registro predeterminadas que crean un grupo de registros de CloudWatch en su nombre. Para especificar otro nombre de grupo de registros, cambie los valores de las opciones del controlador.
      + **Amazon Data Firehose**: configure la tarea para enviar registros de contenedor a Firehose. Se proporcionan las opciones de controlador de registro predeterminadas que envían registros a un flujo de entrega de Firehose. Para especificar un nombre de flujo de entrega distinto, cambie los valores de las opciones del controlador.
      + **Amazon Kinesis Data Streams**: configure la tarea para enviar registros de contenedores a Kinesis Data Streams. Se proporcionan las opciones de controlador de registro predeterminadas que envían registros a un flujo de Kinesis Data Streams. Para especificar otro nombre de transmisión, cambie los valores de las opciones del controlador.
      + **Amazon OpenSearch Service**: configure la tarea para enviar registros de contenedor a un dominio de OpenSearch Service. Se deben proporcionar las opciones del controlador de registros. 
      + **Amazon S3**: configure la tarea para enviar registros de contenedor a un bucket de Amazon S3. Se proporcionan las opciones de controlador de registro predeterminadas, pero debe especificar un nombre de bucket de Amazon S3 válido.

1. (Opcional) Configure el **equilibrio de carga** para una implementación azul/verde.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/AmazonECS/latest/developerguide/deploy-blue-green-service.html)

1. (Opcional) Para ayudar a identificar el servicio y las tareas, expanda la sección **Tags** (Etiquetas) y, a continuación, configure sus etiquetas.

   Para que Amazon ECS etiquete automáticamente todas las tareas recién lanzadas con el nombre del clúster y las etiquetas de definición de tareas, seleccione **Activar las etiquetas administradas de Amazon ECS** y, a continuación, en **Propagar etiquetas de**, seleccione **Definiciones de tareas**.

   Para que Amazon ECS etiquete automáticamente todas las tareas recién lanzadas con el nombre del clúster y las etiquetas de servicio, seleccione **Activar las etiquetas administradas de Amazon ECS** y, a continuación, en **Propagar etiquetas de**, seleccione **Servicio**.

   Añada o elimine una etiqueta.
   + [Agregar una etiqueta] Seleccione **Add tag** (Agregar etiqueta), y, a continuación, haga lo siguiente:
     + En **Clave**, escriba el nombre de la clave.
     + En **Valor**, escriba el valor de la clave.
   + [Eliminar una etiqueta] Junto a la etiqueta, elija **Remove tag (Quitar etiqueta)**.

1. Seleccione **Crear**.

------
#### [ AWS CLI ]

1. Cree un archivo llamado `service-definition.json` con el siguiente contenido.

   Sustituya las *entradas del usuario* por sus valores.

   ```
   {
     "serviceName": "myBlueGreenService",
     "cluster": "arn:aws:ecs:us-west-2:123456789012:cluster/sample-fargate-cluster",
     "taskDefinition": "sample-fargate:1",
     "desiredCount": 5,
     "launchType": "FARGATE",
     "networkConfiguration": {
       "awsvpcConfiguration": {
         "subnets": [
           "subnet-09ce6e74c116a2299",
           "subnet-00bb3bd7a73526788",
           "subnet-0048a611aaec65477"
         ],
         "securityGroups": [
           "sg-09d45005497daa123"
         ],
         "assignPublicIp": "ENABLED"
       }
     },
     "deploymentController": {
       "type": "ECS"
     },
     "deploymentConfiguration": {
       "strategy": "BLUE_GREEN",
       "maximumPercent": 200,
       "minimumHealthyPercent": 100,
       "bakeTimeInMinutes": 2,
       "alarms": {
         "alarmNames": [
           "myAlarm"
         ],
         "rollback": true,
         "enable": true
       },
       "lifecycleHooks": [
         {
           "hookTargetArn": "arn:aws:lambda:us-west-2:7123456789012:function:checkExample",
           "roleArn": "arn:aws:iam::123456789012:role/ECSLifecycleHookInvoke",
           "lifecycleStages": [
             "PRE_SCALE_UP"
           ]
         }
       ]
     },
     "loadBalancers": [
       {
         "targetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/blue-target-group/54402ff563af1197",
         "containerName": "fargate-app",
         "containerPort": 80,
         "advancedConfiguration": {
           "alternateTargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/green-target-group/cad10a56f5843199",
           "productionListenerRule": "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener-rule/app/my-blue-green-demo/32e0e4f946c3c05b/9cfa8c482e204f7d/831dbaf72edb911",
           "roleArn": "arn:aws:iam::123456789012:role/LoadBalancerManagementforECS"
         }
       }
     ]
   }
   ```

1. Ejecuta `create-service`.

   Sustituya las *entradas del usuario* por sus valores.

   ```
   aws ecs create-service --cli-input-json file://service-definition.json
   ```

   Como alternativa, puede usar el siguiente ejemplo, que crea un servicio de implementación azul/verde con una configuración de equilibrador de carga:

   ```
   aws ecs create-service \
      --cluster "arn:aws:ecs:us-west-2:123456789012:cluster/MyCluster" \
      --service-name "blue-green-example-service" \
      --task-definition "nginxServer:1" \
      --launch-type "FARGATE" \
      --network-configuration "awsvpcConfiguration={subnets=[subnet-12345,subnet-67890,subnet-abcdef,subnet-fedcba],securityGroups=[sg-12345],assignPublicIp=ENABLED}" \
      --desired-count 3 \
      --deployment-controller "type=ECS" \
      --deployment-configuration "strategy=BLUE_GREEN,maximumPercent=200,minimumHealthyPercent=100,bakeTimeInMinutes=0" \
      --load-balancers "targetGroupArn=arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/MyBGtg1/abcdef1234567890,containerName=nginx,containerPort=80,advancedConfiguration={alternateTargetGroupArn=arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/MyBGtg2/0987654321fedcba,productionListenerRule=arn:aws:elasticloadbalancing:us-west-2:123456789012:listener-rule/app/MyLB/1234567890abcdef/1234567890abcdef,roleArn=arn:aws:iam::123456789012:role/ELBManagementRole}"
   ```

------

## Siguientes pasos
<a name="deploy-blue-green-service-next-steps"></a>
+ Actualice el servicio para iniciar la implementación. Para obtener más información, consulte [Actualización de un servicio de Amazon ECS](update-service-console-v2.md).
+ Monitoree el proceso de implementación para asegurarse de que sigue el patrón azul/verde:
  + Se crea y escala verticalmente la revisión de servicio verde
  + El tráfico de prueba se enruta a la revisión verde (si está configurada)
  + El tráfico de producción se transfiere a la revisión verde
  + Transcurrido el tiempo de incorporación, la revisión azul finaliza