Replica le immagini filtrate dei container Amazon ECR tra account o regioni - Prontuario AWS

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à.

Replica le immagini filtrate dei container Amazon ECR tra account o regioni

Creato da Abdal Garuba (AWS)

Ambiente: produzione

Tecnologie: contenitori e microservizi; DevOps

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

Riepilogo

Amazon Elastic Container Registry (Amazon ECR) Elastic Container Registry (Amazon ECR) può replicare tutte le immagini dei container in un repository di immagini tra regioni Amazon Web Services (AWS) e account AWS in modo nativo, utilizzando le funzionalità di replica tra regioni e account. (Per ulteriori informazioni, consulta il post sul blog di AWS La replica interregionale in Amazon ECR è arrivata.) Tuttavia, non è possibile filtrare le immagini copiate tra le regioni o gli account AWS in base a qualsiasi criterio. 

Questo modello descrive come replicare le immagini dei container archiviate in Amazon ECR su account e regioni AWS, in base a modelli di tag di immagine. Il pattern utilizza Amazon CloudWatch Events per ascoltare gli eventi push per le immagini che hanno un tag personalizzato predefinito. Un evento push avvia un CodeBuild progetto AWS e gli trasmette i dettagli dell'immagine. Il CodeBuild progetto copia le immagini dal registro Amazon ECR di origine al registro di destinazione in base ai dettagli forniti.

Questo modello copia le immagini con tag specifici tra gli account. Ad esempio, puoi utilizzare questo modello per copiare solo immagini sicure e pronte per la produzione nell'account AWS di produzione. Nell'account di sviluppo, dopo aver testato a fondo le immagini, puoi aggiungere un tag predefinito alle immagini sicure e utilizzare i passaggi indicati in questo schema per copiare le immagini contrassegnate nell'account di produzione.

Prerequisiti e limitazioni

Prerequisiti

Limitazioni

  • Questo modello controlla gli eventi push del registro di origine in una sola regione AWS. Puoi distribuire questo pattern in altre regioni per controllare i registri in quelle regioni.

  • In questo modello, una regola di Amazon CloudWatch Events ascolta un singolo modello di tag di immagine. Se desideri verificare la presenza di più pattern, puoi aggiungere eventi per ascoltare altri modelli di tag di immagine.

Architettura

Architettura Target

Architettura per la replica di immagini filtrate di container Amazon ECR tra account e regioni.

Automazione e scalabilità

Questo modello può essere automatizzato con uno script Infrastructure as Code (IaC) e distribuito su larga scala. Per utilizzare i CloudFormation modelli AWS per implementare questo modello, scarica l'allegato e segui le istruzioni nella sezione Informazioni aggiuntive.

Puoi indirizzare più CloudWatch eventi Amazon Events (con diversi modelli di eventi personalizzati) allo stesso CodeBuild progetto AWS per replicare più pattern di tag di immagine, ma dovrai aggiornare la convalida secondaria nel buildspec.yaml file (incluso nell'allegato e nella sezione Strumenti) come segue per supportare più modelli.

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

Strumenti

Servizi Amazon

  • IAM: AWS Identity and Access Management (IAM) consente di gestire l'accesso ai servizi e alle risorse AWS in modo sicuro. In questo modello, è necessario creare il ruolo IAM tra account diversi che AWS CodeBuild assumerà quando invia le immagini dei container al registro di destinazione.

  • Amazon ECR — Amazon Elastic Container Registry (Amazon ECR) è un registro di container completamente gestito che semplifica l'archiviazione, la gestione, la condivisione e la distribuzione di immagini e artefatti dei container ovunque. Le azioni di invio di immagini al registro di origine inviano i dettagli degli eventi di sistema al bus degli eventi che viene raccolto da Amazon CloudWatch Events.

  • AWS CodeBuild: AWS CodeBuild è un servizio di integrazione continua completamente gestito che fornisce potenza di calcolo per eseguire lavori come la compilazione del codice sorgente, l'esecuzione di test e la produzione di artefatti pronti per essere distribuiti. Questo modello utilizza AWS CodeBuild per eseguire l'azione di copia dal registro Amazon ECR di origine al registro di destinazione.

  • CloudWatch Eventi: Amazon CloudWatch Events offre un flusso di eventi di sistema che descrivono i cambiamenti nelle risorse AWS. Questo modello utilizza regole per abbinare le azioni push di Amazon ECR a uno schema di tag di immagine specifico.

Strumenti

  • Docker CLI: Docker è uno strumento che semplifica la creazione e la gestione dei container. I container racchiudono un'applicazione e tutte le sue dipendenze in un'unica unità o pacchetto che può essere facilmente distribuito su qualsiasi piattaforma che supporti il runtime del contenitore.

Codice

È possibile implementare questo modello in due modi:

  • Configurazione automatizzata: distribuisci i due CloudFormation modelli AWS forniti nell'allegato. Per istruzioni, consulta la sezione Informazioni aggiuntive.

  • Configurazione manuale: segui i passaggi nella sezione Epics

Esempio: buildspec.yaml

Se utilizzi i CloudFormation modelli forniti con questo modello, il buildspec.yaml file viene incluso nelle risorse. 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}

Epiche

AttivitàDescrizioneCompetenze richieste

Crea un ruolo CloudWatch Events.

Nell'account AWS di origine, crea un ruolo IAM da far assumere ad Amazon CloudWatch Events. Il ruolo deve disporre delle autorizzazioni necessarie per avviare un CodeBuild progetto AWS.

Per creare il ruolo utilizzando la CLI di AWS, segui le istruzioni nella documentazione IAM.

Esempio di trust policy (trustpolicy.json): 

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

Esempio di politica di autorizzazione (permissionpolicy.json):

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "codebuild:StartBuild", "Resource": "<CodeBuild Project ARN>" } }
Amministratore AWS, AWS DevOps, amministratore di sistema AWS, amministratore cloud, architetto cloud, DevOps ingegnere

Crea un CodeBuild ruolo.

Crea un ruolo IAM da CodeBuild far assumere ad AWS seguendo le istruzioni nella documentazione IAM. Il ruolo deve avere le seguenti autorizzazioni:

  • Autorizzazione ad assumere il ruolo interaccount di destinazione

  • Autorizzazione a creare gruppi di log e flussi di log e a inserire eventi di log

  • Autorizzazioni di sola lettura per tutti i repository Amazon ECR, aggiungendo la policy gestita di AmazonEC2 al ruolo ContainerRegistryReadOnly

  • Autorizzazione a interrompere CodeBuild

Esempio di politica di fiducia (trustpolicy.json):

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

Esempio di politica di autorizzazione (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" } ] }

Allega la policy gestita AmazonEC2ContainerRegistryReadOnly al comando CLI come segue:

~$ aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly \ --role-name <name of CodeBuild Role>
Amministratore AWS, AWS DevOps, amministratore di sistema AWS, amministratore cloud, architetto cloud, DevOps ingegnere

Crea un ruolo tra account.

Nell'account AWS di destinazione, crea un ruolo IAM per il CodeBuild ruolo AWS per l'account di origine da assumere. Il ruolo tra account diversi dovrebbe consentire alle immagini dei container di creare un nuovo repository e di caricare le immagini dei container su Amazon ECR.

Per creare il ruolo IAM utilizzando la CLI AWS, segui le istruzioni nella documentazione IAM

Per consentire il CodeBuild progetto AWS della fase precedente, utilizza la seguente policy di fiducia:

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

Per consentire al CodeBuild progetto AWS del passaggio precedente di salvare le immagini nel registro di destinazione, utilizza la seguente politica di autorizzazione:

{ "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" } ] }
Amministratore AWS, AWS DevOps, amministratore del cloud, architetto del cloud, DevOps ingegnere, amministratore di sistema AWS
AttivitàDescrizioneCompetenze richieste

Crea un CodeBuild progetto.

Crea un CodeBuild progetto AWS nell'account di origine seguendo le istruzioni nella CodeBuild documentazione AWS. Il progetto dovrebbe trovarsi nella stessa regione del registro di origine. 

Configura il progetto come segue:

  • Tipo di ambiente: LINUX CONTAINER

  • Ruolo di servizio: CodeBuild Role

  • Modalità privilegiata: true

  • Immagine dell'ambiente: aws/codebuild/standard:x.x (usa l'ultima immagine disponibile)

  • Variabili di ambiente:

    • CROSS_ACCOUNT_ROLE_ARN: Amazon Resource Name (ARN) del ruolo tra account

    • DESTINATION_REGION: il nome della regione tra più account

    • DESTINATION_ACCOUNT: Il numero dell'account di destinazione

  • Specifiche di compilazione: utilizza il buildspec.yaml file elencato nella sezione Strumenti.

Amministratore AWS, AWS DevOps, amministratore di sistema AWS, amministratore cloud, architetto cloud, DevOps ingegnere
AttivitàDescrizioneCompetenze richieste

Crea una regola per gli eventi.

Poiché il pattern utilizza la funzionalità di filtraggio dei contenuti, devi creare l'evento utilizzando Amazon EventBridge. Crea l'evento e il target seguendo le istruzioni nella EventBridge documentazione, con alcune modifiche:

  • Per Definisci pattern, scegliete Event Pattern, quindi scegliete Custom pattern.

  • Copia il seguente codice di esempio del modello di eventi personalizzato nella casella di testo fornita:

    {   "source": ["aws.ecr"],   "detail-type": ["ECR Image Action"],   "detail": {     "action-type": ["PUSH"],     "result": ["SUCCESS"],     "image-tag": [{ "prefix": "release-"}]   } }
  • Per gli obiettivi Select, scegli il CodeBuild progetto AWS e incolla l'ARN per il CodeBuild progetto AWS che hai creato nell'epopea precedente.

  • Per Configure Input, scegli Input Transformer.

    • Nella casella di testo Input Path, incolla:

      {"IMAGE_TAG":"$.detail.image-tag","REPO_NAME":"$.detail.repository-name"}
    • Nella casella di testo Input Template, incolla:

      {"environmentVariablesOverride": [ {"name": "IMAGE_TAG", "value":<IMAGE_TAG>},{"name":"REPO_NAME","value":<REPO_NAME>}]}
  • Scegli Usa il ruolo esistente e scegli il nome del ruolo CloudWatch Events che hai creato in precedenza nell'epopea Create IAM roles.

Amministratore AWS, AWS DevOps, amministratore di sistema AWS, amministratore cloud, architetto cloud, DevOps ingegnere
AttivitàDescrizioneCompetenze richieste

Effettua l'autenticazione con Amazon ECR.

Effettua l'autenticazione nei registri di origine e di destinazione seguendo i passaggi indicati nella documentazione di Amazon ECR.

Amministratore AWS, AWS DevOps, amministratore di sistema AWS, amministratore cloud, DevOps ingegnere, architetto cloud

Prova la replica delle immagini.

Nel tuo account di origine, invia un'immagine del contenitore a un repository di origine Amazon ECR nuovo o esistente con un tag immagine preceduto da. release- Per inviare l'immagine, segui i passaggi indicati nella documentazione di Amazon ECR. 

Puoi monitorare lo stato di avanzamento del CodeBuild progetto nella CodeBuild console

Una volta completato con successo il CodeBuild progetto, accedi all'account AWS di destinazione, apri la console Amazon ECR e conferma che l'immagine esiste nel registro Amazon ECR di destinazione.

Amministratore AWS, AWS DevOps, amministratore di sistema AWS, amministratore cloud, architetto cloud, DevOps ingegnere

Prova l'esclusione delle immagini.

Nel tuo account di origine, invia un'immagine del contenitore a un repository di origine Amazon ECR nuovo o esistente con un tag di immagine che non ha il prefisso personalizzato. 

Verifica che il CodeBuild progetto non sia avviato e che nessuna immagine del contenitore sia presente nel registro di destinazione.

Amministratore AWS, AWS DevOps, amministratore di sistema AWS, amministratore cloud, architetto cloud, DevOps ingegnere

Risorse correlate

Informazioni aggiuntive

Per distribuire automaticamente le risorse per questo modello, procedi nel seguente modo:

  1. Scarica l'allegato ed estrai i due CloudFormation modelli: part-1-copy-tagged-images.yaml epart-2-destination-account-role.yaml.

  2. Accedi alla CloudFormation console AWS ed esegui la distribuzione part-1-copy-tagged-images.yaml nello stesso account AWS e nella stessa regione dei registri Amazon ECR di origine. Aggiorna i parametri secondo necessità. Il modello distribuisce le seguenti risorse:

    • Ruolo IAM di Amazon CloudWatch Events

    • Ruolo IAM CodeBuild del progetto AWS

    • CodeBuild Progetto AWS

    • Regola AWS CloudWatch Events

  3. Prendi nota del valore di SourceRoleName nella scheda Outputs. Avrai bisogno di questo valore nel passaggio successivo.

  4. Implementa il secondo CloudFormation modello nell'account AWS in cui desideri copiare le immagini del contenitore Amazon ECR. part-2-destination-account-role.yaml Aggiorna i parametri secondo necessità. Per il SourceRoleName parametro, specificate il valore del passaggio 3. Questo modello implementa il ruolo IAM su più account.

  5. Convalida la replica e l'esclusione delle immagini, come descritto nell'ultimo passaggio della sezione Epics.

Allegati

Per accedere al contenuto aggiuntivo associato a questo documento, decomprimi il seguente file: attachment.zip