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
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
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
| Aufgabe | Description | Erforderliche Fähigkeiten |
|---|
AWS CLI Profile konfigurieren. | Konfigurieren Sie das Quellkontoprofil: aws configure --profile source-account
# Enter: Access Key ID, Secret Access Key, Default region, Output format (json)
Konfigurieren Sie das Zielkontoprofil: aws configure --profile destination-account
# Enter: Access Key ID, Secret Access Key, Default region, Output format (json)
Ü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. | 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"
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"
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"
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 |
| Aufgabe | Description | Erforderliche 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. | 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
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. | 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
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 |
| Aufgabe | Description | Erforderliche Fähigkeiten |
|---|
Bereiten Sie den Container-Build vor. | Stellen Sie sicher, dass Docker läuft: docker --version
docker info
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. | Erstellen Sie das Lambda-Container-Image: docker build -t ecr-copy-lambda . --no-cache
Stellen Sie sicher, dass das Image erstellt wurde: docker images ecr-copy-lambda
(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. | Erstellen Sie ein Amazon ECR-Repository im Quellkonto: aws ecr create-repository \
--repository-name ecr-copy-lambda \
--profile source-account \
--region $SOURCE_REGION
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
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
Laden Sie das Bild auf Amazon ECR hoch: docker push $SOURCE_ACCOUNT_ID.dkr.ecr.$SOURCE_REGION.amazonaws.com/ecr-copy-lambda:latest
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. | Listet die Bilder im Repository auf: aws ecr list-images \
--repository-name ecr-copy-lambda \
--profile source-account \
--region $SOURCE_REGION
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 |
| Aufgabe | Description | Erforderliche Fähigkeiten |
|---|
Bereiten Sie die Bereitstellungsparameter vor. | Richten Sie die Benachrichtigungs-E-Mail ein: export NOTIFICATION_EMAIL="your-email@company.com"
Definieren Sie die zu kopierenden Repositorys (durch Kommas getrennt): export REPOSITORY_LIST="app-frontend,app-backend,database-migrations"
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. | 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
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. | 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
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. | Überprüfen Sie Ihre E-Mail auf die Bestätigung Ihres SNS-Abonnements. Wählen Sie den Bestätigungslink in der E-Mail. Ü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 |
| Aufgabe | Description | Erforderliche Fähigkeiten |
|---|
Führen Sie den Kopiervorgang aus und überwachen Sie ihn. | Melden Sie sich bei der AWS-Managementkonsole an und öffnen Sie die Step Functions Functions-Konsole. Suchen Sie die Zustandsmaschine. 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. (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. | Generieren Sie einen eindeutigen Namen: export EXECUTION_NAME="ecr-copy-$(date +%Y%m%d-%H%M%S)"
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. | Ü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
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. | Listet die Repositorys im Zielkonto auf: aws ecr describe-repositories \
--profile destination-account \
--region $DEST_REGION \
--query 'repositories[].repositoryName' \
--output table
Ü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
| Problem | Lösung |
|---|
Step-Funktionen können nicht ausgeführt werden. | 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
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
|