Replizieren Sie gefilterte Amazon ECR-Container-Images über Konten oder Regionen hinweg - 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.

Replizieren Sie gefilterte Amazon ECR-Container-Images über Konten oder Regionen hinweg

Erstellt von Abdal Garuba (AWS)

Umgebung: Produktion

Technologien: Container und Mikroservices; DevOps

AWS-Services: Amazon EC2 Container Registry; Amazon CloudWatch; AWS CodeBuild; AWS Identity and Access Management; AWS CLI

Übersicht

Amazon Elastic Container Registry (Amazon ECR) kann alle Container-Images in einem Image-Repository über Amazon Web Services (AWS) -Regionen und AWS-Konten nativ replizieren, indem die Funktionen für die regionsübergreifende und kontoübergreifende Replikation verwendet werden. (Weitere Informationen finden Sie im AWS-Blogbeitrag Regionsübergreifende Replikation in Amazon ECR ist gelandet.) Es gibt jedoch keine Möglichkeit, die Bilder, die zwischen AWS-Regionen oder Konten kopiert werden, anhand von Kriterien zu filtern. 

Dieses Muster beschreibt, wie Container-Images, die in Amazon ECR gespeichert sind, auf der Grundlage von Image-Tag-Mustern über AWS-Konten und Regionen hinweg repliziert werden. Das Muster verwendet Amazon CloudWatch Events, um auf Push-Ereignisse für Bilder zu warten, die über ein vordefiniertes, benutzerdefiniertes Tag verfügen. Ein Push-Ereignis startet ein CodeBuild AWS-Projekt und übergibt die Bilddetails an dieses Projekt. Das CodeBuild Projekt kopiert die Bilder auf der Grundlage der bereitgestellten Details aus der Amazon ECR-Quellregistrierung in die Zielregistrierung.

Dieses Muster kopiert Bilder, die bestimmte Tags haben, kontenübergreifend. Sie können dieses Muster beispielsweise verwenden, um nur produktionsbereite, sichere Images auf das AWS-Produktionskonto zu kopieren. Im Entwicklungskonto können Sie, nachdem die Bilder gründlich getestet wurden, den sicheren Images ein vordefiniertes Tag hinzufügen und die markierten Bilder mithilfe der Schritte in diesem Muster in das Produktionskonto kopieren.

Voraussetzungen und Einschränkungen

Voraussetzungen

  • Ein aktives AWS-Konto für Amazon ECR-Quell- und Zielregister

  • Administratorberechtigungen für die in diesem Muster verwendeten Tools

  • Docker wurde zum Testen auf Ihrem lokalen Computer installiert

  • AWS-Befehlszeilenschnittstelle (AWS CLI) für die Authentifizierung bei Amazon ECR

Einschränkungen

  • Dieses Muster überwacht die Push-Ereignisse der Quellregistrierung nur in einer AWS-Region. Sie können dieses Muster in anderen Regionen bereitstellen, um Registrierungen in diesen Regionen zu überwachen.

  • In diesem Muster wartet eine Amazon CloudWatch Events-Regel auf ein einzelnes Bild-Tag-Muster. Wenn Sie nach mehreren Mustern suchen möchten, können Sie Ereignisse hinzufügen, um auf zusätzliche Bild-Tag-Muster zu warten.

Architektur

Zielarchitektur

Architektur für die Replikation gefilterter Amazon ECR-Container-Images über Konten und Regionen hinweg.

Automatisierung und Skalierung

Dieses Muster kann mit einem Infrastructure-as-Code-Skript (IaC) automatisiert und in großem Umfang eingesetzt werden. Um dieses Muster mithilfe von CloudFormation AWS-Vorlagen bereitzustellen, laden Sie den Anhang herunter und folgen Sie den Anweisungen im Abschnitt Zusätzliche Informationen.

Sie können mehrere Amazon CloudWatch Events-Ereignisse (mit unterschiedlichen benutzerdefinierten Ereignismustern) auf dasselbe CodeBuild AWS-Projekt verweisen, um mehrere Image-Tag-Muster zu replizieren. Sie müssen jedoch die sekundäre Validierung in der buildspec.yaml Datei (die im Anhang und im Abschnitt Tools enthalten ist) wie folgt aktualisieren, um mehrere Muster zu unterstützen.

... if [[ ${IMAGE_TAG} != release-* ]]; then ...

Tools

Amazon-Dienste

  • IAM — Mit AWS Identity and Access Management (IAM) können Sie den Zugriff auf AWS-Services und -Ressourcen sicher verwalten. In diesem Muster müssten Sie die kontoübergreifende IAM-Rolle erstellen, die AWS beim Push von Container-Images in die Zielregistrierung CodeBuild übernimmt.

  • Amazon ECR — Amazon Elastic Container Registry (Amazon ECR) ist eine vollständig verwaltete Container-Registry, die es einfach macht, Ihre Container-Images und Artefakte überall zu speichern, zu verwalten, zu teilen und bereitzustellen. Image-Push-Aktionen an die Quellregistrierung senden Systemereignisdetails an den Event-Bus, der von Amazon CloudWatch Events abgeholt wird.

  • AWS CodeBuild — AWS CodeBuild ist ein vollständig verwalteter Continuous-Integration-Service, der Rechenleistung für Aufgaben wie das Kompilieren von Quellcode, das Ausführen von Tests und das Erstellen von Artefakten bereitstellt, die sofort einsatzbereit sind. Dieses Muster verwendet AWS CodeBuild , um den Kopiervorgang von der Amazon ECR-Quellregistrierung in die Zielregistrierung durchzuführen.

  • CloudWatch Ereignisse — Amazon CloudWatch Events liefert einen Stream von Systemereignissen, die Änderungen an AWS-Ressourcen beschreiben. Dieses Muster verwendet Regeln, um Amazon ECR-Push-Aktionen einem bestimmten Image-Tag-Muster zuzuordnen.

Tools

  • Docker CLI — Docker ist ein Tool, das das Erstellen und Verwalten von Containern erleichtert. Container packen eine Anwendung und all ihre Abhängigkeiten in einer Einheit oder einem Paket, das problemlos auf jeder Plattform bereitgestellt werden kann, die die Container-Laufzeit unterstützt.

Code

Sie können dieses Muster auf zwei Arten implementieren:

  • Automatisierte Einrichtung: Stellen Sie die beiden CloudFormation AWS-Vorlagen bereit, die im Anhang enthalten sind. Anweisungen finden Sie im Abschnitt Zusätzliche Informationen.

  • Manuelle Einrichtung: Folge den Schritten im Abschnitt Epics

Beispiel für buildspec.yaml

Wenn Sie die CloudFormation Vorlagen verwenden, die mit diesem Muster bereitgestellt werden, ist die buildspec.yaml Datei in den Ressourcen enthalten. CodeBuild

version: 0.2 env: shell: bash phases: install: commands: - export CURRENT_ACCOUNT=$(echo ${CODEBUILD_BUILD_ARN} | cut -d':' -f5) - export CURRENT_ECR_REGISTRY=${CURRENT_ACCOUNT}.dkr.ecr.${AWS_REGION}.amazonaws.com - export DESTINATION_ECR_REGISTRY=${DESTINATION_ACCOUNT}.dkr.ecr.${DESTINATION_REGION}.amazonaws.com pre_build: on-failure: ABORT commands: - echo "Validating Image Tag ${IMAGE_TAG}" - | if [[ ${IMAGE_TAG} != release-* ]]; then aws codebuild stop-build --id ${CODEBUILD_BUILD_ID} sleep 60 exit 1 fi - aws ecr get-login-password --region ${AWS_REGION} | docker login -u AWS --password-stdin ${CURRENT_ECR_REGISTRY} - docker pull ${CURRENT_ECR_REGISTRY}/${REPO_NAME}:${IMAGE_TAG} build: commands: - echo "Assume cross-account role" - CREDENTIALS=$(aws sts assume-role --role-arn ${CROSS_ACCOUNT_ROLE_ARN} --role-session-name Rolesession) - export AWS_DEFAULT_REGION=${DESTINATON_REGION} - export AWS_ACCESS_KEY_ID=$(echo ${CREDENTIALS} | jq -r '.Credentials.AccessKeyId') - export AWS_SECRET_ACCESS_KEY=$(echo ${CREDENTIALS} | jq -r '.Credentials.SecretAccessKey') - export AWS_SESSION_TOKEN=$(echo ${CREDENTIALS} | jq -r '.Credentials.SessionToken') - echo "Logging into cross-account registry" - aws ecr get-login-password --region ${DESTINATION_REGION} | docker login -u AWS --password-stdin ${DESTINATION_ECR_REGISTRY} - echo "Check if Destination Repository exists, else create" - | aws ecr describe-repositories --repository-names ${REPO_NAME} --region ${DESTINATION_REGION} \ || aws ecr create-repository --repository-name ${REPO_NAME} --region ${DESTINATION_REGION} - echo "retag image and push to destination" - docker tag ${CURRENT_ECR_REGISTRY}/${REPO_NAME}:${IMAGE_TAG} ${DESTINATION_ECR_REGISTRY}/${REPO_NAME}:${IMAGE_TAG} - docker push ${DESTINATION_ECR_REGISTRY}/${REPO_NAME}:${IMAGE_TAG}

Epen

AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie eine Rolle „ CloudWatch Ereignisse“.

Erstellen Sie im AWS-Quellkonto eine IAM-Rolle, die Amazon CloudWatch Events übernehmen soll. Die Rolle sollte über Berechtigungen zum Starten eines CodeBuild AWS-Projekts verfügen.

Folgen Sie den Anweisungen in der IAM-Dokumentation, um die Rolle mithilfe der AWS-CLI zu erstellen.

Beispiel für eine Vertrauensrichtlinie (trustpolicy.json): 

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": {"Service": "events.amazonaws.com"}, "Action": "sts:AssumeRole" } }

Beispiel für eine Berechtigungsrichtlinie (permissionpolicy.json):

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "codebuild:StartBuild", "Resource": "<CodeBuild Project ARN>" } }
AWS-Administrator DevOps, AWS, AWS-Systemadministrator, Cloud-Administrator, Cloud-Architekt, DevOps Ingenieur

Erstellen Sie eine CodeBuild Rolle.

Erstellen Sie eine IAM-Rolle, die AWS übernehmen CodeBuild soll, indem Sie den Anweisungen in der IAM-Dokumentation folgen. Die Rolle sollte über die folgenden Berechtigungen verfügen:

  • Erlaubnis, die kontoübergreifende Zielrolle zu übernehmen

  • Berechtigung zum Erstellen von Protokollgruppen und Protokollströmen sowie zum Speichern von Protokollereignissen

  • Schreibgeschützte Berechtigungen für alle Amazon ECR-Repositorys, indem Sie der Rolle die verwaltete AmazonEC2-Richtlinie ContainerRegistryReadOnly hinzufügen

  • Erlaubnis zum Beenden CodeBuild

Beispiel für eine Vertrauensrichtlinie (trustpolicy.json):

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "codebuild.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

Beispiel für eine Berechtigungsrichtlinie (permissionpolicy.json):

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "codebuild:StartBuild", "codebuild:StopBuild", "codebuild:Get*", "codebuild:List*", "codebuild:BatchGet*" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "*", "Effect": "Allow" }, { "Action": "sts:AssumeRole", "Resource": "<ARN of destination role>", "Effect": "Allow", "Sid": "AssumeCrossAccountArn" } ] }

Hängen Sie die verwaltete Richtlinie wie folgt AmazonEC2ContainerRegistryReadOnly an den CLI-Befehl an:

~$ aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly \ --role-name <name of CodeBuild Role>
AWS-Administrator DevOps, AWS, AWS-Systemadministrator, Cloud-Administrator, Cloud-Architekt, DevOps Ingenieur

Erstellen Sie eine kontoübergreifende Rolle.

Erstellen Sie im AWS-Zielkonto eine IAM-Rolle für die CodeBuild AWS-Rolle, die das Quellkonto übernehmen soll. Die kontoübergreifende Rolle sollte es Container-Images ermöglichen, ein neues Repository zu erstellen und Container-Images auf Amazon ECR hochzuladen.

Folgen Sie den Anweisungen in der IAM-Dokumentation, um die IAM-Rolle mithilfe der AWS-CLI zu erstellen. 

Verwenden Sie die folgende Vertrauensrichtlinie, um das CodeBuild AWS-Projekt aus dem vorherigen Schritt zuzulassen:

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": { "AWS": "<ARN of source codebuild role>" }, "Action": "sts:AssumeRole" } }

Verwenden Sie die folgende Berechtigungsrichtlinie, damit das CodeBuild AWS-Projekt aus dem vorherigen Schritt Bilder in der Zielregistrierung speichern kann:

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "ecr:GetDownloadUrlForLayer", "ecr:BatchCheckLayerAvailability", "ecr:PutImage", "ecr:InitiateLayerUpload", "ecr:UploadLayerPart", "ecr:CompleteLayerUpload", "ecr:GetRepositoryPolicy", "ecr:DescribeRepositories", "ecr:GetAuthorizationToken", "ecr:CreateRepository" ], "Resource": "*", "Effect": "Allow" } ] }
AWS-Administrator DevOps, AWS, Cloud-Administrator, Cloud-Architekt, DevOps Ingenieur, AWS-Systemadministrator
AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie ein CodeBuild Projekt.

Erstellen Sie ein CodeBuild AWS-Projekt im Quellkonto, indem Sie den Anweisungen in der CodeBuild AWS-Dokumentation folgen. Das Projekt sollte sich in derselben Region wie die Quellregistrierung befinden. 

Konfigurieren Sie das Projekt wie folgt:

  • Art der Umgebung: LINUX CONTAINER

  • Rolle im Dienst: CodeBuild Role

  • Privilegierter Modus: true

  • Umgebungsbild: aws/codebuild/standard:x.x (verwenden Sie das neueste verfügbare Image)

  • Umgebungsvariablen:

    • CROSS_ACCOUNT_ROLE_ARN: Der Amazon-Ressourcenname (ARN) der kontoübergreifenden Rolle

    • DESTINATION_REGION: Der Name der kontoübergreifenden Region

    • DESTINATION_ACCOUNT: Die Nummer des Zielkontos

  • Build-Spezifikationen: Verwenden Sie die buildspec.yaml Datei, die im Abschnitt Tools aufgeführt ist.

AWS-Administrator DevOps, AWS, AWS-Systemadministrator, Cloud-Administrator, Cloud-Architekt, DevOps Ingenieur
AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie eine Ereignisregel.

Da das Muster die Inhaltsfilterfunktion verwendet, müssen Sie das Ereignis mithilfe von Amazon erstellen EventBridge. Erstellen Sie das Ereignis und das Ziel, indem Sie den Anweisungen in der EventBridge Dokumentation folgen, mit einigen Änderungen:

  • Wählen Sie für Muster definieren die Option Ereignismuster und anschließend Benutzerdefiniertes Muster aus.

  • Kopieren Sie den folgenden Beispielcode für ein benutzerdefiniertes Ereignismuster in das dafür vorgesehene Textfeld:

    {   "source": ["aws.ecr"],   "detail-type": ["ECR Image Action"],   "detail": {     "action-type": ["PUSH"],     "result": ["SUCCESS"],     "image-tag": [{ "prefix": "release-"}]   } }
  • Wählen Sie für Select targets das CodeBuild AWS-Projekt aus und fügen Sie den ARN für das CodeBuild AWS-Projekt ein, das Sie im vorherigen Epic erstellt haben.

  • Wählen Sie für Configure Input die Option Input Transformer aus.

    • Fügen Sie in das Textfeld Eingabepfad Folgendes ein:

      {"IMAGE_TAG":"$.detail.image-tag","REPO_NAME":"$.detail.repository-name"}
    • Fügen Sie in das Textfeld Eingabevorlage Folgendes ein:

      {"environmentVariablesOverride": [ {"name": "IMAGE_TAG", "value":<IMAGE_TAG>},{"name":"REPO_NAME","value":<REPO_NAME>}]}
  • Wählen Sie „Bestehende Rolle verwenden“ und anschließend den Namen der Rolle „ CloudWatch Ereignisse“, die Sie zuvor im Epos „IAM-Rollen erstellen“ erstellt haben.

AWS-Administrator DevOps, AWS, AWS-Systemadministrator, Cloud-Administrator, Cloud-Architekt, DevOps Ingenieur
AufgabeBeschreibungErforderliche Fähigkeiten

Authentifizieren Sie sich mit Amazon ECR.

Authentifizieren Sie sich sowohl bei der Quell- als auch bei der Zielregistrierung, indem Sie die Schritte in der Amazon ECR-Dokumentation befolgen.

AWS-Administrator DevOps, AWS, AWS-Systemadministrator, Cloud-Administrator, DevOps Ingenieur, Cloud-Architekt

Testen Sie die Image-Replikation.

Übertragen Sie in Ihrem Quellkonto ein Container-Image in ein neues oder vorhandenes Amazon ECR-Quell-Repository mit einem Image-Tag als Präfix. release- Um das Bild zu übertragen, folgen Sie den Schritten in der Amazon ECR-Dokumentation

Sie können den Fortschritt des CodeBuild Projekts in der CodeBuild Konsole überwachen. 

Melden Sie sich nach erfolgreichem Abschluss des CodeBuild Projekts beim AWS-Zielkonto an, öffnen Sie die Amazon ECR-Konsole und vergewissern Sie sich, dass das Bild in der Amazon ECR-Zielregistrierung vorhanden ist.

AWS-Administrator DevOps, AWS, AWS-Systemadministrator, Cloud-Administrator, Cloud-Architekt, DevOps Ingenieur

Testen Sie den Image-Ausschluss.

Übertragen Sie in Ihrem Quellkonto ein Container-Image in ein neues oder vorhandenes Amazon ECR-Quell-Repository mit einem Image-Tag, das nicht über das benutzerdefinierte Präfix verfügt. 

Vergewissern Sie sich, dass das CodeBuild Projekt nicht gestartet wurde und dass keine Container-Images in der Zielregistrierung erscheinen.

AWS-Administrator DevOps, AWS, AWS-Systemadministrator, Cloud-Administrator, Cloud-Architekt, DevOps Ingenieur

Zugehörige Ressourcen

Zusätzliche Informationen

Gehen Sie folgendermaßen vor, um die Ressourcen für dieses Muster automatisch bereitzustellen:

  1. Laden Sie den Anhang herunter und extrahieren Sie die beiden CloudFormation Vorlagen: part-1-copy-tagged-images.yaml undpart-2-destination-account-role.yaml.

  2. Melden Sie sich bei der CloudFormation AWS-Konsole an und führen Sie die Bereitstellung part-1-copy-tagged-images.yaml in demselben AWS-Konto und derselben Region wie die Amazon ECR-Quellregistrierungen durch. Aktualisieren Sie die Parameter nach Bedarf. Die Vorlage stellt die folgenden Ressourcen bereit:

    • CloudWatch IAM-Rolle bei Amazon Events

    • CodeBuild IAM-Rolle des AWS-Projekts

    • CodeBuild AWS-Projekt

    • CloudWatch AWS-Ereignisregel

  3. Notieren Sie sich den Wert von SourceRoleName auf der Registerkarte Ausgaben. Sie benötigen diesen Wert im nächsten Schritt.

  4. Stellen Sie die zweite CloudFormation Vorlage in dem AWS-Konto bereit, part-2-destination-account-role.yaml in das Sie die Amazon ECR-Container-Images kopieren möchten. Aktualisieren Sie die Parameter nach Bedarf. Geben Sie für den SourceRoleName Parameter den Wert aus Schritt 3 an. Diese Vorlage stellt die kontoübergreifende IAM-Rolle bereit.

  5. Überprüfen Sie die Replikation und den Ausschluss von Images, wie im letzten Schritt des Abschnitts Epics beschrieben.

Anlagen

Um auf zusätzliche Inhalte zuzugreifen, die mit diesem Dokument verknüpft sind, entpacken Sie die folgende Datei: attachment.zip