Replicar imágenes filtradas de contenedores de Amazon ECR en todas las cuentas o regiones - Recomendaciones de AWS

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Replicar imágenes filtradas de contenedores de Amazon ECR en todas las cuentas o regiones

Creado por Abdal Garuba (AWS)

Entorno: producción

Tecnologías: contenedores y microservicios; DevOps

Servicios de AWS: Amazon EC2 Container Registry; Amazon; CloudWatch AWS CodeBuild; AWS Identity and Access Management; AWS CLI

Resumen

Amazon Elastic Container Registry (Amazon ECR) puede replicar todas las imágenes de contenedores de un repositorio de imágenes en las regiones de Amazon Web Services (AWS) y en las cuentas de AWS de forma nativa, mediante las características de replicación cross-Region (entre regiones) y cross-account (entre cuentas). (Para obtener más información, consulte la publicación del blog de AWS Cross region replication in Amazon ECR has landed [La replicación entre regiones en Amazon ECR ya está aquí]). Sin embargo, no hay forma de filtrar bajo ningún criterio las imágenes que se copian en las cuentas o Regiones de AWS. 

Este patrón describe cómo replicar las imágenes de contenedores almacenadas en Amazon ECR en todas las cuentas y regiones de AWS, en función de los patrones de etiquetas de imagen. El patrón utiliza Amazon CloudWatch Events para detectar eventos push en las imágenes que tienen una etiqueta personalizada predefinida. Un evento push inicia un CodeBuild proyecto de AWS y le pasa los detalles de la imagen. El CodeBuild proyecto copia las imágenes del registro Amazon ECR de origen al registro de destino en función de los detalles proporcionados.

Este patrón copia las imágenes que tienen etiquetas específicas en todas las cuentas. Así, por ejemplo, puede usar este patrón para copiar solo imágenes seguras y listas para producción en la cuenta de AWS de producción. En la cuenta de desarrollo, una vez probadas exhaustivamente las imágenes, puede añadir una etiqueta predefinida a las imágenes seguras y seguir los pasos de este patrón para copiar las imágenes marcadas en la cuenta de producción.

Requisitos previos y limitaciones

Requisitos previos 

  • Una cuenta de AWS activa para los registros de Amazon ECR de origen y destino

  • Permisos administrativos para las herramientas utilizadas en este patrón

  • Docker instalado en su equipo local para realizar pruebas

  • Interfaz de la línea de comandos de AWS (AWS CLI), para autenticarse en Amazon ECR

Limitaciones

  • Este patrón observa los eventos push del registro de origen en una sola región de AWS. Puede implementar este patrón en otras regiones para observar los registros de esas regiones.

  • En este patrón, una regla de Amazon CloudWatch Events escucha un patrón de etiqueta de imagen único. Si desea comprobar si hay varios patrones, puede añadir eventos para detectar otros patrones de etiquetas de imagen.

Arquitectura

Arquitectura de destino

Arquitectura para replicar imágenes de contenedores de Amazon ECR filtradas en todas las cuentas y regiones.

Automatizar y escalar

Este patrón se puede automatizar con un script de infraestructura como código (IaC) y se puede implementar a gran escala. Para usar las CloudFormation plantillas de AWS para implementar este patrón, descargue el adjunto y siga las instrucciones de la sección Información adicional.

Puede apuntar varios CloudWatch eventos de Amazon Events (con diferentes patrones de eventos personalizados) al mismo CodeBuild proyecto de AWS para replicar varios patrones de etiquetas de imagen, pero tendrá que actualizar la validación secundaria del buildspec.yaml archivo (que se incluye en el archivo adjunto y en la sección Herramientas) de la siguiente manera para admitir varios patrones.

... if [[ ${IMAGE_TAG} != release-* ]]; then ...

Herramientas

Servicios de Amazon

  • IAM: AWS Identity and Access Management (IAM) es un servicio web que ayuda a controlar de forma segura el acceso a los recursos de AWS. En este patrón, tendría que crear la función de IAM multicuenta que AWS CodeBuild asumirá al enviar las imágenes de los contenedores al registro de destino.

  • Amazon ECR: Amazon Elastic Container Registry (Amazon ECR) es un registro de contenedores totalmente administrado que facilita almacenar, administrar, compartir e implementar imágenes y artefactos de contenedores en cualquier lugar. Las acciones de inserción de imágenes en el registro de origen envían los detalles de los eventos del sistema al bus de eventos que recoge Amazon CloudWatch Events.

  • AWS CodeBuild: AWS CodeBuild es un servicio de integración continua totalmente gestionado que proporciona potencia informática para realizar tareas como la compilación del código fuente, la ejecución de pruebas y la producción de artefactos listos para su implementación. Este patrón utiliza AWS CodeBuild para realizar la acción de copia del registro Amazon ECR de origen al registro de destino.

  • CloudWatch Eventos: Amazon CloudWatch Events ofrece una secuencia de eventos del sistema que describen los cambios en los recursos de AWS. Este patrón utiliza reglas para hacer coincidir las acciones push de Amazon ECR con un patrón de etiqueta de imagen específico.

Herramientas

  • Docker CLI: Docker es una herramienta que facilita la creación y administración de contenedores. Los contenedores empaquetan una aplicación y todas sus dependencias en una sola unidad o paquete que se puede implementar fácilmente en cualquier plataforma que admita el tiempo de ejecución del contenedor.

Código

Se puede implementar este patrón de dos maneras:

  • Configuración automatizada: Implemente las dos CloudFormation plantillas de AWS que se proporcionan en el archivo adjunto. Para obtener instrucciones, consulte la sección Información adicional.

  • Configuración manual: Siga los pasos de la sección Epics

Ejemplo de buildspec.yaml

Si utiliza las CloudFormation plantillas que se proporcionan con este patrón, el buildspec.yaml archivo se incluye en los CodeBuild recursos.

version: 0.2 env: shell: bash phases: install: commands: - export CURRENT_ACCOUNT=$(echo ${CODEBUILD_BUILD_ARN} | cut -d':' -f5) - export CURRENT_ECR_REGISTRY=${CURRENT_ACCOUNT}.dkr.ecr.${AWS_REGION}.amazonaws.com - export DESTINATION_ECR_REGISTRY=${DESTINATION_ACCOUNT}.dkr.ecr.${DESTINATION_REGION}.amazonaws.com pre_build: on-failure: ABORT commands: - echo "Validating Image Tag ${IMAGE_TAG}" - | if [[ ${IMAGE_TAG} != release-* ]]; then aws codebuild stop-build --id ${CODEBUILD_BUILD_ID} sleep 60 exit 1 fi - aws ecr get-login-password --region ${AWS_REGION} | docker login -u AWS --password-stdin ${CURRENT_ECR_REGISTRY} - docker pull ${CURRENT_ECR_REGISTRY}/${REPO_NAME}:${IMAGE_TAG} build: commands: - echo "Assume cross-account role" - CREDENTIALS=$(aws sts assume-role --role-arn ${CROSS_ACCOUNT_ROLE_ARN} --role-session-name Rolesession) - export AWS_DEFAULT_REGION=${DESTINATON_REGION} - export AWS_ACCESS_KEY_ID=$(echo ${CREDENTIALS} | jq -r '.Credentials.AccessKeyId') - export AWS_SECRET_ACCESS_KEY=$(echo ${CREDENTIALS} | jq -r '.Credentials.SecretAccessKey') - export AWS_SESSION_TOKEN=$(echo ${CREDENTIALS} | jq -r '.Credentials.SessionToken') - echo "Logging into cross-account registry" - aws ecr get-login-password --region ${DESTINATION_REGION} | docker login -u AWS --password-stdin ${DESTINATION_ECR_REGISTRY} - echo "Check if Destination Repository exists, else create" - | aws ecr describe-repositories --repository-names ${REPO_NAME} --region ${DESTINATION_REGION} \ || aws ecr create-repository --repository-name ${REPO_NAME} --region ${DESTINATION_REGION} - echo "retag image and push to destination" - docker tag ${CURRENT_ECR_REGISTRY}/${REPO_NAME}:${IMAGE_TAG} ${DESTINATION_ECR_REGISTRY}/${REPO_NAME}:${IMAGE_TAG} - docker push ${DESTINATION_ECR_REGISTRY}/${REPO_NAME}:${IMAGE_TAG}

Epics

TareaDescripciónHabilidades requeridas

Crea un rol de CloudWatch eventos.

En la cuenta de AWS de origen, cree un rol de IAM para que lo asuma Amazon CloudWatch Events. El rol debe tener permisos para iniciar un CodeBuild proyecto de AWS.

Para crear el rol mediante la AWS CLI, siga las instrucciones de la documentación de IAM.

Ejemplo de política de confianza (trustpolicy.json): 

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": {"Service": "events.amazonaws.com"}, "Action": "sts:AssumeRole" } }

Ejemplo de política de permisos (permissionpolicy.json):

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "codebuild:StartBuild", "Resource": "<CodeBuild Project ARN>" } }
Administrador de AWS DevOps, administrador de sistemas de AWS, administrador de nube, arquitecto de nube, DevOps ingeniero

Cree un CodeBuild rol.

Cree una función de IAM para CodeBuild que AWS la asuma siguiendo las instrucciones de la documentación de IAM. El rol debe tener los siguientes permisos:

  • Permiso para asumir el rol de multicuenta de destino

  • Permiso para crear grupos de registros y flujos de registros, y para enviar eventos de registro

  • Permisos de solo lectura para todos los repositorios de Amazon ECR, mediante la adición de la política gestionada de AmazonEC2 ContainerRegistryReadOnly al rol

  • Permiso para detener CodeBuild

Ejemplo de política de confianza (trustpolicy.json):

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "codebuild.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

Ejemplo de política de permisos (permissionpolicy.json):

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "codebuild:StartBuild", "codebuild:StopBuild", "codebuild:Get*", "codebuild:List*", "codebuild:BatchGet*" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "*", "Effect": "Allow" }, { "Action": "sts:AssumeRole", "Resource": "<ARN of destination role>", "Effect": "Allow", "Sid": "AssumeCrossAccountArn" } ] }

Adjunte la política administrada AmazonEC2ContainerRegistryReadOnly al comando de CLI de la siguiente manera:

~$ aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly \ --role-name <name of CodeBuild Role>
Administrador de AWS DevOps, administrador de sistemas de AWS, administrador de nube, arquitecto de nube, DevOps ingeniero

Cree un rol multicuenta.

En la cuenta de AWS de destino, cree una función de IAM para la CodeBuild función de AWS que asuma la cuenta de origen. El rol multicuenta debería permitir a las imágenes de contenedores crear un nuevo repositorio y cargar imágenes de contenedores a Amazon ECR.

Para crear el rol de IAM mediante la AWS CLI, siga las instrucciones de la documentación de IAM

Para permitir el CodeBuild proyecto de AWS del paso anterior, utilice la siguiente política de confianza:

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": { "AWS": "<ARN of source codebuild role>" }, "Action": "sts:AssumeRole" } }

Para permitir que el CodeBuild proyecto de AWS del paso anterior guarde imágenes en el registro de destino, utilice la siguiente política de permisos:

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "ecr:GetDownloadUrlForLayer", "ecr:BatchCheckLayerAvailability", "ecr:PutImage", "ecr:InitiateLayerUpload", "ecr:UploadLayerPart", "ecr:CompleteLayerUpload", "ecr:GetRepositoryPolicy", "ecr:DescribeRepositories", "ecr:GetAuthorizationToken", "ecr:CreateRepository" ], "Resource": "*", "Effect": "Allow" } ] }
Administrador de AWS, administrador de la nube DevOps, arquitecto de la nube, DevOps ingeniero, administrador de sistemas de AWS
TareaDescripciónHabilidades requeridas

Crea un CodeBuild proyecto.

Cree un CodeBuild proyecto de AWS en la cuenta de origen siguiendo las instrucciones de la CodeBuild documentación de AWS. El proyecto debe estar en la misma región que el registro de origen. 

Configure el proyecto de la siguiente manera:

  • Tipo de entorno: LINUX CONTAINER

  • Rol de servicio: CodeBuild Role

  • Modo privilegiado: true

  • Imagen del entorno: aws/codebuild/standard:x.x (utilice la última imagen disponible)

  • Variables de entorno:

    • CROSS_ACCOUNT_ROLE_ARN: el nombre de recurso de Amazon (ARN) del rol multicuenta

    • DESTINATION_REGION: el nombre de la región multicuenta

    • DESTINATION_ACCOUNT: el número de la cuenta de destino

  • Especificaciones de construcción: utilice el archivo buildspec.yaml que aparece en la sección Herramientas.

Administrador de AWS DevOps, administrador de sistemas de AWS, administrador de nube, arquitecto de nube, DevOps ingeniero
TareaDescripciónHabilidades requeridas

Cree una regla de eventos.

Como el patrón usa la función de filtrado de contenido, debes crear el evento con Amazon EventBridge. Crea el evento y el destino siguiendo las instrucciones de la EventBridge documentación, con algunas modificaciones:

  • En Define pattern (Definir patrón), seleccione Event pattern (Patrón de eventos) y, a continuación, Custom pattern (Patrón personalizado).

  • Copie el siguiente código de ejemplo de patrón de eventos personalizados en el cuadro de texto proporcionado:

    {   "source": ["aws.ecr"],   "detail-type": ["ECR Image Action"],   "detail": {     "action-type": ["PUSH"],     "result": ["SUCCESS"],     "image-tag": [{ "prefix": "release-"}]   } }
  • En Select targets, elige el CodeBuild proyecto de AWS y pega el ARN del CodeBuild proyecto de AWS que creaste en la epopeya anterior.

  • En Configure input (Configurar entrada), seleccione Input Transformer (Transformador de entrada).

    • En el cuadro de texto Input Path (Ruta de entrada), pegue:

      {"IMAGE_TAG":"$.detail.image-tag","REPO_NAME":"$.detail.repository-name"}
    • En el cuadro de texto Input Template (Plantilla de entrada), pegue:

      {"environmentVariablesOverride": [ {"name": "IMAGE_TAG", "value":<IMAGE_TAG>},{"name":"REPO_NAME","value":<REPO_NAME>}]}
  • Elija Usar el rol existente y elija el nombre del rol de CloudWatch Eventos que creó anteriormente en la epopeya Crear roles de IAM.

Administrador de AWS DevOps, administrador de sistemas de AWS, administrador de nube, arquitecto de nube, DevOps ingeniero
TareaDescripciónHabilidades requeridas

Autenticación con Amazon ECR.

Realice la autenticación en los registros de origen y destino siguiendo los pasos de la documentación de Amazon ECR.

Administrador de AWS DevOps, administrador de sistemas de AWS, administrador de nube, DevOps ingeniero, arquitecto de nube

Pruebe la replicación de imágenes.

En su cuenta de origen, envíe una imagen de contenedor a un repositorio de origen de Amazon ECR nuevo o existente con una etiqueta de imagen con el prefijo release-. Para enviar la imagen, siga los pasos de la documentación de Amazon ECR

Puede supervisar el progreso del CodeBuild proyecto en la CodeBuild consola

Cuando el CodeBuild proyecto se haya completado correctamente, inicie sesión en la cuenta de AWS de destino, abra la consola Amazon ECR y confirme que la imagen existe en el registro de Amazon ECR de destino.

Administrador de AWS DevOps, administrador de sistemas de AWS, administrador de nube, arquitecto de nube, DevOps ingeniero

Pruebe la exclusión de imágenes.

En su cuenta de origen, envíe una imagen de contenedor a un repositorio de origen de Amazon ECR nuevo o existente con una etiqueta de imagen que no tenga el prefijo personalizado. 

Confirme que el CodeBuild proyecto no se haya iniciado y que no aparezca ninguna imagen de contenedor en el registro de destino.

Administrador de AWS DevOps, administrador de sistemas de AWS, administrador de nube, arquitecto de nube, DevOps ingeniero

Recursos relacionados

Información adicional

Para implementar automáticamente los recursos de este patrón, siga estos pasos:

  1. Descarga el archivo adjunto y extrae las dos CloudFormation plantillas: part-1-copy-tagged-images.yaml ypart-2-destination-account-role.yaml.

  2. Inicie sesión en la CloudFormation consola de AWS e impleméntelo part-1-copy-tagged-images.yaml en la misma cuenta y región de AWS que los registros de Amazon ECR de origen. Actualice los parámetros según sea necesario. La plantilla implementa los recursos siguientes:

    • Función de IAM en Amazon CloudWatch Events

    • Función de IAM en CodeBuild proyectos de AWS

    • CodeBuild Proyecto AWS

    • Regla de CloudWatch eventos de AWS

  3. Tome nota del valor de SourceRoleName en la pestaña Outputs (Salidas). Lo necesitará para el siguiente paso.

  4. Implemente la segunda CloudFormation plantilla en la cuenta de AWS en la que desee copiar las imágenes del contenedor de Amazon ECR. part-2-destination-account-role.yaml Actualice los parámetros según sea necesario. En el parámetro SourceRoleName, especifique el valor del paso 3. Esta plantilla implementa el rol de IAM multicuenta.

  5. Valide la replicación y exclusión de imágenes, tal y como se describe en el último paso de la sección de Epics.

Conexiones

Para acceder al contenido adicional asociado a este documento, descomprima el archivo: attachment.zip