View a markdown version of this page

Copia le immagini dei container Amazon ECR su e Account AWS Regioni AWS - Prontuario AWS

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Copia le immagini dei container Amazon ECR su e Account AWS Regioni AWS

Faisal Shahdad, Amazon Web Services

Riepilogo

Questo modello mostra come utilizzare un approccio serverless per replicare immagini con tag da repository Amazon Elastic Container Registry (Amazon ECR) esistenti su altri e. Account AWS Regioni AWS La soluzione consente di gestire il flusso AWS Step Functions di lavoro di replica e le AWS Lambda funzioni per copiare immagini di contenitori di grandi dimensioni.

Amazon ECR utilizza funzionalità di replica native tra regioni e account che replicano le immagini dei container tra regioni e account. Tuttavia, queste funzionalità replicano le immagini solo dal momento in cui la replica viene attivata. Non esiste alcun meccanismo per replicare le immagini esistenti in diverse regioni e account.

Questo modello aiuta i team di intelligenza artificiale (AI) a distribuire modelli, framework (ad esempio, e TensorFlow Hugging Face) e dipendenze di machine learning (ML) containerizzati ad altri account e regioni. PyTorch Questo può aiutarti a superare i limiti del servizio e ottimizzare le risorse di calcolo della GPU. Puoi anche replicare selettivamente i repository Amazon ECR da account e regioni di origine specifici. Per ulteriori informazioni, consulta la pagina Cross-Region Replication in Amazon ECR has landed.

Prerequisiti e limitazioni

Prerequisiti

  • Due o più account attivi Account AWS (almeno un account di origine e un account di destinazione)

  • Autorizzazioni appropriate AWS Identity and Access Management (IAM) in tutti gli account

  • Docker per creare l'immagine del contenitore Lambda

  • AWS Command Line Interface (AWS CLI) configurato per tutti gli account

Limitazioni

  • Esclusione di immagini senza tag: la soluzione copia solo le immagini dei contenitori con tag espliciti. Ignora le immagini senza tag che esistono con i digest. SHA256

  • Vincoli di timeout di esecuzione Lambda: AWS Lambda è limitato a un timeout di esecuzione massimo di 15 minuti, che potrebbe essere insufficiente per copiare immagini di contenitori o repository di grandi dimensioni.

  • Gestione manuale dell'immagine del contenitore: il codice crane-app.py Python richiede la ricostruzione e la ridistribuzione dell'immagine del contenitore Lambda.

  • Capacità di elaborazione parallela limitata: l'impostazione MaxConcurrency dello stato limita il numero di repository che è possibile copiare contemporaneamente. Tuttavia, puoi modificare questa impostazione nel AWS CloudFormation modello dell'account di origine. Tieni presente che valori di concorrenza più elevati possono causare il superamento dei limiti di velocità di servizio e delle quote di esecuzione Lambda a livello di account.

Architecture

Pila di obiettivi

Il pattern ha quattro componenti principali:

  • Infrastruttura dell'account di origine: CloudFormation modello che crea i componenti di orchestrazione

  • Infrastruttura dell'account di destinazione: CloudFormation modello che crea ruoli di accesso tra account

  • Funzione Lambda: funzione basata su Python che utilizza Crane per una copia efficiente delle immagini

  • Immagine del contenitore: contenitore Docker che racchiude la funzione Lambda con gli strumenti richiesti

Architettura Target

Flusso di lavoro Step Functions

La macchina a stati Step Functions orchestra quanto segue, come mostrato nel diagramma seguente:

  • PopulateRepositoryList Scansiona i repository Amazon ECR e popola Amazon DynamoDB

  • GetRepositoryList Recupera un elenco di repository univoco da DynamoDB

  • DeduplicateRepositories Assicura che non vi siano elaborazioni duplicate

  • CopyRepositories Gestisce la copia parallela dei repository

  • NotifySuccess/NotifyFailure Notifiche Amazon Simple Notification Service (Amazon SNS) basate sul risultato dell'esecuzione

Tools (Strumenti)

Strumenti Amazon

  • Amazon ti CloudWatch aiuta a monitorare i parametri delle tue AWS risorse e delle applicazioni su cui esegui AWS in tempo reale.

  • Amazon DynamoDB è un servizio di database NoSQL interamente gestito che offre prestazioni elevate, prevedibili e scalabili.

  • Amazon Simple Notification Service (Amazon SNS) ti aiuta a coordinare e gestire lo scambio di messaggi tra editori e clienti, inclusi server Web e indirizzi e-mail.

  • AWS Identity and Access Management (IAM) ti aiuta a gestire in modo sicuro l'accesso alle tue AWS risorse controllando chi è autenticato e autorizzato a utilizzarle.

  • AWS Lambda è un servizio di calcolo che consente di eseguire il codice senza gestire i server o effettuarne il provisioning. Esegue il codice solo quando necessario e si ridimensiona automaticamente, quindi paghi solo per il tempo di elaborazione che utilizzi.

  • AWS Step Functionsè un servizio di orchestrazione serverless che consente di combinare funzioni Lambda e altro Servizi AWS per creare applicazioni aziendali critiche.

Altri strumenti

  • Crane è uno strumento di orchestrazione Docker. È simile a Docker Compose ma ha funzionalità aggiuntive.

  • Docker è un insieme di prodotti Platform as a Service (PaaS) che utilizzano la virtualizzazione a livello di sistema operativo per fornire software in contenitori.

Archivio di codici

  • Il codice per questo pattern è disponibile nel GitHub sample-ecr-copy repository. È possibile utilizzare il CloudFormation modello del repository per creare le risorse sottostanti.

Best practice

Segui il principio del privilegio minimo e concedi le autorizzazioni minime necessarie per eseguire un'attività. Per ulteriori informazioni, consulta le best practice relative alla concessione dei privilegi minimi e alla sicurezza nella documentazione IAM.

Epiche

OperazioneDescriptionCompetenze richieste

Configura AWS CLI i profili.

  1. Configura il profilo dell'account di origine:

    aws configure --profile source-account # Enter: Access Key ID, Secret Access Key, Default region, Output format (json)
  2. Configura il profilo dell'account di destinazione:

    aws configure --profile destination-account # Enter: Access Key ID, Secret Access Key, Default region, Output format (json)
  3. Verifica le configurazioni:

    aws sts get-caller-identity --profile source-account aws sts get-caller-identity --profile destination-account
DevOps ingegnere, ingegnere dei dati, ingegnere ML

Raccogli le informazioni richieste.

  1. Ottieni l'ID dell'account di origine:

    export SOURCE_ACCOUNT_ID=$(aws sts get-caller-identity --profile source-account --query Account --output text) echo "Source Account ID: $SOURCE_ACCOUNT_ID"
  2. Ottieni l'ID dell'account di destinazione:

    export DEST_ACCOUNT_ID=$(aws sts get-caller-identity --profile destination-account --query Account --output text) echo "Destination Account ID: $DEST_ACCOUNT_ID"
  3. Imposta il Regioni AWS. Modifica questo comando per la tua regione:

    export SOURCE_REGION="us-east-1" export DEST_REGION="us-east-2"
  4. Elenca i repository Amazon ECR esistenti nell'account di origine:

    aws ecr describe-repositories --profile source-account --region $SOURCE_REGION --query 'repositories[].repositoryName' --output table
DevOps ingegnere, ingegnere dati, ingegnere ML

Clonare il repository.

Clona il repository del pattern sulla tua workstation locale:

git clone https://github.com/aws-samples/sample-ecr-copy
DevOps ingegnere, ingegnere dei dati, ingegnere ML
OperazioneDescriptionCompetenze richieste

Convalida il modello.

Convalida il modello: CloudFormation

aws cloudformation validate-template \ --template-body file://"Destination Account cf_template.yml" \ --profile destination-account
DevOps ingegnere, ingegnere ML, ingegnere dati

Implementa l'infrastruttura di destinazione.

  1. Distribuisci lo stack di account di destinazione:

    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
  2. Attendi il completamento dello stack:

    aws cloudformation wait stack-create-complete \ --stack-name ecr-copy-destination \ --profile destination-account \ --region $DEST_REGION
Ingegnere dei dati, ingegnere ML, DevOps ingegnere

Verifica l'implementazione.

  1. Ottieni gli output dello stack:

    aws cloudformation describe-stacks \ --stack-name ecr-copy-destination \ --profile destination-account \ --region $DEST_REGION \ --query 'Stacks[0].Outputs' \ --output table
  2. Memorizza il ruolo IAM su più account:

    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 ingegnere, ingegnere ML, ingegnere dati
OperazioneDescriptionCompetenze richieste

Prepara la costruzione del contenitore.

  1. Verifica che Docker sia in esecuzione:

    docker --version docker info
  2. Assicurati che crane-app.py e Dockerfile si trovino nella directory corrente:

    ls -la crane-app.py Dockerfile
Ingegnere dei dati, ingegnere ML, DevOps ingegnere

Crea l'immagine del contenitore.

  1. Crea l'immagine del contenitore Lambda:

    docker build -t ecr-copy-lambda . --no-cache
  2. Verifica che l'immagine sia stata creata:

    docker images ecr-copy-lambda
  3. (Facoltativo) Prova il contenitore localmente:

    docker run --rm --entrypoint python ecr-copy-lambda -c "import boto3; print('Container working')"
Ingegnere dei dati, ingegnere ML, DevOps ingegnere

Crea un repository e carica l'immagine.

  1. Crea un repository Amazon ECR nell'account di origine:

    aws ecr create-repository \ --repository-name ecr-copy-lambda \ --profile source-account \ --region $SOURCE_REGION
  2. Ottieni un token di accesso Amazon ECR e autentica 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
  3. Etichetta l'immagine per Amazon ECR:

    docker tag ecr-copy-lambda:latest \ $SOURCE_ACCOUNT_ID.dkr.ecr.$SOURCE_REGION.amazonaws.com/ecr-copy-lambda:latest
  4. Carica l'immagine su Amazon ECR:

    docker push $SOURCE_ACCOUNT_ID.dkr.ecr.$SOURCE_REGION.amazonaws.com/ecr-copy-lambda:latest
  5. Memorizza l'URI dell'immagine per un uso successivo:

    export LAMBDA_IMAGE_URI="$SOURCE_ACCOUNT_ID.dkr.ecr.$SOURCE_REGION.amazonaws.com/ecr-copy-lambda:latest" echo "Lambda Image URI: $LAMBDA_IMAGE_URI"
Ingegnere dei dati, ingegnere ML, DevOps ingegnere

Verifica l'immagine.

  1. Elenca le immagini nel repository:

    aws ecr list-images \ --repository-name ecr-copy-lambda \ --profile source-account \ --region $SOURCE_REGION
  2. Ottieni i dettagli dell'immagine:

    aws ecr describe-images \ --repository-name ecr-copy-lambda \ --profile source-account \ --region $SOURCE_REGION
Ingegnere dei dati, ingegnere ML, DevOps ingegnere
OperazioneDescriptionCompetenze richieste

Preparare i parametri di distribuzione.

  1. Imposta l'e-mail di notifica:

    export NOTIFICATION_EMAIL="your-email@company.com"
  2. Definisci i repository da copiare (separati da virgole):

    export REPOSITORY_LIST="app-frontend,app-backend,database-migrations"
  3. Imposta l'ambiente:

    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"
Ingegnere dei dati, DevOps ingegnere, ingegnere ML

Convalida il modello sorgente.

Convalida il modello sorgente: CloudFormation

aws cloudformation validate-template \ --template-body file://"Source Account Cf template.yml" \ --profile source-account
Ingegnere dei dati, ingegnere ML, DevOps ingegnere

Implementa l'infrastruttura di origine.

  1. Implementa lo stack di account di origine:

    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
  2. Attendi il completamento dello stack (questa operazione potrebbe richiedere fino a 10 minuti):

    aws cloudformation wait stack-create-complete \ --stack-name ecr-copy-source \ --profile source-account \ --region $SOURCE_REGION
Ingegnere dei dati, ingegnere ML, DevOps ingegnere

Verifica l'implementazione e raccogli gli output.

  1. Ottieni gli output dello stack:

    aws cloudformation describe-stacks \ --stack-name ecr-copy-source \ --profile source-account \ --region $SOURCE_REGION \ --query 'Stacks[0].Outputs' \ --output table
  2. Memorizza Amazon Resource Names (ARNs) per la macchina a stati e l'argomento 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 ingegnere, ingegnere ML, ingegnere dati

Conferma la tua iscrizione via e-mail.

  1. Controlla la tua e-mail per la conferma dell'abbonamento a SNS.

  2. Scegli il link di conferma nell'e-mail.

  3. Verifica lo stato dell'abbonamento.

    aws sns list-subscriptions-by-topic \ --topic-arn $SNS_TOPIC_ARN \ --profile source-account \ --region $SOURCE_REGION
Ingegnere dei dati, ingegnere ML, DevOps ingegnere
OperazioneDescriptionCompetenze richieste

Esegui e monitora il processo di copia.

  1. Accedi a e apri la console Step Functions. Console di gestione AWS

  2. Individua la macchina a stati.

  3. Selezionare Start execution (Avvia esecuzione).

    Al termine, i risultati vengono visualizzati nella scheda Esecuzione input e output.

  4. (Facoltativo) Se vuoi continuare a eseguire Step Functions utilizzando il AWS CLI, segui i passaggi rimanenti di questa epopea.

DevOps ingegnere, ingegnere ML, ingegnere dati

Esegui la funzione step.

  1. Genera un nome univoco:

    export EXECUTION_NAME="ecr-copy-$(date +%Y%m%d-%H%M%S)"
  2. Esegui la funzione 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 ingegnere, ingegnere ML, ingegnere dati

Monitora i progressi.

  1. Controlla lo stato:

    aws stepfunctions describe-execution \ --execution-arn $EXECUTION_ARN \ --profile source-account \ --region $SOURCE_REGION \ --query '{Status:status,StartDate:startDate,StopDate:stopDate}' \ --output table
  2. Ottieni la cronologia:

    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 ingegnere, ingegnere ML, ingegnere dati

Controlla i risultati.

Attendi il completamento del processo (aggiornato ogni 30 secondi):

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 ingegnere, ingegnere ML, ingegnere dati

Verifica le immagini.

  1. Elenca i repository nell'account di destinazione:

    aws ecr describe-repositories \ --profile destination-account \ --region $DEST_REGION \ --query 'repositories[].repositoryName' \ --output table
  2. Controlla le immagini del repository:

    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 ingegnere, ingegnere dei dati, ingegnere ML

risoluzione dei problemi

ProblemaSoluzione

Le funzioni Step non vengono eseguite.

  1. Per recuperare gli eventi di errore dettagliati dalla cronologia, esegui il AWS CLI comando seguente:

    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
  2. Per recuperare i log delle funzioni Lambda non riuscite, esegui il seguente 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

Risorse correlate

Informazioni aggiuntive

Parametri di configurazione

Parametro

Description

Esempio

SourceAccountId

Account AWS ID di origine

11111111111

DestinationAccountId

Account AWS ID di destinazione

22222222222

DestinationRegion

Obiettivo Regione AWS

us-east-2

SourceRegion

Fonte Regione AWS

us-east-1

NotificationEmail

Email per le notifiche

abc@xyz.com

RepositoryList

Archivi da copiare

repo1,repo2,repo3

LambdaImageUri

URI dell'immagine del contenitore Lambda

${ACCOUNT}.dkr.ecr.${REGION}.amazonaws.com/ecr-copy-lambda:latest