Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Copiez les images des conteneurs Amazon ECR sur et Comptes AWS Régions AWS
Faisal Shahdad, Amazon Web Services
Résumé
Ce modèle vous montre comment utiliser une approche sans serveur pour répliquer des images balisées depuis des référentiels Amazon Elastic Container Registry (Amazon ECR) existants vers d'autres référentiels et. Comptes AWS Régions AWS La solution permet AWS Step Functions de gérer le flux de travail de réplication et de AWS Lambda copier des images de conteneurs de grande taille.
Amazon ECR utilise des fonctionnalités natives de réplication entre régions et entre comptes qui répliquent les images de conteneurs entre les régions et les comptes. Mais ces fonctionnalités répliquent les images uniquement à partir du moment où la réplication est activée. Il n'existe aucun mécanisme permettant de répliquer des images existantes dans différentes régions et comptes.
Ce modèle aide les équipes d'intelligence artificielle (IA) à distribuer des modèles, des frameworks (par exemple,, et Hugging Face) et des dépendances d'apprentissage automatique conteneurisé (ML) à d'autres comptes et régions. PyTorch TensorFlow Cela peut vous aider à surmonter les limites de service et à optimiser les ressources de calcul du GPU. Vous pouvez également répliquer de manière sélective les référentiels Amazon ECR à partir de comptes sources et de régions spécifiques. Pour plus d'informations, consultez la section La réplication entre régions dans Amazon ECR a été lancée.
Conditions préalables et limitations
Conditions préalables
Deux comptes actifs ou plus Comptes AWS (un compte source et un compte de destination, au minimum)
Autorisations appropriées Gestion des identités et des accès AWS (IAM) dans tous les comptes
Docker pour créer l'image du conteneur Lambda
AWS Command Line Interface (AWS CLI) configuré pour tous les comptes
Limites
Exclusion d'images non balisées : la solution copie uniquement les images de conteneur comportant des balises explicites. Il ignore les images non étiquetées qui existent avec SHA256 des résumés.
Contraintes de délai d'exécution Lambda : elles AWS Lambda sont limitées à un délai d'exécution maximal de 15 minutes, ce qui peut être insuffisant pour copier de grandes images de conteneurs ou des référentiels.
Gestion manuelle de l'image du conteneur : le code crane-app.py Python nécessite la reconstruction et le redéploiement de l'image du conteneur Lambda.
Capacité de traitement parallèle limitée : le paramètre MaxConcurrency d'état limite le nombre de référentiels que vous pouvez copier simultanément. Vous pouvez toutefois modifier ce paramètre dans le AWS CloudFormation modèle du compte source. Notez que des valeurs de simultanéité plus élevées peuvent vous faire dépasser les limites de débit de service et les quotas d'exécution Lambda au niveau du compte.
Architecture
Pile cible
Le motif comporte quatre éléments principaux :
Infrastructure du compte source : CloudFormation modèle qui crée les composants d'orchestration
Infrastructure de comptes de destination : CloudFormation modèle qui crée des rôles d'accès entre comptes
Fonction Lambda : fonction basée sur Python qui utilise Crane pour copier efficacement des images
Image de conteneur — Conteneur Docker qui regroupe la fonction Lambda avec les outils requis
Architecture cible
Flux de travail Step Functions
La machine d'état Step Functions orchestre les opérations suivantes, comme le montre le schéma suivant :
PopulateRepositoryList— Analyse les référentiels Amazon ECR et remplit Amazon DynamoDB
GetRepositoryList— Récupère une liste de référentiels unique depuis DynamoDB
DeduplicateRepositories— Garantit qu'il n'y a pas de double traitement
CopyRepositories— Gère la copie parallèle des référentiels
NotifySuccess/NotifyFailure— Notifications Amazon Simple Notification Service (Amazon SNS) basées sur le résultat de l'exécution
Outils Amazon
Amazon vous CloudWatch aide à surveiller les indicateurs de vos AWS ressources et des applications que vous utilisez AWS en temps réel.
Amazon DynamoDB est un service de base de données NoSQL entièrement géré, offrant des performances rapides, prévisibles et évolutives.
Amazon Simple Notification Service (Amazon SNS) vous aide à coordonner et à gérer l'échange de messages entre les éditeurs et les clients, y compris les serveurs Web et les adresses e-mail.
Gestion des identités et des accès AWS (IAM) vous aide à gérer en toute sécurité l'accès à vos AWS ressources en contrôlant qui est authentifié et autorisé à les utiliser.
AWS Lambda est un service de calcul qui vous aide à exécuter du code sans avoir à allouer ni à gérer des serveurs. Il exécute votre code uniquement lorsque cela est nécessaire et évolue automatiquement, de sorte que vous ne payez que pour le temps de calcul que vous utilisez.
AWS Step Functionsest un service d'orchestration sans serveur qui vous aide à combiner des fonctions Lambda et d'autres fonctions pour créer des applications critiques Services AWS pour l'entreprise.
Autres outils
Crane est un outil d'orchestration Docker. Il est similaire à Docker Compose mais possède des fonctionnalités supplémentaires.
Docker est un ensemble de produits de plateforme en tant que service (PaaS) qui utilisent la virtualisation au niveau du système d'exploitation pour fournir des logiciels dans des conteneurs.
Référentiel de code
Bonnes pratiques
Respectez le principe du moindre privilège et accordez les autorisations minimales requises pour effectuer une tâche. Pour plus d'informations, consultez les sections Accorder le moindre privilège et Bonnes pratiques en matière de sécurité dans la documentation IAM.
Épopées
| Sous-tâche | Description | Compétences requises |
|---|
Configurez AWS CLI les profils. | Configurez le profil du compte source : aws configure --profile source-account
# Enter: Access Key ID, Secret Access Key, Default region, Output format (json)
Configurez le profil du compte de destination : aws configure --profile destination-account
# Enter: Access Key ID, Secret Access Key, Default region, Output format (json)
Vérifiez les configurations : aws sts get-caller-identity --profile source-account
aws sts get-caller-identity --profile destination-account
| DevOps ingénieur, ingénieur de données, ingénieur ML |
Rassemblez les informations requises. | Obtenez l'identifiant du compte source : export SOURCE_ACCOUNT_ID=$(aws sts get-caller-identity --profile source-account --query Account --output text)
echo "Source Account ID: $SOURCE_ACCOUNT_ID"
Obtenez l'identifiant du compte de destination : export DEST_ACCOUNT_ID=$(aws sts get-caller-identity --profile destination-account --query Account --output text)
echo "Destination Account ID: $DEST_ACCOUNT_ID"
Réglez le Régions AWS. Modifiez cette commande pour votre région : export SOURCE_REGION="us-east-1"
export DEST_REGION="us-east-2"
Répertoriez les référentiels Amazon ECR existants dans le compte source : aws ecr describe-repositories --profile source-account --region $SOURCE_REGION --query 'repositories[].repositoryName' --output table
| DevOps ingénieur, ingénieur de données, ingénieur ML |
Pour cloner le référentiel. | Clonez le référentiel du modèle sur votre poste de travail local : git clone https://github.com/aws-samples/sample-ecr-copy
| DevOps ingénieur, ingénieur de données, ingénieur ML |
| Sous-tâche | Description | Compétences requises |
|---|
Validez le modèle. | Validez le CloudFormation modèle : aws cloudformation validate-template \
--template-body file://"Destination Account cf_template.yml" \
--profile destination-account
| DevOps ingénieur, ingénieur ML, ingénieur de données |
Déployez l'infrastructure de destination. | Déployez la pile de comptes de destination : 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
Attendez que la pile soit terminée : aws cloudformation wait stack-create-complete \
--stack-name ecr-copy-destination \
--profile destination-account \
--region $DEST_REGION
| Ingénieur de données, ingénieur ML, DevOps ingénieur |
Vérifier le déploiement. | Obtenez des sorties de pile : aws cloudformation describe-stacks \
--stack-name ecr-copy-destination \
--profile destination-account \
--region $DEST_REGION \
--query 'Stacks[0].Outputs' \
--output table
Stockez le rôle IAM entre comptes : 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 ingénieur, ingénieur ML, ingénieur de données |
| Sous-tâche | Description | Compétences requises |
|---|
Préparez la construction du conteneur. | Vérifiez que Docker est en cours d'exécution : docker --version
docker info
Assurez-vous que crane-app.py et que Dockerfile vous vous trouvez dans le répertoire actuel : ls -la crane-app.py Dockerfile
| Ingénieur de données, ingénieur ML, DevOps ingénieur |
Créez l'image du conteneur. | Créez l'image du conteneur Lambda : docker build -t ecr-copy-lambda . --no-cache
Vérifiez que l'image a été créée : docker images ecr-copy-lambda
(Facultatif) Testez le conteneur localement : docker run --rm --entrypoint python ecr-copy-lambda -c "import boto3; print('Container working')"
| Ingénieur de données, ingénieur ML, DevOps ingénieur |
Créez un référentiel et téléchargez l'image. | Créez un référentiel Amazon ECR dans le compte source : aws ecr create-repository \
--repository-name ecr-copy-lambda \
--profile source-account \
--region $SOURCE_REGION
Obtenez un jeton de connexion Amazon ECR et authentifiez 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
Marquez l'image pour Amazon ECR : docker tag ecr-copy-lambda:latest \
$SOURCE_ACCOUNT_ID.dkr.ecr.$SOURCE_REGION.amazonaws.com/ecr-copy-lambda:latest
Téléchargez l'image sur Amazon ECR : docker push $SOURCE_ACCOUNT_ID.dkr.ecr.$SOURCE_REGION.amazonaws.com/ecr-copy-lambda:latest
Stockez l'URI de l'image pour une utilisation ultérieure : export LAMBDA_IMAGE_URI="$SOURCE_ACCOUNT_ID.dkr.ecr.$SOURCE_REGION.amazonaws.com/ecr-copy-lambda:latest"
echo "Lambda Image URI: $LAMBDA_IMAGE_URI"
| Ingénieur de données, ingénieur ML, DevOps ingénieur |
Vérifiez l'image. | Répertoriez les images du référentiel : aws ecr list-images \
--repository-name ecr-copy-lambda \
--profile source-account \
--region $SOURCE_REGION
Obtenez les détails de l'image : aws ecr describe-images \
--repository-name ecr-copy-lambda \
--profile source-account \
--region $SOURCE_REGION
| Ingénieur de données, ingénieur ML, DevOps ingénieur |
| Sous-tâche | Description | Compétences requises |
|---|
Préparez les paramètres de déploiement. | Définissez l'e-mail de notification : export NOTIFICATION_EMAIL="your-email@company.com"
Définissez les référentiels à copier (séparés par des virgules) : export REPOSITORY_LIST="app-frontend,app-backend,database-migrations"
Définissez l'environnement : 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"
| Ingénieur de données, DevOps ingénieur, ingénieur ML |
Validez le modèle source. | Validez le CloudFormation modèle source : aws cloudformation validate-template \
--template-body file://"Source Account Cf template.yml" \
--profile source-account
| Ingénieur de données, ingénieur ML, DevOps ingénieur |
Déployez l'infrastructure source. | Déployez la pile de comptes source : 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
Attendez que la pile soit terminée (cela peut prendre jusqu'à 10 minutes) : aws cloudformation wait stack-create-complete \
--stack-name ecr-copy-source \
--profile source-account \
--region $SOURCE_REGION
| Ingénieur de données, ingénieur ML, DevOps ingénieur |
Vérifiez le déploiement et collectez les résultats. | Obtenez les sorties de la pile : aws cloudformation describe-stacks \
--stack-name ecr-copy-source \
--profile source-account \
--region $SOURCE_REGION \
--query 'Stacks[0].Outputs' \
--output table
Enregistrez les Amazon Resource Names (ARNs) pour la machine à états et la rubrique 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 ingénieur, ingénieur ML, ingénieur de données |
Confirmez votre abonnement par e-mail. | Vérifiez votre e-mail pour obtenir la confirmation de votre abonnement aux réseaux sociaux. Choisissez le lien de confirmation contenu dans l'e-mail. Vérifiez le statut de l'abonnement. aws sns list-subscriptions-by-topic \
--topic-arn $SNS_TOPIC_ARN \
--profile source-account \
--region $SOURCE_REGION
| Ingénieur de données, ingénieur ML, DevOps ingénieur |
| Sous-tâche | Description | Compétences requises |
|---|
Exécutez et surveillez le processus de copie. | Connectez-vous à la AWS Management Consoleconsole Step Functions et ouvrez-la. Localisez la machine à états. Choisissez Start execution (Démarrer l'exécution). Une fois l'opération terminée, les résultats sont affichés dans l'onglet d'entrée et de sortie d'exécution. (Facultatif) Si vous souhaitez continuer à exécuter Step Functions en utilisant le AWS CLI, suivez les étapes restantes de cette épopée.
| DevOps ingénieur, ingénieur ML, ingénieur de données |
Exécutez la fonction step. | Générez un nom unique : export EXECUTION_NAME="ecr-copy-$(date +%Y%m%d-%H%M%S)"
Exécutez la fonction step. 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 ingénieur, ingénieur ML, ingénieur de données |
Surveillez les progrès. | Vérifiez le statut :
aws stepfunctions describe-execution \
--execution-arn $EXECUTION_ARN \
--profile source-account \
--region $SOURCE_REGION \
--query '{Status:status,StartDate:startDate,StopDate:stopDate}' \
--output table
Consultez l'historique :
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 ingénieur, ingénieur ML, ingénieur de données |
Vérifiez les résultats. | Attendez que le processus soit terminé (mis à jour toutes les 30 secondes) : 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 ingénieur, ingénieur ML, ingénieur de données |
Vérifiez les images. | Répertoriez les référentiels du compte de destination : aws ecr describe-repositories \
--profile destination-account \
--region $DEST_REGION \
--query 'repositories[].repositoryName' \
--output table
Vérifiez les images du référentiel : 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 ingénieur, ingénieur de données, ingénieur ML |
Résolution des problèmes
| Problème | Solution |
|---|
Les fonctions Step ne s'exécutent pas. | Pour récupérer des événements de défaillance détaillés à partir de l'historique, exécutez la AWS CLI commande suivante : 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
Pour récupérer les journaux des fonctions Lambda défaillantes, exécutez la commande suivante : 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
|
Ressources connexes
Informations supplémentaires
Paramètres de configuration
Paramètre | Description | Exemple |
|---|
SourceAccountId
| Compte AWS Identifiant de la source | 11111111111
|
DestinationAccountId
| Compte AWS Identifiant de destination | 22222222222
|
DestinationRegion
| Cible Région AWS | us-east-2
|
SourceRegion
| La source Région AWS | us-east-1
|
NotificationEmail
| E-mail pour les notifications | abc@xyz.com
|
RepositoryList
| Référentiels à copier | repo1,repo2,repo3
|
LambdaImageUri
| URI de l'image du conteneur Lambda | ${ACCOUNT}.dkr.ecr.${REGION}.amazonaws.com/ecr-copy-lambda:latest
|