Desplegar hacia Amazon Elastic Container Service

Puedes hacer despliegues para Amazon Elastic Container Service (ECS) como parte de tus flujos de trabajo de despliegue contínuo (DC).

Nota: Los ejecutores hospedados en GitHub no son compatibles con GitHub Enterprise Server actualmente. Puedes encontrar más información sobre el soporte que se tiene planeado en el futuro en el Itinerario público de GitHub.

Introducción

Esta guía te explica cómo utilizar las GitHub Actions para crear una aplicación contenerizada, subirla al Registro de Contenedores Elásticos de Amazon (ECR) y desplegarla hacia el Servicio de Contenedores Elásticos de Amazon (ECS) cuando haya una subida a la rama main.

En cada subida nueva a main en tu repositorio de GitHub, el flujo de trabajo de las GitHub Actions creará y subirá una imagen de contenedor nueva hacia el ECR de Amazon y luego desplegará una definición de tarea nueva hacia el ECS de Amazon.

Prerrequisitos

Antes de que crees tu flujo de trabajo de GitHub Actions, primero necesitas completar los siguientes pasos de configuración para Amazon ECR y ECS:

  1. Crea un repositorio de Amazon ECR para almacenar tus imágenes.

    Por ejemplo, utiliza el CLI de AWS:

    Shell
    aws ecr create-repository \ --repository-name MY_ECR_REPOSITORY \ --region MY_AWS_REGION

    Asegúrate de que utilizas el mismo nombre de repositorio para amazon ECR (que se representa aquí como MY_ECR_REPOSITORY) para la variable ECR_REPOSITORY en el flujo de trabajo a continuación.

    Asegúrate de que utilizas el mismo valor de región de AWS para la variable AWS_REGION (que se representa aquí como MY_AWS_REGION) en el flujo de trabajo a continuación.

  2. Crea un servicio, agrupamiento y definición de tarea de Amazon ECS.

    Para obtener más detalles, sigue la sección Asistente de inicio para la consola de Amazon ECS, o la Guía de inicio en la documentación de Amazon ECS.

    Asegúrate de anotar los nombres que configuraste para el servicio y agrupamiento de Amazon ECS y utilízalos para las variables ECS_SERVICE y ECS_CLUSTER en el flujo de trabajo a continuación.

  3. Almacena tu definición de tarea de Amazon ECS como un archivo JSON en tu repositorio de GitHub.

    El formato del archivo debe ser el mismo que la salida que genera:

    Shell
    aws ecs register-task-definition --generate-cli-skeleton

    Asegúrate de configurar la variable ECS_TASK_DEFINITION en el flujo de trabajo a continuación como la ruta al archivo JSON.

    Asegúrate de configurar la variable CONTAINER_NAME en el flujo de trabajo a continuación como el nombre de contenedor en la sección containerDefinitions de la definición de tarea.

  4. Crea los secretos de GitHub Actions con los nombres AWS_ACCESS_KEY_ID y AWS_SECRET_ACCESS_KEY para almacenar los valores de tu llave de acceso de Amazon IAM.

    Para obtener más información sobre cómo crear los secretos para GitHub Actions, consulta la sección "Secretos cifrados".

    Consulta la documentación para cada acción que se utiliza a continuación para las políticas recomendadas de IAM para el usuario de IAM y los métodos para manejar las credenciales de las llaves de acceso.

  5. Optionally, configure a deployment environment. Los ambientes se utilizan para describir un objetivo de despliegue general como production, staging o development. Cuando se despliega un flujo de trabajo de GitHub Actions en un ambiente, dicho ambiente se desplegará en la página principal del repositorio. Puedes utilizar ambientes para que requieran la aprobación para que un job proceda, restringir qué ramas pueden activar un flujo de trabajo o limitar el acceso a los secretos. Para obtener más información sobre cómo crear ambientes, consulta la sección "Utilizar ambientes para despliegue".

Creating the workflow

Once you've completed the prerequisites, you can proceed with creating the workflow.

El siguiente flujo de trabajo de ejemplo demuestra cómo construir una imagen de contenedor y subirla a Amazon ECR. Posteriormente, ésta actualiza la definición de la tarea con una ID de imagen nueva y despliega la definición de tarea a Amazon ECS.

Asegúrate de que proporcionas tus propios valores para todas las variables en la clave env del flujo de trabajo.

Si configuras un ambiente de despliegue, cambia el valor de environment para que sea el nombre de tu ambiente. Si no configuraste un ambiente, borra la clave environment.

YAML
# This workflow uses actions that are not certified by GitHub.
# Estas las proporcionan entidades terceras y las gobiernan
# condiciones de servicio, políticas de privacidad y documentación de soporte
# documentación.

name: Deploy to Amazon ECS

on:
  push:
    branches:
      - main

env:
  AWS_REGION: MY_AWS_REGION                   # set this to your preferred AWS region, e.g. us-west-1
  ECR_REPOSITORY: MY_ECR_REPOSITORY           # set this to your Amazon ECR repository name
  ECS_SERVICE: MY_ECS_SERVICE                 # set this to your Amazon ECS service name
  ECS_CLUSTER: MY_ECS_CLUSTER                 # set this to your Amazon ECS cluster name
  ECS_TASK_DEFINITION: MY_ECS_TASK_DEFINITION # set this to the path to your Amazon ECS task definition
                                               # file, e.g. .aws/task-definition.json
  CONTAINER_NAME: MY_CONTAINER_NAME           # set this to the name of the container in the
                                               # containerDefinitions section of your task definition

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    environment: production

    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@13d241b293754004c80624b5567555c4a39ffbe3
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ env.AWS_REGION }}

      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@aaf69d68aa3fb14c1d5a6be9ac61fe15b48453a2

      - name: Build, tag, and push image to Amazon ECR
        id: build-image
        env:
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          IMAGE_TAG: ${{ github.sha }}
        run: |
          # Build a docker container and
          # push it to ECR so that it can
          # be deployed to ECS.
          docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
          echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG"

      - name: Fill in the new image ID in the Amazon ECS task definition
        id: task-def
        uses: aws-actions/amazon-ecs-render-task-definition@97587c9d45a4930bf0e3da8dd2feb2a463cf4a3a
        with:
          task-definition: ${{ env.ECS_TASK_DEFINITION }}
          container-name: ${{ env.CONTAINER_NAME }}
          image: ${{ steps.build-image.outputs.image }}

      - name: Deploy Amazon ECS task definition
        uses: aws-actions/amazon-ecs-deploy-task-definition@de0132cf8cdedb79975c6d42b77eb7ea193cf28e
        with:
          task-definition: ${{ steps.task-def.outputs.task-definition }}
          service: ${{ env.ECS_SERVICE }}
          cluster: ${{ env.ECS_CLUSTER }}
          wait-for-service-stability: true

Recursos adicionales

Para encontrar el flujo de trabajo inicial original, consulta el archivo aws.yml en el repositorio starter-workflows de GitHub Actions.

Para obtener más información sobre los servicios que se utilizan en estos ejemplos, consulta la siguiente documentación:

¿Te ayudó este documento?

Política de privacidad

¡Ayúdanos a hacer geniales estos documentos!

Todos los documentos de GitHub son de código abierto. ¿Notas algo que esté mal o que no sea claro? Emite una solicitud de cambios.

Haz una contribución

O, aprende cómo contribuir.