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.
Copie imágenes de contenedores de Amazon ECR en y Cuentas de AWS Regiones de AWS
Faisal Shahdad, Amazon Web Services
Resumen
Este patrón le muestra cómo utilizar un enfoque sin servidor para replicar imágenes etiquetadas de repositorios existentes de Amazon Elastic Container Registry (Amazon ECR) a otros repositorios y. Cuentas de AWS Regiones de AWS La solución se utiliza AWS Step Functions para administrar el flujo de trabajo de replicación y AWS Lambda funciona para copiar imágenes de contenedores de gran tamaño.
Amazon ECR utiliza características nativas de replicación entre regiones y entre cuentas que replican imágenes de contenedor entre regiones y cuentas. Sin embargo, estas características solo replican las imágenes desde el momento en que se activa la replicación. No existe ningún mecanismo para replicar las imágenes existentes en distintas regiones y cuentas.
Este patrón ayuda a los equipos de inteligencia artificial (IA) a distribuir modelos, marcos (por ejemplo PyTorch TensorFlow, y Hugging Face) y dependencias de aprendizaje automático (ML) en contenedores a otras cuentas y regiones. Esto puede ayudarle a superar los límites del servicio y optimizar los recursos de computación de la GPU. También puede replicar selectivamente los repositorios de Amazon ECR desde regiones y cuentas de origen específicas. Para obtener más información, consulte Cross-Region replication in Amazon ECR has landed (La replicación entre regiones en Amazon ECR ya está aquí).
Requisitos previos y limitaciones
Requisitos previos
Dos o más activas Cuentas de AWS (una cuenta de origen y una cuenta de destino, como mínimo)
Permisos adecuados AWS Identity and Access Management (IAM) en todas las cuentas
Docker para crear la imagen del contenedor de Lambda
AWS Command Line Interface (AWS CLI) configurados para todas las cuentas
Limitaciones
Exclusión de imágenes sin etiquetar: la solución copia solo las imágenes del contenedor que tienen etiquetas explícitas. Omite las imágenes sin etiquetar que existen con resúmenes de SHA256.
Restricciones de tiempo de espera de ejecución de Lambda: AWS Lambda está limitado a un tiempo de espera de ejecución máximo de 15 minutos, que puede ser insuficiente para copiar repositorios o imágenes de contenedores de gran tamaño.
Administración manual de imágenes de contenedor: el código crane-app.py de Python requiere volver a crear e implementar la imagen de contenedor de Lambda.
Capacidad de procesamiento paralelo limitada: la configuración de estado de MaxConcurrency limita el número de repositorios que puede copiar al mismo tiempo. Sin embargo, puedes modificar esta configuración en la plantilla de la cuenta de origen. AWS CloudFormation Tenga en cuenta que los valores de simultaneidad más altos pueden provocar que supere los límites de tasas de servicio y las cuotas de ejecución de Lambda a nivel de cuenta.
Arquitectura
Pila de destino
El patrón tiene cuatro componentes principales:
Infraestructura de cuentas de origen: CloudFormation plantilla que crea los componentes de orquestación
Infraestructura de cuentas de destino: CloudFormation plantilla que crea funciones de acceso entre cuentas
Función de Lambda: función basada en Python que utiliza Crane para copiar imágenes de forma eficiente.
Imagen de contenedor: contenedor de Docker que empaqueta la función de Lambda con las herramientas necesarias.
Arquitectura de destino
Flujo de trabajo de Step Functions
La máquina de estados de Step Functions organiza lo siguiente, como se muestra en el siguiente diagrama:
PopulateRepositoryList: analiza los repositorios de Amazon ECR y rellena Amazon DynamoDB.
GetRepositoryList: recupera una lista de repositorios únicos de DynamoDB.
DeduplicateRepositories: garantiza que no haya ningún procesamiento duplicado.
CopyRepositories: gestiona la copia paralela de repositorios.
NotifySuccess/NotifyFailure: notificaciones de Amazon Simple Notification Service (Amazon SNS) basadas en el resultado de la ejecución.
Herramientas de Amazon
Amazon le CloudWatch ayuda a supervisar las métricas de sus AWS recursos y las aplicaciones en las que se ejecuta AWS en tiempo real.
Amazon DynamoDB es un servicio de base de datos de NoSQL completamente administrado que ofrece un rendimiento rápido, predecible y escalable.
Amazon Simple Notification Service (Amazon SNS) le permite coordinar y administrar el intercambio de mensajes entre publicadores y clientes, incluidos los servidores web y las direcciones de correo electrónico.
AWS Identity and Access Management (IAM) le ayuda a administrar de forma segura el acceso a sus AWS recursos al controlar quién está autenticado y autorizado a usarlos.
AWS Lambda es un servicio de computación que ayuda a ejecutar código sin necesidad de aprovisionar ni administrar servidores. Ejecuta el código solo cuando es necesario y amplía la capacidad de manera automática, por lo que solo pagará por el tiempo de procesamiento que utilice.
AWS Step Functionses un servicio de organización sin servidor que le ayuda a combinar funciones de Lambda y otras Servicios de AWS para crear aplicaciones críticas para la empresa.
Otras herramientas
Crane es una herramienta de orquestación de Docker. Es similar a Docker Compose, pero tiene características adicionales.
Docker es un conjunto de productos de plataforma como servicio (PaaS) que utiliza la virtualización a nivel del sistema operativo para entregar software en contenedores.
Repositorio de código
Prácticas recomendadas
Siga el principio de privilegio mínimo y conceda los permisos mínimos necesarios para llevar a cabo una tarea. Para obtener más información, consulte Otorgar privilegio mínimo y Prácticas recomendadas de seguridad en la documentación de IAM.
Epics
| Tarea | Descripción | Habilidades requeridas |
|---|
Configure AWS CLI los perfiles. | Configure el perfil de la cuenta de origen: aws configure --profile source-account
# Enter: Access Key ID, Secret Access Key, Default region, Output format (json)
Configure el perfil de la cuenta de destino: aws configure --profile destination-account
# Enter: Access Key ID, Secret Access Key, Default region, Output format (json)
Verifique las configuraciones: aws sts get-caller-identity --profile source-account
aws sts get-caller-identity --profile destination-account
| DevOps ingeniero, ingeniero de datos, ingeniero de aprendizaje automático |
Reúna la información requerida. | Obtenga el ID de la cuenta de origen: export SOURCE_ACCOUNT_ID=$(aws sts get-caller-identity --profile source-account --query Account --output text)
echo "Source Account ID: $SOURCE_ACCOUNT_ID"
Obtenga el ID de la cuenta de destino: export DEST_ACCOUNT_ID=$(aws sts get-caller-identity --profile destination-account --query Account --output text)
echo "Destination Account ID: $DEST_ACCOUNT_ID"
Configure el Regiones de AWS. Modifique este comando para su región: export SOURCE_REGION="us-east-1"
export DEST_REGION="us-east-2"
Enumere los repositorios de Amazon ECR existentes en la cuenta de origen: aws ecr describe-repositories --profile source-account --region $SOURCE_REGION --query 'repositories[].repositoryName' --output table
| DevOps ingeniero, ingeniero de datos, ingeniero de aprendizaje automático |
Clonar el repositorio. | Clone el repositorio del patrón en la estación de trabajo local: git clone https://github.com/aws-samples/sample-ecr-copy
| DevOps ingeniero, ingeniero de datos, ingeniero de ML |
| Tarea | Descripción | Habilidades requeridas |
|---|
Valide la plantilla. | Valide la CloudFormation plantilla: aws cloudformation validate-template \
--template-body file://"Destination Account cf_template.yml" \
--profile destination-account
| DevOps ingeniero, ingeniero de aprendizaje automático, ingeniero de datos |
Implemente la infraestructura de destino. | Implemente la pila de la cuenta de destino: aws cloudformation deploy \
--template-file "Destination Account cf_template.yml" \
--stack-name ecr-copy-destination \
--parameter-overrides \
SourceAccountId=$SOURCE_ACCOUNT_ID \
SourceRoleName=ECRContainerLambdaRole \
--capabilities CAPABILITY_NAMED_IAM \
--profile destination-account \
--region $DEST_REGION
Espere a que se complete la pila: aws cloudformation wait stack-create-complete \
--stack-name ecr-copy-destination \
--profile destination-account \
--region $DEST_REGION
| Ingeniero de datos, ingeniero de aprendizaje automático, DevOps ingeniero |
Comprobar la implementación. | Obtenga salidas de pila: aws cloudformation describe-stacks \
--stack-name ecr-copy-destination \
--profile destination-account \
--region $DEST_REGION \
--query 'Stacks[0].Outputs' \
--output table
Almacene el rol de IAM entre cuentas: export CROSS_ACCOUNT_ROLE_ARN=$(aws cloudformation describe-stacks \
--stack-name ecr-copy-destination \
--profile destination-account \
--region $DEST_REGION \
--query 'Stacks[0].Outputs[?OutputKey==`CrossAccountRoleArn`].OutputValue' \
--output text)
echo "Cross-Account Role ARN: $CROSS_ACCOUNT_ROLE_ARN"
| DevOps ingeniero, ingeniero de aprendizaje automático, ingeniero de datos |
| Tarea | Descripción | Habilidades requeridas |
|---|
Prepare la compilación del contenedor. | Compruebe que Docker se esté ejecutando: docker --version
docker info
Asegúrese de que crane-app.py y Dockerfile estén en el directorio actual: ls -la crane-app.py Dockerfile
| Ingeniero de datos, ingeniero de aprendizaje automático, DevOps ingeniero |
Compile la imagen de contenedor. | Compile la imagen de contenedor de Lamba: docker build -t ecr-copy-lambda . --no-cache
Compruebe que la imagen se haya creado: docker images ecr-copy-lambda
(Opcional) Pruebe el contenedor localmente: docker run --rm --entrypoint python ecr-copy-lambda -c "import boto3; print('Container working')"
| Ingeniero de datos, ingeniero de aprendizaje automático, DevOps ingeniero |
Cree un repositorio y cargue la imagen. | Cree un repositorio de Amazon ECR en la cuenta de origen: aws ecr create-repository \
--repository-name ecr-copy-lambda \
--profile source-account \
--region $SOURCE_REGION
Obtenga un token de inicio de sesión de Amazon ECR y autentique Docker: aws ecr get-login-password \
--profile source-account \
--region $SOURCE_REGION | \
docker login --username AWS --password-stdin \
$SOURCE_ACCOUNT_ID.dkr.ecr.$SOURCE_REGION.amazonaws.com
Etiquete la imagen para Amazon ECR: docker tag ecr-copy-lambda:latest \
$SOURCE_ACCOUNT_ID.dkr.ecr.$SOURCE_REGION.amazonaws.com/ecr-copy-lambda:latest
Cargue la imagen en Amazon ECR: docker push $SOURCE_ACCOUNT_ID.dkr.ecr.$SOURCE_REGION.amazonaws.com/ecr-copy-lambda:latest
Almacene el URI de la imagen para su uso posterior: export LAMBDA_IMAGE_URI="$SOURCE_ACCOUNT_ID.dkr.ecr.$SOURCE_REGION.amazonaws.com/ecr-copy-lambda:latest"
echo "Lambda Image URI: $LAMBDA_IMAGE_URI"
| Ingeniero de datos, ingeniero de aprendizaje automático, DevOps ingeniero |
Verifique la imagen. | Enumere las imágenes del repositorio: aws ecr list-images \
--repository-name ecr-copy-lambda \
--profile source-account \
--region $SOURCE_REGION
Obtenga los detalles de la imagen: aws ecr describe-images \
--repository-name ecr-copy-lambda \
--profile source-account \
--region $SOURCE_REGION
| Ingeniero de datos, ingeniero de aprendizaje automático, DevOps ingeniero |
| Tarea | Descripción | Habilidades requeridas |
|---|
Prepare los parámetros de implementación. | Configure el correo electrónico de notificación: export NOTIFICATION_EMAIL="your-email@company.com"
Defina los repositorios que desea copiar (separados por comas): export REPOSITORY_LIST="app-frontend,app-backend,database-migrations"
Configure el entorno: export ENVIRONMENT="dev"
echo "Deployment Parameters:"
echo "Source Account: $SOURCE_ACCOUNT_ID"
echo "Destination Account: $DEST_ACCOUNT_ID"
echo "Source Region: $SOURCE_REGION"
echo "Destination Region: $DEST_REGION"
echo "Lambda Image: $LAMBDA_IMAGE_URI"
echo "Notification Email: $NOTIFICATION_EMAIL"
echo "Repositories: $REPOSITORY_LIST"
| Ingeniero de datos, DevOps ingeniero, ingeniero de aprendizaje automático |
Valide la plantilla de origen. | Valide la CloudFormation plantilla de origen: aws cloudformation validate-template \
--template-body file://"Source Account Cf template.yml" \
--profile source-account
| Ingeniero de datos, ingeniero de aprendizaje automático, DevOps ingeniero |
Implemente la infraestructura de origen. | Implemente la pila de la cuenta de origen: aws cloudformation deploy \
--template-file "Source Account Cf template.yml" \
--stack-name ecr-copy-source \
--parameter-overrides \
SourceAccountId=$SOURCE_ACCOUNT_ID \
DestinationAccountId=$DEST_ACCOUNT_ID \
DestinationRegion=$DEST_REGION \
SourceRegion=$SOURCE_REGION \
NotificationEmail=$NOTIFICATION_EMAIL \
RepositoryList="$REPOSITORY_LIST" \
LambdaImageUri=$LAMBDA_IMAGE_URI \
Environment=$ENVIRONMENT \
--capabilities CAPABILITY_NAMED_IAM \
--profile source-account \
--region $SOURCE_REGION
Espere a que se complete la pila (esta acción puede tardar hasta 10 minutos): aws cloudformation wait stack-create-complete \
--stack-name ecr-copy-source \
--profile source-account \
--region $SOURCE_REGION
| Ingeniero de datos, ingeniero de aprendizaje automático, DevOps ingeniero |
Verifique la implementación y recopile los resultados. | Obtenga las salidas de la pila: aws cloudformation describe-stacks \
--stack-name ecr-copy-source \
--profile source-account \
--region $SOURCE_REGION \
--query 'Stacks[0].Outputs' \
--output table
Guarde los nombres de recursos de Amazon (ARNs) para la máquina de estado y el tema SNS: export STATE_MACHINE_ARN=$(aws cloudformation describe-stacks \
--stack-name ecr-copy-source \
--profile source-account \
--region $SOURCE_REGION \
--query 'Stacks[0].Outputs[?OutputKey==`StateMachineArn`].OutputValue' \
--output text)
export SNS_TOPIC_ARN=$(aws cloudformation describe-stacks \
--stack-name ecr-copy-source \
--profile source-account \
--region $SOURCE_REGION \
--query 'Stacks[0].Outputs[?OutputKey==`SNSTopicArn`].OutputValue' \
--output text)
echo "State Machine ARN: $STATE_MACHINE_ARN"
echo "SNS Topic ARN: $SNS_TOPIC_ARN"
| DevOps ingeniero, ingeniero de aprendizaje automático, ingeniero de datos |
Confirme la suscripción de correo electrónico. | Compruebe su correo electrónico para confirmar su suscripción a SNS. Seleccione el enlace de confirmación en el correo electrónico. Verifique el estado de la suscripción. aws sns list-subscriptions-by-topic \
--topic-arn $SNS_TOPIC_ARN \
--profile source-account \
--region $SOURCE_REGION
| Ingeniero de datos, ingeniero de aprendizaje automático, DevOps ingeniero |
| Tarea | Descripción | Habilidades requeridas |
|---|
Ejecute y supervise el proceso de copia. | Inicie sesión en la Consola de administración de AWSconsola Step Functions y ábrala. Localice la máquina de estado. Seleccione Iniciar ejecución. Cuando finalice, los resultados se muestran en la pestaña de entrada y salida de la ejecución. (Opcional) Si quieres seguir ejecutando Step Functions mediante el AWS CLI, sigue los pasos restantes de esta epopeya.
| DevOps ingeniero, ingeniero de aprendizaje automático, ingeniero de datos |
Ejecute Step Functions. | Genere un nombre único: export EXECUTION_NAME="ecr-copy-$(date +%Y%m%d-%H%M%S)"
Ejecute Step Functions. export EXECUTION_ARN=$(aws stepfunctions start-execution \
--state-machine-arn $STATE_MACHINE_ARN \
--name $EXECUTION_NAME \
--profile source-account \
--region $SOURCE_REGION \
--query 'executionArn' \
--output text)
echo "Execution started: $EXECUTION_ARN"
echo "Execution Name: $EXECUTION_NAME"
| DevOps ingeniero, ingeniero de aprendizaje automático, ingeniero de datos |
Supervise el progreso. | Compruebe el estado:
aws stepfunctions describe-execution \
--execution-arn $EXECUTION_ARN \
--profile source-account \
--region $SOURCE_REGION \
--query '{Status:status,StartDate:startDate,StopDate:stopDate}' \
--output table
Obtenga el historial:
aws stepfunctions get-execution-history \
--execution-arn $EXECUTION_ARN \
--profile source-account \
--region $SOURCE_REGION \
--query 'events[?type==`TaskStateEntered` || type==`TaskSucceeded` || type==`TaskFailed`].{Type:type,Timestamp:timestamp,Details:stateEnteredEventDetails.name}' \
--output table
| DevOps ingeniero, ingeniero de aprendizaje automático, ingeniero de datos |
Compruebe los resultados. | Espere a que se complete el proceso (se actualiza cada 30 segundos): while true; do
STATUS=$(aws stepfunctions describe-execution \
--execution-arn $EXECUTION_ARN \
--profile source-account \
--region $SOURCE_REGION \
--query 'status' \
--output text)
echo "Current status: $STATUS"
if [[ "$STATUS" == "SUCCEEDED" || "$STATUS" == "FAILED" || "$STATUS" == "TIMED_OUT" || "$STATUS" == "ABORTED" ]]; then
break
fi
sleep 30
done
echo "Final execution status: $STATUS"
| DevOps ingeniero, ingeniero de aprendizaje automático, ingeniero de datos |
Verifique las imágenes. | Enumere los repositorios de la cuenta de destino: aws ecr describe-repositories \
--profile destination-account \
--region $DEST_REGION \
--query 'repositories[].repositoryName' \
--output table
Compruebe las imágenes del repositorio: for repo in $(echo $REPOSITORY_LIST | tr ',' ' '); do
echo "\nImages in repository: $repo"
aws ecr list-images \
--repository-name $repo \
--profile destination-account \
--region $DEST_REGION \
--query 'imageIds[].imageTag' \
--output table 2>/dev/null || echo "Repository $repo not found or no images"
done
| DevOps ingeniero, ingeniero de datos, ingeniero de ML |
Resolución de problemas
| Problema | Solución |
|---|
No se ha podido ejecutar Step Functions. | Para recuperar los eventos de error detallados del historial, ejecute el siguiente AWS CLI comando: if [[ "$STATUS" == "FAILED" ]]; then
echo "Getting failure details..."
aws stepfunctions get-execution-history \
--execution-arn $EXECUTION_ARN \
--profile source-account \
--region $SOURCE_REGION \
--query 'events[?type==`TaskFailed`]' \
--output json
fi
Para recuperar los registros de las funciones de Lambda fallidas, ejecute el siguiente comando: AWS CLI # Check Lambda function logs
echo "\nLambda function logs:"
aws logs describe-log-groups \
--log-group-name-prefix "/aws/lambda/ecr-copy-source" \
--profile source-account \
--region $SOURCE_REGION \
--query 'logGroups[].logGroupName' \
--output table
|
Recursos relacionados
Información adicional
Parámetros de configuración
Parámetro | Description (Descripción) | Ejemplo |
|---|
SourceAccountId
| Cuenta de AWS ID de la fuente | 11111111111
|
DestinationAccountId
| Cuenta de AWS ID de destino | 22222222222
|
DestinationRegion
| Objetivo Región de AWS | us-east-2
|
SourceRegion
| Fuente Región de AWS | us-east-1
|
NotificationEmail
| Correo electrónico para las notificaciones | abc@xyz.com
|
RepositoryList
| Repositorios que se van a copiar | repo1,repo2,repo3
|
LambdaImageUri
| URI de la imagen de contenedor de Lambda | ${ACCOUNT}.dkr.ecr.${REGION}.amazonaws.com/ecr-copy-lambda:latest
|