Como publicar una imagen de docker en ECR desde un pipeline de Gitlab-CI
|Si estamos trabajando en algún pipeline de Gitlab-CI y `por alguna razón necesitamos publicar la imagen construida en el servicio que ofrece AWS para el almacenamiento de imágenes de Docker: Amazon Elastic Container Registry (ECR) lo podemos de hacer de manera sencilla haciendo el push como cualquier otro registry, sin embargo la única diferencia con otros registries es que para autenticarse AWS ofrece un token que caduca cada 12 horas, esto hace que varíe un poco el proceso de pusheo de la imagen con respecto a los otros registries porque siempre deberemos pedir el token antes de hacer el push, a diferencia de los demas servicios que solo bastaba con crear un token, asignarlo a una variable y hacer el docker login respectivo.
¿Que es ECR?
Amazon Elastic Container Registry (ECR), es el servicio de AWS que nos permite almacenar y administrar nuestras imágenes de docker, funciona como un registry común del mercado aunque como todo tiene sus ventajas y desventajas. Una definición dada por el propio AWS:
«Amazon Elastic Container Registry (Amazon ECR) es un servicio de registro de imágenes de contenedor administrado por AWS que es seguro, escalable y fiable. Amazon ECR admite repositorios privados con permisos basados en recursos mediante AWS IAM. De este modo, los usuarios especificados o las instancias de Amazon EC2 pueden acceder a sus repositorios e imágenes de contenedor. Puede utilizar la CLI preferida para insertar, extraer y administrar imágenes de Docker, imágenes de Open Container Initiative (OCI) y artefactos compatibles con OCI.»
Algunas características de ECR:
- Gestión de usuarios y permisos basados en recursos mediante IAM
- Escaneo de seguridad de las imágenes
- Políticas de limpieza.
El proceso no es muy muy complejo, lo que si se debe tener en cuenta es que para poder hacerlo se requieren los siguientes datos:
- Dirección del repositorio en ECR (obviamente ya debe estar creado)
- AWS_ACCESS_KEY_ID y AWS_SECRET_ACCESS_KEY de un usuario que tenga la política AmazonEC2ContainerRegistryPowerUser
Una vez teniendo estos datos se deben agregar las variables en la configuración del repositorio de Gitlab, en la sección: CONFIGURE -> CI/CD -> VARIABLES
Teniendo todo listo, vamos a la práctica, lo único que queda es escribir el stage en el archivo .gitlab-ci.yml:
variables: DOCKER_REGISTRY: XXXXXXXX.dkr.ecr.us-east-1.amazonaws.com AWS_DEFAULT_REGION: us-east-1 APP: APP DOCKER_HOST: tcp://docker:2375 publish: image: name: amazon/aws-cli entrypoint: [""] services: - docker:dind before_script: - amazon-linux-extras install docker - aws --version - docker --version script: - docker build -t $DOCKER_REGISTRY/$APP:$CI_PIPELINE_IID . - aws ecr get-login-password | docker login --username AWS --password-stdin $DOCKER_REGISTRY - docker push $DOCKER_REGISTRY/$APP:$CI_PIPELINE_IID
En resumen, el Pipeline realiza los siguientes pasos:
- Realiza la construcción de la imagen invocando el docker build, en este paso se podría modificar de acuerdo a las necesidades.
- Con el binario de aws-cli y usando las credenciales que configuramos en las variables de entorno se solicita un token y se hace el respectivo docker login.
- Por último se pushea la imagen a ECR.
Ya teniendo las imágenes en nuestro repositorio de ECR, se pueden configurar escaneos de seguridad automaticos de las imagenes asi como tambien politicas de limpieza de las imagenes que vayan quedando obsoletas.