Répliquez les images filtrées des conteneurs Amazon ECR sur plusieurs comptes ou régions - Recommandations AWS

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Répliquez les images filtrées des conteneurs Amazon ECR sur plusieurs comptes ou régions

Créée par Abdal Garuba (AWS)

Environnement : Production

Technologies : conteneurs et microservices ; DevOps

Services AWS : registre des conteneurs Amazon EC2 ; Amazon ; AWS CodeBuild ; CloudWatch AWS Identity and Access Management ; AWS CLI

Récapitulatif

Amazon Elastic Container Registry (Amazon ECR) peut répliquer toutes les images de conteneurs d'un référentiel d'images dans les régions Amazon Web Services (AWS) et les comptes AWS de manière native, en utilisant les fonctionnalités de réplication entre régions et entre comptes. (Pour plus d'informations, consultez le billet de blog AWS intitulé Cross region replication in Amazon ECR has landed.) Cependant, il n'existe aucun moyen de filtrer les images copiées entre les régions ou les comptes AWS en fonction de critères. 

Ce modèle décrit comment répliquer des images de conteneurs stockées dans Amazon ECR sur des comptes et des régions AWS, sur la base de modèles de balises d'image. Le modèle utilise Amazon CloudWatch Events pour écouter les événements push relatifs aux images dotées d'une balise personnalisée prédéfinie. Un événement push démarre un CodeBuild projet AWS et lui transmet les détails de l'image. Le CodeBuild projet copie les images du registre Amazon ECR source vers le registre de destination en fonction des informations fournies.

Ce modèle copie les images dotées de balises spécifiques sur tous les comptes. Par exemple, vous pouvez utiliser ce modèle pour copier uniquement des images sécurisées prêtes à être produites sur le compte AWS de production. Dans le compte de développement, une fois les images testées de manière approfondie, vous pouvez ajouter une balise prédéfinie aux images sécurisées et suivre les étapes de ce modèle pour copier les images marquées sur le compte de production.

Conditions préalables et limitations

Prérequis

  • Un compte AWS actif pour les registres Amazon ECR source et de destination

  • Autorisations administratives pour les outils utilisés dans ce modèle

  • Docker installé sur votre machine locale à des fins de test

  • AWS Command Line Interface (AWS CLI), pour l'authentification auprès d'Amazon ECR

Limites

  • Ce modèle surveille les événements push du registre source dans une seule région AWS. Vous pouvez déployer ce modèle dans d'autres régions pour surveiller les registres de ces régions.

  • Dans ce modèle, une règle Amazon CloudWatch Events écoute un seul modèle de balise d'image. Si vous souhaitez vérifier la présence de plusieurs modèles, vous pouvez ajouter des événements afin de détecter d'autres modèles de balises d'image.

Architecture

Architecture cible

Architecture permettant de répliquer les images de conteneurs Amazon ECR filtrées entre les comptes et les régions.

Automatisation et mise à l'échelle

Ce modèle peut être automatisé à l'aide d'un script d'infrastructure en tant que code (IaC) et déployé à grande échelle. Pour utiliser des CloudFormation modèles AWS afin de déployer ce modèle, téléchargez la pièce jointe et suivez les instructions de la section Informations supplémentaires.

Vous pouvez rediriger plusieurs CloudWatch événements Amazon Events (avec différents modèles d'événements personnalisés) vers le même CodeBuild projet AWS afin de répliquer plusieurs modèles de balises d'image, mais vous devrez mettre à jour la validation secondaire dans le buildspec.yaml fichier (qui est incluse dans la pièce jointe et dans la section Outils) comme suit pour prendre en charge plusieurs modèles.

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

Outils

Services Amazon

  • IAM — AWS Identity and Access Management (IAM) vous permet de gérer l'accès aux services et ressources AWS en toute sécurité. Dans ce modèle, vous devez créer le rôle IAM entre comptes qu'AWS CodeBuild assumera lors du transfert d'images de conteneurs vers le registre de destination.

  • Amazon ECR — Amazon Elastic Container Registry (Amazon ECR) est un registre de conteneurs entièrement géré qui facilite le stockage, la gestion, le partage et le déploiement de vos images et artefacts de conteneurs où que vous soyez. Les actions d'envoi d'images vers le registre source envoient les détails des événements du système au bus d'événements qui est récupéré par Amazon CloudWatch Events.

  • AWS CodeBuild — AWS CodeBuild est un service d'intégration continue entièrement géré qui fournit la puissance de calcul nécessaire pour effectuer des tâches telles que la compilation du code source, l'exécution de tests et la production d'artefacts prêts à être déployés. Ce modèle utilise AWS CodeBuild pour effectuer l'action de copie du registre Amazon ECR source vers le registre de destination.

  • CloudWatch Événements — Amazon CloudWatch Events fournit un flux d'événements système décrivant les modifications apportées aux ressources AWS. Ce modèle utilise des règles pour associer les actions push Amazon ECR à un modèle de balise d'image spécifique.

Outils

  • Docker CLI — Docker est un outil qui facilite la création et la gestion de conteneurs. Les conteneurs regroupent une application et toutes ses dépendances dans une unité ou un package qui peut être facilement déployé sur n'importe quelle plate-forme prenant en charge le runtime du conteneur.

Code

Vous pouvez implémenter ce modèle de deux manières :

  • Configuration automatisée : déployez les deux CloudFormation modèles AWS fournis dans la pièce jointe. Pour obtenir des instructions, consultez la section Informations supplémentaires.

  • Configuration manuelle : suivez les étapes de la section Epics

Exemple de buildspec.yaml

Si vous utilisez les CloudFormation modèles fournis avec ce modèle, le buildspec.yaml fichier est inclus dans les CodeBuild ressources.

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}

Épopées

TâcheDescriptionCompétences requises

Créez un rôle CloudWatch Events.

Dans le compte AWS source, créez un rôle IAM à assumer par Amazon CloudWatch Events. Le rôle doit être autorisé à démarrer un CodeBuild projet AWS.

Pour créer le rôle à l'aide de l'AWS CLI, suivez les instructions de la documentation IAM.

Exemple de politique de confiance (trustpolicy.json) : 

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

Exemple de politique d'autorisation (permissionpolicy.json) :

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "codebuild:StartBuild", "Resource": "<CodeBuild Project ARN>" } }
Administrateur AWS, AWS DevOps, administrateur système AWS, administrateur cloud, architecte cloud, DevOps ingénieur

Créez un CodeBuild rôle.

Créez un rôle IAM CodeBuild à assumer par AWS en suivant les instructions de la documentation IAM. Le rôle doit disposer des autorisations suivantes :

  • Autorisation d'assumer le rôle multicompte de destination

  • Autorisation de créer des groupes de journaux et des flux de journaux, et de mettre des événements de journal

  • Autorisations en lecture seule pour tous les référentiels Amazon ECR, en ajoutant la politique gérée AmazonEC2 ContainerRegistryReadOnly au rôle

  • Permission d'arrêter CodeBuild

Exemple de politique de confiance (trustpolicy.json) :

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

Exemple de politique d'autorisation (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" } ] }

Attachez la politique gérée AmazonEC2ContainerRegistryReadOnly à la commande CLI comme suit :

~$ aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly \ --role-name <name of CodeBuild Role>
Administrateur AWS, AWS DevOps, administrateur système AWS, administrateur cloud, architecte cloud, DevOps ingénieur

Créez un rôle multicompte.

Dans le compte AWS de destination, créez un rôle IAM pour le CodeBuild rôle AWS que le compte source doit assumer. Le rôle multi-comptes doit permettre aux images de conteneur de créer un nouveau référentiel et de télécharger des images de conteneur sur Amazon ECR.

Pour créer le rôle IAM à l'aide de l'AWS CLI, suivez les instructions de la documentation IAM

Pour autoriser le CodeBuild projet AWS de l'étape précédente, appliquez la politique de confiance suivante :

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

Pour autoriser le CodeBuild projet AWS de l'étape précédente à enregistrer des images dans le registre de destination, appliquez la politique d'autorisation suivante :

{ "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" } ] }
Administrateur AWS, AWS DevOps, administrateur cloud, architecte cloud, DevOps ingénieur, administrateur système AWS
TâcheDescriptionCompétences requises

Créez un CodeBuild projet.

Créez un CodeBuild projet AWS dans le compte source en suivant les instructions de la CodeBuild documentation AWS. Le projet doit se trouver dans la même région que le registre source. 

Configurez le projet comme suit :

  • Type d'environnement : LINUX CONTAINER

  • Rôle du service : CodeBuild Role

  • Mode privilégié : true

  • Image de l'environnement : aws/codebuild/standard:x.x (utilisez la dernière image disponible)

  • Variables d'environnement :

    • CROSS_ACCOUNT_ROLE_ARN: le nom de ressource Amazon (ARN) du rôle multicompte

    • DESTINATION_REGION: le nom de la région à comptes multiples

    • DESTINATION_ACCOUNT: le numéro du compte de destination

  • Spécifications de construction : utilisez le buildspec.yaml fichier répertorié dans la section Outils.

Administrateur AWS, AWS DevOps, administrateur système AWS, administrateur cloud, architecte cloud, DevOps ingénieur
TâcheDescriptionCompétences requises

Créez une règle d'événements.

Comme le modèle utilise la fonctionnalité de filtrage de contenu, vous devez créer l'événement à l'aide d'Amazon EventBridge. Créez l'événement et la cible en suivant les instructions de la EventBridge documentation, avec quelques modifications :

  • Pour Définir le modèle, choisissez Modèle d'événement, puis sélectionnez Modèle personnalisé.

  • Copiez l'exemple de code du modèle d'événements personnalisés suivant dans la zone de texte prévue à cet effet :

    {   "source": ["aws.ecr"],   "detail-type": ["ECR Image Action"],   "detail": {     "action-type": ["PUSH"],     "result": ["SUCCESS"],     "image-tag": [{ "prefix": "release-"}]   } }
  • Pour Select targets, choisissez le CodeBuild projet AWS et collez l'ARN du CodeBuild projet AWS que vous avez créé dans l'épopée précédente.

  • Pour Configurer l'entrée, choisissez Input Transformer.

    • Dans la zone de texte Chemin d'entrée, collez :

      {"IMAGE_TAG":"$.detail.image-tag","REPO_NAME":"$.detail.repository-name"}
    • Dans la zone de texte Modèle de saisie, collez :

      {"environmentVariablesOverride": [ {"name": "IMAGE_TAG", "value":<IMAGE_TAG>},{"name":"REPO_NAME","value":<REPO_NAME>}]}
  • Choisissez Utiliser le rôle existant, puis choisissez le nom du rôle CloudWatch Événements que vous avez créé précédemment dans l'épique Créer des rôles IAM.

Administrateur AWS, AWS DevOps, administrateur système AWS, administrateur cloud, architecte cloud, DevOps ingénieur
TâcheDescriptionCompétences requises

Authentifiez-vous auprès d'Amazon ECR.

Authentifiez-vous auprès des registres source et de destination en suivant les étapes de la documentation Amazon ECR.

Administrateur AWS, AWS DevOps, administrateur système AWS, administrateur cloud, DevOps ingénieur, architecte cloud

Testez la réplication des images.

Dans votre compte source, envoyez une image de conteneur vers un référentiel source Amazon ECR nouveau ou existant avec une balise d'image préfixée par. release- Pour envoyer l'image, suivez les étapes décrites dans la documentation Amazon ECR. 

Vous pouvez suivre la progression du CodeBuild projet dans la CodeBuild console

Une fois le CodeBuild projet terminé avec succès, connectez-vous au compte AWS de destination, ouvrez la console Amazon ECR et vérifiez que l'image existe dans le registre Amazon ECR de destination.

Administrateur AWS, AWS DevOps, administrateur système AWS, administrateur cloud, architecte cloud, DevOps ingénieur

Testez l'exclusion des images.

Dans votre compte source, envoyez une image de conteneur vers un référentiel source Amazon ECR nouveau ou existant avec une balise d'image ne comportant pas de préfixe personnalisé. 

Vérifiez que le CodeBuild projet n'est pas démarré et qu'aucune image de conteneur n'apparaît dans le registre de destination.

Administrateur AWS, AWS DevOps, administrateur système AWS, administrateur cloud, architecte cloud, DevOps ingénieur

Ressources connexes

Informations supplémentaires

Pour déployer automatiquement les ressources correspondant à ce modèle, procédez comme suit :

  1. Téléchargez la pièce jointe et extrayez les deux CloudFormation modèles : part-1-copy-tagged-images.yaml etpart-2-destination-account-role.yaml.

  2. Connectez-vous à la CloudFormation console AWS et déployez part-1-copy-tagged-images.yaml dans le même compte AWS et dans la même région que les registres Amazon ECR sources. Mettez à jour les paramètres selon vos besoins. Le modèle déploie les ressources suivantes :

    • Rôle IAM dans Amazon CloudWatch Events

    • Rôle IAM dans le CodeBuild projet AWS

    • CodeBuild Projet AWS

    • Règle CloudWatch relative aux événements AWS

  3. Prenez note de la valeur de SourceRoleName dans l'onglet Sorties. Vous aurez besoin de cette valeur à l'étape suivante.

  4. Déployez le second CloudFormation modèlepart-2-destination-account-role.yaml, dans le compte AWS sur lequel vous souhaitez copier les images du conteneur Amazon ECR. Mettez à jour les paramètres selon vos besoins. Pour le SourceRoleName paramètre, spécifiez la valeur de l'étape 3. Ce modèle déploie le rôle IAM entre comptes.

  5. Validez la réplication et l'exclusion des images, comme décrit dans la dernière étape de la section Epics.

Pièces jointes

Pour accéder au contenu supplémentaire associé à ce document, décompressez le fichier suivant : attachment.zip