Skip to main content

Desplegar en Amazon Elastic Container Service

Aprende a implementar un proyecto en Amazon Elastic Container Service (ECS) como parte de un flujo de trabajo de implementación continua (CD).

Requisitos previos

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, mediante la CLI de AWS:

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

    Asegúrate de usar el mismo nombre de repositorio de Amazon ECR (representado aquí por MY_ECR_REPOSITORY) para la variable ECR_REPOSITORY en el flujo de trabajo siguiente.

    Asegúrate de usar el mismo valor de región de AWS para la variable AWS_REGION (representada aquí por MY_AWS_REGION) en el flujo de trabajo siguiente.

  2. Crea una definición de tarea, un clúster y un servicio de Amazon ECS.

    Para obtener más información, sigue el Asistente para introducción en la consola de Amazon ECS o la Guía de introducción en la documentación de Amazon ECS.

    Asegúrate de anotar los nombres que establezcas para el servicio y el clúster de Amazon ECS, y úsalos para las variables ECS_SERVICE y ECS_CLUSTER en el flujo de trabajo siguiente.

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

    El formato del archivo debe ser el mismo que el resultado generado por lo siguiente:

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

    Asegúrate de establecer la variable ECS_TASK_DEFINITION en el flujo de trabajo siguiente como la ruta de acceso al archivo JSON.

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

  4. Crea secretos de GitHub Actions llamados AWS_ACCESS_KEY_ID y AWS_SECRET_ACCESS_KEY para almacenar los valores de la clave de acceso de Amazon IAM.

    Para más información sobre cómo crear secretos para GitHub Actions, consulta Uso de secretos en Acciones de GitHub.

    Consulta la documentación de cada acción que se usa a continuación para conocer las directivas de IAM recomendadas para el usuario de IAM y los métodos para controlar las credenciales de clave de acceso.

  5. Opcionalmente, configure un entorno de implementación. Los entornos se usan para describir un destino de implementación 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 usar entornos para requerir aprobación para que un trabajo continúe, restringir qué ramas pueden desencadenar un flujo de trabajo, controlar las implementaciones con reglas de protección de implementación personalizadas o limitar el acceso a los secretos. Para más información sobre la creación de entornos, consulta Administrar entornos para la implementación.

Crear un flujo de trabajo

Una vez que hayas completado los prerequisitos, puedes proceder con la creación del flujo de trabajo.

El siguiente flujo de trabajo demuestra cómo crear una imagen de contenedor y cómo subirla a Amazon ECR. A continuación, actualiza la definición de tarea con el nuevo identificador de imagen e implementa la definición de tarea en Amazon ECS.

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

Si ha configurado un entorno de implementación, cambie el valor de environment por el nombre del entorno. Si no ha configurado un entorno, borre la clave environment.

YAML
# Este flujo de trabajo usa acciones que no GitHub no certifica.
# Estas las proporcionan entidades terceras y las gobiernan
# condiciones de servicio, políticas de privacidad y documentación de soporte
# en línea.

# GitHub recomienda anclar acciones a un SHA de confirmación.
# Para obtener una versión más reciente, debes actualizar el SHA.
# También puedes hacer referencia a una etiqueta o rama, pero la acción puede cambiar sin ninguna advertencia.

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@v5

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@0e613a0980cbf65ed5b322eb7a1e075d28913a83
        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@62f4f872db3836360b72999f4b87f1ff13310f3a

      - 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 "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT

      - name: Fill in the new image ID in the Amazon ECS task definition
        id: task-def
        uses: aws-actions/amazon-ecs-render-task-definition@c804dfbdd57f713b6c079302a4c01db7017a36fc
        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@df9643053eda01f169e64a0e60233aacca83799a
        with:
          task-definition: ${{ steps.task-def.outputs.task-definition }}
          service: ${{ env.ECS_SERVICE }}
          cluster: ${{ env.ECS_CLUSTER }}
          wait-for-service-stability: true

Información adicional

Para obtener la plantilla de flujo de trabajo original, vea 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: