

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Tutorial: Implementación estándar de Amazon ECS con CodePipeline
<a name="ecs-cd-pipeline"></a>

Este tutorial le ayuda a crear una canalización de despliegue end-to-end continuo (CD) completa con Amazon ECS con CodePipeline.

**importante**  
Como parte de la creación de una canalización en la consola, para los artefactos se utilizará un depósito de artefactos CodePipeline de S3. (Es diferente del bucket que se usa para una acción de origen de S3). Si el depósito de artefactos de S3 está en una cuenta diferente a la de tu canalización, asegúrate de que el depósito de artefactos de S3 pertenezca a una Cuentas de AWS persona segura y fiable.

**nota**  
Este tutorial es para la acción de implementación estándar de Amazon ECS para CodePipeline. Para ver un tutorial que utiliza Amazon ECS para realizar una acción de implementación CodeDeploy azul/verde CodePipeline, consulte. [Tutorial: Creación de una canalización con una fuente y ECS-to-CodeDeploy una implementación de Amazon ECR](tutorials-ecs-ecr-codedeploy.md)

**nota**  
Este tutorial es para la acción de implementación estándar de Amazon ECS CodePipeline con una acción de origen. Para ver un tutorial en el que se utiliza la acción de ECSstandard despliegue de Amazon junto con la acción de ECRBuild AndPublish creación CodePipeline para insertar la imagen, consulte[Tutorial: Cree e inserte una imagen de Docker en Amazon ECR con CodePipeline (tipo V2)](tutorials-ecr-build-publish.md).

## Requisitos previos
<a name="ecs-cd-prereqs"></a>

Para poder usar este tutorial para crear su propia canalización de implementación continua debe tener instalados algunos recursos. Esto es lo que necesita para empezar: 

**nota**  
Todos estos recursos deben crearse en la misma AWS región.
+ Un repositorio de control de código fuente (se utiliza en este tutorial CodeCommit) con el Dockerfile y el código fuente de la aplicación. Para obtener más información, consulte [Crear un CodeCommit repositorio](https://docs.aws.amazon.com/codecommit/latest/userguide/how-to-create-repository.html) en la Guía del *AWS CodeCommit usuario*.
+ Un repositorio de imágenes de Docker (este tutorial utiliza Amazon ECR) que contenga una imagen que haya creado desde el origen de Dockerfile y de la aplicación. Para obtener más información, consulte [Creación de un repositorio](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html) e [Inserción de una imagen](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-ecr-image.html) en la *Guía del usuario de Amazon Elastic Container Registry*.
+ Una definición de tarea de Amazon ECS que haga referencia a la imagen de Docker alojada en su repositorio de imágenes. Para obtener más información, consulte [Creación de una definición de tarea](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-task-definition.html) en la *Guía para desarrolladores de Amazon Elastic Container Service*.
**importante**  
La acción de despliegue estándar de Amazon ECS CodePipeline crea su propia revisión de la definición de la tarea en función de la revisión utilizada por el servicio Amazon ECS. Si crea nuevas revisiones para la definición de la tarea sin actualizar el servicio Amazon ECS, la acción de implementación ignorará esas revisiones.

  A continuación, se muestra un ejemplo de definición de tarea utilizada en este tutorial. El valor que utiliza para `name` y `family` se utilizará en el siguiente paso del archivo de especificaciones de compilación.

  ```
  {
    "ipcMode": null,
    "executionRoleArn": "role_ARN",
    "containerDefinitions": [
      {
        "dnsSearchDomains": null,
        "environmentFiles": null,
        "logConfiguration": {
          "logDriver": "awslogs",
          "secretOptions": null,
          "options": {
            "awslogs-group": "/ecs/hello-world",
            "awslogs-region": "us-west-2",
            "awslogs-stream-prefix": "ecs"
          }
        },
        "entryPoint": null,
        "portMappings": [
          {
            "hostPort": 80,
            "protocol": "tcp",
            "containerPort": 80
          }
        ],
        "command": null,
        "linuxParameters": null,
        "cpu": 0,
        "environment": [],
        "resourceRequirements": null,
        "ulimits": null,
        "dnsServers": null,
        "mountPoints": [],
        "workingDirectory": null,
        "secrets": null,
        "dockerSecurityOptions": null,
        "memory": null,
        "memoryReservation": 128,
        "volumesFrom": [],
        "stopTimeout": null,
        "image": "image_name",
        "startTimeout": null,
        "firelensConfiguration": null,
        "dependsOn": null,
        "disableNetworking": null,
        "interactive": null,
        "healthCheck": null,
        "essential": true,
        "links": null,
        "hostname": null,
        "extraHosts": null,
        "pseudoTerminal": null,
        "user": null,
        "readonlyRootFilesystem": null,
        "dockerLabels": null,
        "systemControls": null,
        "privileged": null,
        "name": "hello-world"
      }
    ],
    "placementConstraints": [],
    "memory": "2048",
    "taskRoleArn": null,
    "compatibilities": [
      "EC2",
      "FARGATE"
    ],
    "taskDefinitionArn": "ARN",
    "family": "hello-world",
    "requiresAttributes": [],
    "pidMode": null,
    "requiresCompatibilities": [
      "FARGATE"
    ],
    "networkMode": "awsvpc",
    "cpu": "1024",
    "revision": 1,
    "status": "ACTIVE",
    "inferenceAccelerators": null,
    "proxyConfiguration": null,
    "volumes": []
  }
  ```
+ Un clúster de Amazon ECS que ejecute un servicio que utilice la definición de tarea mencionada anteriormente. Para obtener más información, consulte [Creación de un clúster](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/clusters.html) y [Creación de un servicio](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-service-console-v2.html) en la *Guía para desarrolladores de Amazon Elastic Container Service*.

Una vez satisfechos estos requisitos previos, puede continuar con el tutorial y crear su canalización de implementación continua.

## Paso 1: Añadir un archivo de especificación de compilación a su repositorio de código fuente
<a name="cd-buildspec"></a>

Este tutorial se utiliza CodeBuild para crear su imagen de Docker y enviarla a Amazon ECR. Añada un archivo `buildspec.yml` al repositorio del código fuente que indique a CodeBuild cómo hacerlo. La siguiente especificación de compilación de ejemplo hace lo siguiente:
+ Etapa previa a la compilación:
  + Inicie sesión en Amazon ECR.
  + Establece el URI del repositorio en la imagen de ECR y añade una etiqueta de imagen con los siete primeros caracteres del ID de confirmación de Git del código fuente.
+ Etapa de compilación:
  + Crea la imagen de Docker y etiqueta la imagen como `latest` y con el ID de confirmación de Git.
+ Etapa posterior a la compilación:
  + Inserta la imagen en el repositorio de ECR con ambas etiquetas.
  + Escribe un archivo denominado `imagedefinitions.json` en la raíz de la compilación con el nombre del contenedor del servicio de Amazon ECS y la imagen y la etiqueta. La etapa de implementación de la canalización de implementación continua utiliza esta información para crear una nueva revisión de la definición de tarea del servicio y, a continuación, actualiza el servicio para usar la nueva definición de tarea. El archivo `imagedefinitions.json` es necesario para el proceso de trabajo de ECS.

Pegue este texto de ejemplo para crear el archivo `buildspec.yml` y sustituya los valores de la imagen y la definición de la tarea. En este texto, se utiliza el ID de cuenta de ejemplo 111122223333.

```
version: 0.2

phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws --version
      - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-west-2.amazonaws.com
      - REPOSITORY_URI=012345678910.dkr.ecr.us-west-2.amazonaws.com/hello-world
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - IMAGE_TAG=${COMMIT_HASH:=latest}
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      - docker build -t $REPOSITORY_URI:latest .
      - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker images...
      - docker push $REPOSITORY_URI:latest
      - docker push $REPOSITORY_URI:$IMAGE_TAG
      - echo Writing image definitions file...
      - printf '[{"name":"hello-world","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json
artifacts:
    files: imagedefinitions.json
```

La especificación de compilación se ha creado para el siguiente ejemplo de definición de tarea proporcionada en [Requisitos previos](#ecs-cd-prereqs), usada por el servicio de Amazon ECS para este tutorial. El valor de `REPOSITORY_URI` se corresponde con el repositorio `image` (sin etiquetas de imagen) y el valor `hello-world` situado cerca del final del archivo se corresponde con el nombre de contenedor de la definición de tarea. 

**Para añadir un archivo `buildspec.yml` a su repositorio de código fuente**

1. Abra un editor de texto y copie y pegue la especificación de compilación anterior en un nuevo archivo.

1. Sustituya el valor de `REPOSITORY_URI` (`012345678910.dkr.ecr.us-west-2.amazonaws.com/hello-world`) por el URI de su repositorio de Amazon ECR (sin etiquetas de imagen) para la imagen de Docker. Sustituya `hello-world` por el nombre de contenedor de la definición de tarea del servicio que hace referencia a la imagen de Docker.

1. Confirme la operación e inserte el archivo `buildspec.yml` en el repositorio de código fuente.

   1. Añada el archivo.

      ```
      git add .
      ```

   1. Valide el cambio con.

      ```
      git commit -m "Adding build specification."
      ```

   1. Envíe la confirmación.

      ```
      git push
      ```

## Paso 2: Crear la canalización de implementación continua
<a name="pipeline-wizard"></a>

Utilice el CodePipeline asistente para crear las etapas de la canalización y conectar el repositorio de origen a su servicio de ECS.

**Para crear la canalización**

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

1. En la página **Welcome**, elija **Create pipeline**. 

   Si es la primera vez que la utiliza CodePipeline, aparecerá una página de introducción en lugar de **Bienvenida**. Seleccione **Get Started Now**.

1. En la página **Paso 1: elección de la opción de creación**, en **Opciones de creación**, seleccione la opción **Crear una canalización personalizada**. Elija **Siguiente**.

1. En el **paso 2: elección de la configuración de la canalización**, en **Nombre de la canalización**, escriba un nombre para su canalización. En este tutorial, el nombre de la canalización es **hello-world**.

1. En **Tipo de canalización**, mantenga la selección predeterminada en **V2**. Los tipos de canalización difieren en características y precio. Para obtener más información, consulte [Tipos de canalización](pipeline-types.md). Elija **Siguiente**.

1. En la página **Paso 3: Añadir la fase de origen**, seleccione **Proveedor de código fuente ** AWS CodeCommit****.

   1. En **Repository name (Nombre del repositorio)**, elija el nombre del repositorio de CodeCommit que desea utilizar como ubicación de origen para la canalización.

   1. En **Branch name (Nombre de ramificación)**, elija la ramificación que desea usar y seleccione **Next (Siguiente)**.

1. En la página **Paso 4: Agregar la etapa de compilación**, en **Proveedor de compilación **AWS CodeBuild****, elija y, a continuación, elija **Crear proyecto**.

   1. En **Project name**, elija un nombre exclusivo para su proyecto de compilación. En este tutorial, el nombre del proyecto es **hello-world**.

   1. En **Environment image (Imagen de entorno)**, elija **Managed image (Imagen administrada)**.

   1. En **Operating system (Sistema operativo)**, elija **Amazon Linux 2**.

   1. En **Runtime(s) (Tiempo de ejecución)**, elija **Standard (Estándar)**.

   1. Para **Imagen**, elija **`aws/codebuild/amazonlinux2-x86_64-standard:3.0`**.

   1. En **Image version (Versión de imagen)** y **Environment type (Tipo de entorno)**, utilice los valores predeterminados.

   1. Seleccione **Enable this flag if you want to build Docker images or want your builds to get elevated privileges (Habilite este indicador si desea compilar imágenes de Docker o que sus compilaciones tengan privilegios elevados)**.

   1. Deseleccione los **CloudWatch registros**. Puede que tengas que expandir **Avanzado**.

   1. Selecciona **Continuar a. CodePipeline**

   1. Elija **Siguiente**.
**nota**  
El asistente crea un rol de CodeBuild servicio para tu proyecto de compilación, denominado **codebuild- *build-project-name* -service-role**. Anote este nombre de rol, ya que le añadirá los permisos de Amazon ECR más adelante.

1. En la página **Paso 5: Añadir fase de despliegue**, para **Proveedor de despliegue**, elija **Amazon ECS**.

   1. En **Nombre del clúster**, elija el clúster de en el que se ejecuta el servicio. En este tutorial, el clúster es **default**.

   1. En **Service name (Nombre de servicio)**, elija el servicio que desea actualizar y seleccione **Next (Siguiente)**. En este tutorial, el nombre del servicio es **hello-world**.

1. En la página **Step 6: Review**, revise la configuración de la canalización y elija **Create pipeline** para crear la canalización.
**nota**  
Ahora que se ha creado la canalización, intenta ejecutarse a través de las diferentes etapas de canalización. Sin embargo, el CodeBuild rol predeterminado creado por el asistente no tiene permisos para ejecutar todos los comandos contenidos en el `buildspec.yml` archivo, por lo que se produce un error en la etapa de compilación. En la siguiente sección se añaden los permisos para la etapa de compilación.

## Paso 3: Añadir permisos de Amazon ECR al rol CodeBuild
<a name="code-build-perms"></a>

El CodePipeline asistente creó un rol de IAM para el proyecto de compilación, denominado CodeBuild **codebuild** - -service-role. *build-project-name* **En este tutorial, el nombre es -role. codebuild-hello-world-service** Dado que el archivo `buildspec.yml` realiza llamadas a operaciones de la API de Amazon ECR, el rol debe tener una política que conceda permisos para realizar estas llamadas a Amazon ECR. El siguiente procedimiento le ayuda a asociar los permisos adecuados al rol.

**Para añadir permisos de Amazon ECR al rol CodeBuild**

1. Abra la consola de IAM en [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. En el panel de navegación izquierdo, elija **Roles**.

1. En el cuadro de búsqueda, escriba **codebuild-** y elija el rol que creó el CodePipeline asistente. En este tutorial, el nombre del rol es **codebuild-hello-world-service-role**.

1. En la página **Summary (Resumen)**, elija **Attach policies (Asociar políticas)**.

1. Selecciona la casilla situada a la izquierda de la EC2 ContainerRegistryPowerUser política de **Amazon** y selecciona **Adjuntar política**.

## Paso 4: Probar la canalización
<a name="commit-change"></a>

Su proceso debe tener todo lo necesario para ejecutar un despliegue AWS continuo end-to-end nativo. Ahora, pruebe su funcionalidad enviando un cambio de código al repositorio de código fuente.

**Para probar la canalización**

1. Realice una modificación del código en el repositorio de código fuente configurado, valide y envíe el cambio.

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

1. Seleccione su canalización de la lista.

1. Vea el progreso en la canalización a través de sus etapas. Su canalización debería completarse y el servicio de Amazon ECS debería ejecutar la imagen de Docker que se creó a partir de la modificación del código.