Cómo crear nuestros workflows en base a eventos con Github Actions

serverless-aws-github-actions

La filosofía DevOps, por fortuna cada vez más común, utiliza herramientas para acelerar y automatizar la entrega de software, a través de las cuales los equipos de desarrollo y operaciones colaboran para crear, probar y desplegar aplicaciones con calidad y seguridad.

Las aplicaciones de DevOps en los productos de software normalmente se basan en un conjunto integrado de soluciones o ToolChain para eliminar pasos manuales, reducir errores y escalar con mayor facilidad, logrando así reducir el time to market y mejorar la calidad de los entregables.

Consciente de ello, Github presentó a finales de 2018 Github Actions, su herramienta de CI/CD. Con Github Actions podemos crear nuestros workflows en base a eventos de Github/git como “push”, “release”, “pull request”, etc.

En el siguiente diagrama se muestran los principales componentes de Github Actions.

 

 

Sobre los “Runners”

Github disponibiliza algunos “Runners” ya preparador para consumir en la nube:

  • Ya configurados
  • Sin mantenimiento
  • Para varios S.O. disponibles, Windows, macOS, Linux y contenedores docker.
  • Pago por uso (en función del plan).
  • Puede no ser útil si tu configuración es muy específica.

Para evitar estos últimos puntos Github nos ofrece los “Self-Hosted Runners”:

  • Podemos tenerlos en nuestra red y acceder a recursos propios.
  • Configuración a medida
  • No hay pago por uso.
  • Hay que montar infraestructura propia y mantenerlo.

Automatizar con Github Actions el despliegue de recursos en AWS

El objetivo del caso de uso es conocer el funcionamiento de un workflow de Github Actions, y además utilizar algunas de las actions destinadas a interactuar con AWS. En este caso simplemente vamos a desplegar un bucket de S3 en una cuenta determinada.

Para ello vamos a seguir los siguientes pasos:

1. Creamos en Github un repositorio con un template de Cloudformation para la creación de un bucket en S3

2. Consultar “Actions” para AWS.

Como se ha comentado anteriormente las “actions” las podemos construir nosotros mismos, pero para procedimientos habituales suelen estar construidas por terceros, para este caso nos interesan las creadas por AWS.

En el siguiente enlace tenemos todo el listado de acciones disponibles: 

https://github.com/aws-actions

Para nuestro ejemplo vamos a utilizar las siguientes acciones ya desarrolladas por Github y AWS:

  • actions/checkout@v2

https://github.com/actions/checkout

Esta acción nos permite hacer checks-out bajo nuestro repositorio y que el workflow pueda acceder al él.

  • aws-actions/configure-aws-credentials@v1

https://github.com/aws-actions/configure-aws-credentials

Nos permite establecer las credenciales de un usuario IAM (o asumir un rol) para poder realizar llamadas a la API de AWS.

  • aws-actions/aws-cloudformation-github-deploy@master

https://github.com/aws-actions/aws-cloudformation-github-deploy

Esta acción recibe como argumento un nombre de stack de CloudFormation y el  fichero con el template, y se encargará de crear el stack si existe o crear un “change set” si no existe. En la documentación de la acción podemos observar ejemplos de uso, y ejemplo de uso dentro de un workflow, también nos indica que debemos disponer de un usuario IAM para poder realizar el despliegue de la infraestructura en AWS, junto con las “policies” necesarias.

3. En AWS, creamos usuario IAM y policies asociadas tal y como nos indica la documentación

Creamos usuario IAM con la policy indicada en la documentación de la acción. Descargamos las credenciales generadas para ese usuario.

 

Añadimos las siguientes policies al usuario:

  • Permisos sobre CloudFormation

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cloudformation:*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Deny",
            "Action": [
                "cloudformation:DeleteStack"
            ],
            "Resource": "*"
        }
    ]
}
  • Permisos creación de Buckets

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:CreateBucket",
                "s3:PutBucketPublicAccessBlock"
            ],
            "Resource": "*"
        }
    ]
}
4. En Github, a nivel de repositorio creamos los secretos con la “access key” y “secret key” asociadas al usuarios creado, y restringidas a los permisos dados por las políticas anteriormente explicadas.

 

5. Añadimos en el repositorio que hemos creado el archivo con el workflow que automatiza el despliegue de recursos en AWS

Los workflows se deben añadir siempre como ficheros yaml en la siguiente ruta: “.github/workflows”.

El workflow tiene la ventaja de ser un componente más de nuestro repositorio, con lo cual quedará registrado en git con sus cambios y evolución.

A continuación el workflow que vamos a utilizar:


on:
  push:
    branches:
      - master
  pull_request:
    branches:
      - master

name: Deploy to AWS

jobs:
  deploy:
    name: Github Actions Deploy
    runs-on: ubuntu-latest

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

    - name: Configure AWS credentials
      id: creds
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: eu-west-1

    - name: Deploy S3 Bucket
      id: s3-bucket
      uses: aws-actions/aws-cloudformation-github-deploy@v1
      with:
        name: s3-bucket-stack
        template: iac/template.yml
        no-fail-on-empty-changeset: "1"
        capabilities: CAPABILITY_IAM,CAPABILITY_AUTO_EXPAND

En el apartado “on:” se indica qué evento de Github va a disparar la ejecución del workflow, para este caso, cuando se haga “pull” o “pull request” sobre la rama master.

A continuación se indica el nombre del workflow y del job, también en ese lugar se hace referencia al tipo de Runner sobre el que se ejecutará el workflow, en este caso “ubuntu-latest”.

En el apartado “steps”, es el lugar donde se añadirán las acciones secuencialmente, en este caso las que hemos definido anteriormente.

6. Visualización de workflows en Github Actions

En la pestaña “Actions” podemos visualizar todos los workflows ejecutados y sus correspondientes “jobs”:

Si vamos al detalle del “job”, se mostrará la ejecución de ese job y sus steps, indicando el resultado del “step” y la información que pueda sacar por consola.

Como se puede observar en la imagen, todos los pasos se han ejecutado correctamente, con lo cual el despliegue del bucket de S3 en AWS se ha realizado correctamente.

Alternativas a Github Actions

El mercado de herramientas CI/CD es muy amplio, quizá el que más destaca es Jenkins debido a su gran comunidad y maduración en el mercado. Pero últimamente están ganando terreno servicios SaaS que ofrecen también ventajas como una infraestructura gestionada, y gran integración con los servicios que las ofrecen.

A continuación un listado de soluciones de CI/CD equivalentes a Github Actions:

Material Para profundizar en Github Actions

Finalmente algunos enlaces de interés para adentrarse en este mundillo:

  • Repositorio con enlaces a documentación, Actions, recursos de la comunidad, utilidades, ejemplos, etc.

https://github.com/sdras/awesome-actions

  • Github Actions

https://github.com/actions

  • AWS for Github Actions

https://github.com/aws-actions

  • Documentación oficial

https://docs.github.com/en/actions

  • Repositorio usado para el ejemplo

https://github.com/cantalejo84/github-actions-aws-deployer

Cloud Engineer en Keepler Data Tech: "Apasionado de la Ingeniería de Datos y Arquitecturas Cloud. En continuo aprendizaje de nuevas tecnologías que nos ayuden a construir software de forma mas rápida, eficiente y segura. Mis últimos trabajos está relacionados con el desarrollo de Datalakes y su ecosistema sobre Arquitecturas Serverless."

Port Relacionados

¿Qué opinas?

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.