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:
-
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 variableECR_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í comoMY_AWS_REGION
) en el flujo de trabajo a continuación. -
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
yECS_CLUSTER
en el flujo de trabajo a continuación. -
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óncontainerDefinitions
de la definición de tarea. -
Crea los secretos de GitHub Actions con los nombres
AWS_ACCESS_KEY_ID
yAWS_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.
-
Optionally, configure a deployment environment. Los ambientes se utilizan para describir un objetivo de despliegue general como
production
,staging
odevelopment
. 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
.
# 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:
- "Mejores prácticas de seguridad de IAM" en la documentación de AWS.
- Acción oficial de "Configurar las credenciales de AWS" de AWS.
- Acción oficial de "Inicio de sesión" de Amazon ECR de AWS.
- Acción oficial de "Definición de tarea de renderización" de Amazon ECSde AWS.
- Acción oficial de "Desplegar definición de tarea" de Amazon ECS de AWS.