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
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
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
| Operazione | Description | Competenze richieste |
|---|
Configura AWS CLI i profili. | Configura il profilo dell'account di origine: aws configure --profile source-account
# Enter: Access Key ID, Secret Access Key, Default region, Output format (json)
Configura il profilo dell'account di destinazione: aws configure --profile destination-account
# Enter: Access Key ID, Secret Access Key, Default region, Output format (json)
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. | 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"
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"
Imposta il Regioni AWS. Modifica questo comando per la tua regione: export SOURCE_REGION="us-east-1"
export DEST_REGION="us-east-2"
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 |
| Operazione | Description | Competenze 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. | 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
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. | 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
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 |
| Operazione | Description | Competenze richieste |
|---|
Prepara la costruzione del contenitore. | Verifica che Docker sia in esecuzione: docker --version
docker info
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. | Crea l'immagine del contenitore Lambda: docker build -t ecr-copy-lambda . --no-cache
Verifica che l'immagine sia stata creata: docker images ecr-copy-lambda
(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. | Crea un repository Amazon ECR nell'account di origine: aws ecr create-repository \
--repository-name ecr-copy-lambda \
--profile source-account \
--region $SOURCE_REGION
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
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
Carica l'immagine su Amazon ECR: docker push $SOURCE_ACCOUNT_ID.dkr.ecr.$SOURCE_REGION.amazonaws.com/ecr-copy-lambda:latest
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. | Elenca le immagini nel repository: aws ecr list-images \
--repository-name ecr-copy-lambda \
--profile source-account \
--region $SOURCE_REGION
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 |
| Operazione | Description | Competenze richieste |
|---|
Preparare i parametri di distribuzione. | Imposta l'e-mail di notifica: export NOTIFICATION_EMAIL="your-email@company.com"
Definisci i repository da copiare (separati da virgole): export REPOSITORY_LIST="app-frontend,app-backend,database-migrations"
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. | 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
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. | 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
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. | Controlla la tua e-mail per la conferma dell'abbonamento a SNS. Scegli il link di conferma nell'e-mail. 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 |
| Operazione | Description | Competenze richieste |
|---|
Esegui e monitora il processo di copia. | Accedi a e apri la console Step Functions. Console di gestione AWS Individua la macchina a stati. Selezionare Start execution (Avvia esecuzione). Al termine, i risultati vengono visualizzati nella scheda Esecuzione input e output. (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. | Genera un nome univoco: export EXECUTION_NAME="ecr-copy-$(date +%Y%m%d-%H%M%S)"
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. | 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
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. | Elenca i repository nell'account di destinazione: aws ecr describe-repositories \
--profile destination-account \
--region $DEST_REGION \
--query 'repositories[].repositoryName' \
--output table
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
| Problema | Soluzione |
|---|
Le funzioni Step non vengono eseguite. | 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
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
|