Kopieren Sie Amazon ECR-Container-Images zwischen und AWS-Konten AWS-Regionen - AWS Prescriptive Guidance

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Kopieren Sie Amazon ECR-Container-Images zwischen und AWS-Konten AWS-Regionen

Faisal Shahdad, Amazon Web Services

Zusammenfassung

Dieses Muster zeigt Ihnen, wie Sie einen serverlosen Ansatz verwenden, um markierte Bilder aus vorhandenen Amazon Elastic Container Registry (Amazon ECR) -Repositorys in andere und zu replizieren. AWS-Konten AWS-Regionen Die Lösung verwaltet AWS Step Functions den Replikationsablauf und bietet AWS Lambda Funktionen zum Kopieren großer Container-Images.

Amazon ECR verwendet native regionsübergreifende und kontoübergreifende Replikationsfunktionen, die Container-Images über Regionen und Konten hinweg replizieren. Diese Funktionen replizieren Bilder jedoch erst ab dem Moment, in dem die Replikation aktiviert ist. Es gibt keinen Mechanismus, um vorhandene Images in verschiedenen Regionen und Konten zu replizieren.

Dieses Muster hilft Teams für künstliche Intelligenz (KI), containerisierte Modelle für maschinelles Lernen (ML), Frameworks (z. B., PyTorch TensorFlow, und Hugging Face) und Abhängigkeiten an andere Konten und Regionen zu verteilen. Dies kann Ihnen helfen, Servicebeschränkungen zu überwinden und GPU-Rechenressourcen zu optimieren. Sie können Amazon ECR-Repositorys auch selektiv von bestimmten Quellkonten und Regionen replizieren. Weitere Informationen finden Sie unter Regionsübergreifende Replikation in Amazon ECR ist gelandet.

Voraussetzungen und Einschränkungen

Voraussetzungen

  • Zwei oder mehr aktive Konten AWS-Konten (mindestens ein Quellkonto und ein Zielkonto)

  • Entsprechende AWS Identity and Access Management (IAM-) Berechtigungen in allen Konten

  • Docker zum Erstellen des Lambda-Container-Images

  • AWS Command Line Interface (AWS CLI) für alle Konten konfiguriert

Einschränkungen

  • Ausschluss von Bildern ohne Tags — Die Lösung kopiert nur Container-Images mit expliziten Tags. Bilder ohne Tags, die mit Digests existieren, werden übersprungen. SHA256

  • Einschränkungen des Lambda-Ausführungstimeouts — AWS Lambda ist auf ein maximales Ausführungstimeout von 15 Minuten begrenzt, das möglicherweise nicht ausreicht, um große Container-Images oder Repositorys zu kopieren.

  • Manuelles Container-Image-Management — Für den crane-app.py Python-Code muss das Lambda-Container-Image neu erstellt und bereitgestellt werden.

  • Begrenzte Kapazität für die parallel Verarbeitung — Die MaxConcurrency Statuseinstellung begrenzt, wie viele Repositorys Sie gleichzeitig kopieren können. Sie können diese Einstellung jedoch in der AWS CloudFormation Vorlage des Quellkontos ändern. Beachten Sie, dass höhere Parallelitätswerte dazu führen können, dass Sie die Serviceratenlimits und Lambda-Ausführungskontingente auf Kontoebene überschreiten.

Architektur

Zielstapel

Das Muster besteht aus vier Hauptkomponenten:

  • Infrastruktur des Quellkontos — CloudFormation Vorlage, die die Orchestrierungskomponenten erstellt

  • Infrastruktur des Zielkontos — CloudFormation Vorlage, die kontenübergreifende Zugriffsrollen erstellt

  • Lambda-Funktion — Python-basierte Funktion, die Crane für effizientes Kopieren von Bildern verwendet

  • Container-Image — Docker-Container, der die Lambda-Funktion mit den erforderlichen Tools verpackt

Zielarchitektur

Arbeitsablauf für Step Functions

Die Step Functions Functions-Zustandsmaschine orchestriert Folgendes, wie in der folgenden Abbildung dargestellt:

  • PopulateRepositoryList Scannt Amazon ECR-Repositorys und füllt Amazon DynamoDB

  • GetRepositoryList Ruft eine eindeutige Repository-Liste von DynamoDB ab

  • DeduplicateRepositories Stellt sicher, dass keine doppelte Verarbeitung erfolgt

  • CopyRepositories— Verwaltet das parallel Kopieren von Repositorys

  • NotifySuccess/NotifyFailure Amazon Simple Notification Service (Amazon SNS) -Benachrichtigungen basierend auf dem Ausführungsergebnis

Tools

Amazon-Tools

  • Amazon CloudWatch hilft Ihnen dabei, die Kennzahlen Ihrer AWS Ressourcen und der Anwendungen, auf denen Sie laufen, AWS in Echtzeit zu überwachen.

  • Amazon DynamoDB ist ein vollständig verwalteter NoSQL-Datenbank-Service, der schnelle und planbare Leistung mit nahtloser Skalierbarkeit bereitstellt.

  • Amazon Simple Notification Service (Amazon SNS) unterstützt Sie bei der Koordination und Verwaltung des Nachrichtenaustauschs zwischen Herausgebern und Kunden, einschließlich Webservern und E-Mail-Adressen.

  • AWS Identity and Access Management (IAM) hilft Ihnen dabei, den Zugriff auf Ihre AWS Ressourcen sicher zu verwalten, indem kontrolliert wird, wer authentifiziert und autorisiert ist, diese zu verwenden.

  • AWS Lambda ist ein Datenverarbeitungsservice, mit dem Sie Code ausführen können, ohne dass Sie Server bereitstellen oder verwalten müssen. Es führt Ihren Code nur bei Bedarf aus und skaliert automatisch, sodass Sie nur für die tatsächlich genutzte Rechenzeit zahlen.

  • AWS Step Functionsist ein serverloser Orchestrierungsservice, mit dem Sie Lambda-Funktionen und andere Funktionen kombinieren können, um geschäftskritische Anwendungen AWS-Services zu erstellen.

Andere Tools

  • Crane ist ein Docker-Orchestrierungstool. Es ähnelt Docker Compose, bietet jedoch zusätzliche Funktionen.

  • Docker ist eine Reihe von Platform-as-a-Service (PaaS) -Produkten, die Virtualisierung auf Betriebssystemebene nutzen, um Software in Containern bereitzustellen.

Code-Repository

  • Der Code für dieses Muster ist im GitHub sample-ecr-copy Repository verfügbar. Sie können die CloudFormation Vorlage aus dem Repository verwenden, um die zugrunde liegenden Ressourcen zu erstellen.

Best Practices

Folgen Sie dem Prinzip der geringsten Rechte und gewähren Sie die für die Ausführung einer Aufgabe erforderlichen Mindestberechtigungen. Weitere Informationen finden Sie in der IAM-Dokumentation unter Gewährung der geringsten Rechte und bewährte Methoden zur Sicherheit.

Epen

AufgabeDescriptionErforderliche Fähigkeiten

AWS CLI Profile konfigurieren.

  1. Konfigurieren Sie das Quellkontoprofil:

    aws configure --profile source-account # Enter: Access Key ID, Secret Access Key, Default region, Output format (json)
  2. Konfigurieren Sie das Zielkontoprofil:

    aws configure --profile destination-account # Enter: Access Key ID, Secret Access Key, Default region, Output format (json)
  3. Überprüfen Sie die Konfigurationen:

    aws sts get-caller-identity --profile source-account aws sts get-caller-identity --profile destination-account
DevOps Ingenieur, Dateningenieur, ML-Ingenieur

Sammeln Sie die erforderlichen Informationen.

  1. Holen Sie sich die Quellkonto-ID:

    export SOURCE_ACCOUNT_ID=$(aws sts get-caller-identity --profile source-account --query Account --output text) echo "Source Account ID: $SOURCE_ACCOUNT_ID"
  2. Holen Sie sich die Zielkonto-ID:

    export DEST_ACCOUNT_ID=$(aws sts get-caller-identity --profile destination-account --query Account --output text) echo "Destination Account ID: $DEST_ACCOUNT_ID"
  3. Stellen Sie die ein AWS-Regionen. Ändern Sie diesen Befehl für Ihre Region:

    export SOURCE_REGION="us-east-1" export DEST_REGION="us-east-2"
  4. Listet die vorhandenen Amazon ECR-Repositorys im Quellkonto auf:

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

Klonen Sie das Repository

Klonen Sie das Repository des Patterns auf Ihre lokale Workstation:

git clone https://github.com/aws-samples/sample-ecr-copy
DevOps Ingenieur, Dateningenieur, ML-Ingenieur
AufgabeDescriptionErforderliche Fähigkeiten

Bestätigen Sie die Vorlage.

Validieren Sie die CloudFormation Vorlage:

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

Stellen Sie die Zielinfrastruktur bereit.

  1. Stellen Sie den Zielkontenstapel bereit:

    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. Warten Sie, bis der Stack abgeschlossen ist:

    aws cloudformation wait stack-create-complete \ --stack-name ecr-copy-destination \ --profile destination-account \ --region $DEST_REGION
Dateningenieur, ML-Ingenieur, DevOps Ingenieur

Überprüfen Sie die Bereitstellung.

  1. Holen Sie sich Stack-Ausgaben:

    aws cloudformation describe-stacks \ --stack-name ecr-copy-destination \ --profile destination-account \ --region $DEST_REGION \ --query 'Stacks[0].Outputs' \ --output table
  2. Speichern Sie die kontoübergreifende IAM-Rolle:

    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 Ingenieur, ML-Ingenieur, Dateningenieur
AufgabeDescriptionErforderliche Fähigkeiten

Bereiten Sie den Container-Build vor.

  1. Stellen Sie sicher, dass Docker läuft:

    docker --version docker info
  2. Stellen Sie sicher, dass crane-app.py und Dockerfile sich im aktuellen Verzeichnis befinden:

    ls -la crane-app.py Dockerfile
Dateningenieur, ML-Ingenieur, DevOps Ingenieur

Erstellen Sie das Container-Image.

  1. Erstellen Sie das Lambda-Container-Image:

    docker build -t ecr-copy-lambda . --no-cache
  2. Stellen Sie sicher, dass das Image erstellt wurde:

    docker images ecr-copy-lambda
  3. (Optional) Testen Sie den Container lokal:

    docker run --rm --entrypoint python ecr-copy-lambda -c "import boto3; print('Container working')"
Dateningenieur, ML-Ingenieur, DevOps Ingenieur

Erstellen Sie ein Repository und laden Sie das Bild hoch.

  1. Erstellen Sie ein Amazon ECR-Repository im Quellkonto:

    aws ecr create-repository \ --repository-name ecr-copy-lambda \ --profile source-account \ --region $SOURCE_REGION
  2. Holen Sie sich ein Amazon ECR-Login-Token und authentifizieren Sie 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. Taggen Sie das Bild für Amazon ECR:

    docker tag ecr-copy-lambda:latest \ $SOURCE_ACCOUNT_ID.dkr.ecr.$SOURCE_REGION.amazonaws.com/ecr-copy-lambda:latest
  4. Laden Sie das Bild auf Amazon ECR hoch:

    docker push $SOURCE_ACCOUNT_ID.dkr.ecr.$SOURCE_REGION.amazonaws.com/ecr-copy-lambda:latest
  5. Speichern Sie die Bild-URI für die spätere Verwendung:

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

Überprüfen Sie das Bild.

  1. Listet die Bilder im Repository auf:

    aws ecr list-images \ --repository-name ecr-copy-lambda \ --profile source-account \ --region $SOURCE_REGION
  2. Holen Sie sich die Bilddetails:

    aws ecr describe-images \ --repository-name ecr-copy-lambda \ --profile source-account \ --region $SOURCE_REGION
Dateningenieur, ML-Ingenieur, DevOps Ingenieur
AufgabeDescriptionErforderliche Fähigkeiten

Bereiten Sie die Bereitstellungsparameter vor.

  1. Richten Sie die Benachrichtigungs-E-Mail ein:

    export NOTIFICATION_EMAIL="your-email@company.com"
  2. Definieren Sie die zu kopierenden Repositorys (durch Kommas getrennt):

    export REPOSITORY_LIST="app-frontend,app-backend,database-migrations"
  3. Stellen Sie die Umgebung ein:

    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"
Dateningenieur, DevOps Ingenieur, ML-Ingenieur

Überprüfen Sie die Quellvorlage.

Validieren Sie die CloudFormation Quellvorlage:

aws cloudformation validate-template \ --template-body file://"Source Account Cf template.yml" \ --profile source-account
Dateningenieur, ML-Ingenieur, DevOps Ingenieur

Stellen Sie die Quellinfrastruktur bereit.

  1. Stellen Sie den Quellkontenstapel bereit:

    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. Warten Sie, bis der Stack abgeschlossen ist (dies kann bis zu 10 Minuten dauern):

    aws cloudformation wait stack-create-complete \ --stack-name ecr-copy-source \ --profile source-account \ --region $SOURCE_REGION
Dateningenieur, ML-Ingenieur, DevOps Ingenieur

Überprüfen Sie die Bereitstellung und sammeln Sie die Ergebnisse.

  1. Holen Sie sich die Stack-Ausgaben:

    aws cloudformation describe-stacks \ --stack-name ecr-copy-source \ --profile source-account \ --region $SOURCE_REGION \ --query 'Stacks[0].Outputs' \ --output table
  2. Speichern Sie die Amazon-Ressourcennamen (ARNs) für den Zustandsmaschine und das SNS-Thema:

    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 Ingenieur, ML-Ingenieur, Dateningenieur

Bestätigen Sie Ihr E-Mail-Abonnement.

  1. Überprüfen Sie Ihre E-Mail auf die Bestätigung Ihres SNS-Abonnements.

  2. Wählen Sie den Bestätigungslink in der E-Mail.

  3. Überprüfen Sie den Abonnementstatus.

    aws sns list-subscriptions-by-topic \ --topic-arn $SNS_TOPIC_ARN \ --profile source-account \ --region $SOURCE_REGION
Dateningenieur, ML-Ingenieur, DevOps Ingenieur
AufgabeDescriptionErforderliche Fähigkeiten

Führen Sie den Kopiervorgang aus und überwachen Sie ihn.

  1. Melden Sie sich bei der AWS-Managementkonsole an und öffnen Sie die Step Functions Functions-Konsole.

  2. Suchen Sie die Zustandsmaschine.

  3. Wählen Sie Start execution (Ausführung starten) aus.

    Wenn der Vorgang abgeschlossen ist, werden die Ergebnisse auf der Registerkarte Eingabe und Ausgabe der Ausführung angezeigt.

  4. (Optional) Wenn Sie Step Functions weiterhin mit dem ausführen möchten AWS CLI, folgen Sie den verbleibenden Schritten in diesem Epos.

DevOps Ingenieur, ML-Ingenieur, Dateningenieur

Führen Sie die Step-Funktion aus.

  1. Generieren Sie einen eindeutigen Namen:

    export EXECUTION_NAME="ecr-copy-$(date +%Y%m%d-%H%M%S)"
  2. Führen Sie die Schrittfunktion aus.

    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 Ingenieur, ML-Ingenieur, Dateningenieur

Überwachen Sie den Fortschritt.

  1. Überprüfen Sie den Status:

    aws stepfunctions describe-execution \ --execution-arn $EXECUTION_ARN \ --profile source-account \ --region $SOURCE_REGION \ --query '{Status:status,StartDate:startDate,StopDate:stopDate}' \ --output table
  2. Holen Sie sich den Verlauf:

    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 Ingenieur, ML-Ingenieur, Dateningenieur

Überprüfen Sie die Ergebnisse.

Warten Sie, bis der Vorgang abgeschlossen ist (wird alle 30 Sekunden aktualisiert):

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 Ingenieur, ML-Ingenieur, Dateningenieur

Überprüfen Sie die Bilder.

  1. Listet die Repositorys im Zielkonto auf:

    aws ecr describe-repositories \ --profile destination-account \ --region $DEST_REGION \ --query 'repositories[].repositoryName' \ --output table
  2. Überprüfen Sie die Repository-Bilder:

    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 Ingenieur, Dateningenieur, ML-Ingenieur

Fehlerbehebung

ProblemLösung

Step-Funktionen können nicht ausgeführt werden.

  1. Führen Sie den folgenden AWS CLI Befehl aus, um detaillierte Fehlerereignisse aus dem Verlauf abzurufen:

    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. Führen Sie den folgenden AWS CLI Befehl aus, um Protokolle für fehlgeschlagene Lambda-Funktionen abzurufen:

    # 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

Zugehörige Ressourcen

Zusätzliche Informationen

Konfigurationsparameter

Parameter

Description

Beispiel

SourceAccountId

AWS-Konto Quell-ID

11111111111

DestinationAccountId

AWS-Konto Ziel-ID

22222222222

DestinationRegion

Ziel AWS-Region

us-east-2

SourceRegion

Quelle AWS-Region

us-east-1

NotificationEmail

E-Mail für Benachrichtigungen

abc@xyz.com

RepositoryList

Zu kopierende Repositorien

repo1,repo2,repo3

LambdaImageUri

Lambda-Container-Image-URI

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