Replique imagens filtradas de contêineres do Amazon ECR entre contas ou regiões - Recomendações da AWS

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Replique imagens filtradas de contêineres do Amazon ECR entre contas ou regiões

Criado por Abdal Garuba (AWS)

Ambiente: produção

Tecnologias: contêineres e microsserviços; DevOps

Serviços da AWS: Amazon EC2 Container Registry; Amazon; AWS; CloudWatch AWS CodeBuild; AWS Identity and Access Management; AWS CLI

Resumo

O Amazon Elastic Container Registry (Amazon ECR) pode replicar todas as imagens de contêineres em um repositório de imagens nas regiões da Amazon Web Services (AWS) e nas contas da AWS de forma nativa, usando os atributos de replicação entre regiões e entre contas. (Para obter mais informações, consulte a postagem no blog da AWS: A replicação entre regiões no Amazon ECR chegou.) No entanto, não há como filtrar as imagens que são copiadas nas contas ou regiões da AWS com base em nenhum critério. 

Esse padrão descreve como replicar imagens de contêineres que são armazenadas no Amazon ECR em todas as contas e regiões da AWS, com base em padrões de tag de imagem. O padrão usa o Amazon CloudWatch Events para ouvir eventos push para imagens que têm uma tag personalizada predefinida. Um evento push inicia um CodeBuild projeto da AWS e passa os detalhes da imagem para ele. O CodeBuild projeto copia as imagens do registro de origem do Amazon ECR para o registro de destino com base nos detalhes fornecidos.

Esse padrão copia imagens que têm tags específicas em todas as contas. Por exemplo, você pode usar esse padrão para copiar somente imagens seguras e prontas para produção na conta de produção da AWS. Na conta de desenvolvimento, depois que as imagens forem completamente testadas, você poderá adicionar uma tag predefinida às imagens seguras e usar as etapas desse padrão para copiar as imagens marcadas para a conta de produção.

Pré-requisitos e limitações

Pré-requisitos

  • Uma conta ativa AWS para registros de origem e destino do Amazon ECR

  • Permissões administrativas para as ferramentas usadas nesse padrão

  • Docker instalado em sua máquina local para teste

  • AWS Command Line Interface (AWS CLI)), para autenticação no Amazon ECR

Limitações

  • Esse padrão observa os eventos push do registro de origem em apenas uma região da AWS. Você pode implantar esse padrão em outras regiões para observar os registros nessas regiões.

  • Nesse padrão, uma regra da Amazon CloudWatch Events escuta um único padrão de tag de imagem. Se quiser verificar vários padrões, você pode adicionar eventos para ouvir padrões adicionais de tags de imagem.

Arquitetura

Arquitetura de destino

Arquitetura para replicar imagens filtradas de contêineres do Amazon ECR entre contas e regiões.

Automação e escala

Esse padrão pode ser automatizado com um script de infraestrutura como código (IaC) e implantado em grande escala. Para usar os CloudFormation modelos da AWS para implantar esse padrão, baixe o anexo e siga as instruções na seção Informações adicionais.

Você pode direcionar vários CloudWatch eventos da Amazon Events (com diferentes padrões de eventos personalizados) para o mesmo CodeBuild projeto da AWS para replicar vários padrões de tag de imagem, mas precisará atualizar a validação secundária no buildspec.yaml arquivo (que está incluído no anexo e na seção Ferramentas) da seguinte forma para suportar vários padrões.

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

Ferramentas

Serviço da Amazon

  • IAM: o AWS Identity and Access Management (IAM) permite que você gerencie o acesso aos serviços e recursos da AWS com segurança. Nesse padrão, você precisaria criar a função do IAM entre contas que a AWS CodeBuild assumirá ao enviar imagens de contêiner para o registro de destino.

  • Amazon ECR: o Amazon Elastic Container Registry (Amazon ECR) é um registro de contêiner do Docker totalmente gerenciado que facilita o armazenamento, o gerenciamento e a implantação de imagens de contêiner do Docker. As ações de envio de imagens para o registro de origem enviam detalhes do evento do sistema para o barramento de eventos que é coletado pela Amazon CloudWatch Events.

  • AWS CodeBuild — CodeBuild A AWS é um serviço de integração contínua totalmente gerenciado que fornece poder computacional para realizar trabalhos como compilar código-fonte, executar testes e produzir artefatos prontos para serem implantados. Esse padrão usa CodeBuild a AWS para realizar a ação de cópia do registro de origem do Amazon ECR para o registro de destino.

  • CloudWatch Eventos — A Amazon CloudWatch Events fornece um fluxo de eventos do sistema que descrevem as mudanças nos recursos da AWS. Esse padrão usa regras para combinar as ações push do Amazon ECR com um padrão de tag de imagem específico.

Ferramentas

  • Docker CLI: o Docker é uma ferramenta que facilita a criação e o gerenciamento de contêineres. Os contêineres empacotam um aplicativo e todas as suas dependências em uma unidade ou pacote que pode ser facilmente implantado em qualquer plataforma que ofereça suporte ao runtime do contêiner.

Código

É possível implementar esse padrão de duas maneiras:

  • Configuração automatizada: implante os dois CloudFormation modelos da AWS fornecidos no anexo. Para obter instruções, consulte a seção Informações adicionais.

  • Configuração manual: siga as etapas na seção Épicos

Exemplo: buildspec.yaml

Se você estiver usando os CloudFormation modelos fornecidos com esse padrão, o buildspec.yaml arquivo será incluído nos CodeBuild recursos.

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}

Épicos

TarefaDescriçãoHabilidades necessárias

Crie uma função de CloudWatch eventos.

Na conta de origem da AWS, crie uma função do IAM para a Amazon CloudWatch Events assumir. A função deve ter permissões para iniciar um CodeBuild projeto da AWS.

Para criar a função usando a AWS CLI, siga as instruções na documentação do IAM.

Exemplo de política de confiança do trustpolicy.json

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

Exemplo de política de permissões (permissionpolicy.json)

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "codebuild:StartBuild", "Resource": "<CodeBuild Project ARN>" } }
Administrador da AWS, AWS DevOps, administrador de sistemas da AWS, administrador de nuvem, arquiteto de nuvem, DevOps engenheiro

Crie uma CodeBuild função.

Crie uma função do IAM para CodeBuild a AWS assumir, seguindo as instruções na documentação do IAM. O perfil também deve ter as seguintes permissões:

  • Permissão para assumir a função de destino entre contas

  • Permissão para criar grupos e fluxos de log e colocar eventos de log

  • Permissões somente de leitura para todos os repositórios do Amazon ECR, adicionando a política gerenciada do ContainerRegistryReadOnlyAmazonEC2 à função

  • Permissão para parar CodeBuild

Exemplo de política de confiança do trustpolicy.json.

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

Exemplo de política de permissões (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" } ] }

Anexe a política gerenciada AmazonEC2ContainerRegistryReadOnly ao comando da CLI da seguinte forma:

~$ aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly \ --role-name <name of CodeBuild Role>
Administrador da AWS, AWS DevOps, administrador de sistemas da AWS, administrador de nuvem, arquiteto de nuvem, DevOps engenheiro

Criar uma função de conta cruzada.

Na conta da AWS de destino, crie uma função do IAM para a CodeBuild função da AWS a ser assumida pela conta de origem. A função entre contas deve permitir que imagens de contêiner criem um novo repositório e façam upload de imagens de contêiner para o Amazon ECR.

Para criar o perfil do IAM usando a AWS CLI, siga as instruções na documentação do IAM

Para permitir o CodeBuild projeto da AWS da etapa anterior, use a seguinte política de confiança:

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

Para permitir que o CodeBuild projeto da AWS da etapa anterior salve imagens no registro de destino, use a seguinte política de permissão:

{ "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" } ] }
Administrador da AWS, AWS DevOps, administrador de nuvem, arquiteto de nuvem, DevOps engenheiro, administrador de sistemas da AWS
TarefaDescriçãoHabilidades necessárias

Crie um CodeBuild projeto.

Crie um CodeBuild projeto da AWS na conta de origem seguindo as instruções na CodeBuild documentação da AWS. O projeto deve estar na mesma região que o registro de origem. 

Configure o projeto da seguinte forma:

  • Tipo de ambiente: LINUX CONTAINER

  • Perfil de CodeBuild Role serviço

  • Modo privilegiado: true

  • Imagem do ambiente: aws/codebuild/standard:x.x (use a imagem mais recente disponível)

  • Variáveis de ambiente:

    • CROSS_ACCOUNT_ROLE_ARN: o nome do recurso da Amazon (ARN) da conta do usuário.

    • DESTINATION_REGION: o nome da região de várias contas

    • DESTINATION_ACCOUNT: o número da conta de destino

  • Especificações de compilação: use o buildspec.yaml arquivo listado na seção Ferramentas.

Administrador da AWS, AWS DevOps, administrador de sistemas da AWS, administrador de nuvem, arquiteto de nuvem, DevOps engenheiro
TarefaDescriçãoHabilidades necessárias

Criar uma regra de evento.

Como o padrão usa o recurso de filtragem de conteúdo, você precisa criar o evento usando a Amazon EventBridge. Crie o evento e o alvo seguindo as instruções na EventBridge documentação, com algumas modificações:

  • Em Definir padrão, escolha Padrão de evento e escolha Padrão personalizado.

  • Copie o seguinte código de amostra de padrão de eventos personalizados na caixa de texto fornecida:

    {   "source": ["aws.ecr"],   "detail-type": ["ECR Image Action"],   "detail": {     "action-type": ["PUSH"],     "result": ["SUCCESS"],     "image-tag": [{ "prefix": "release-"}]   } }
  • Em Selecionar destinos, escolha o CodeBuild projeto da AWS e cole o ARN do CodeBuild projeto da AWS que você criou no épico anterior.

  • Em CConfigurar entrada, selecione Transformador de entrada.

    • Na caixa de texto Caminho de entrada, cole:

      {"IMAGE_TAG":"$.detail.image-tag","REPO_NAME":"$.detail.repository-name"}
    • Na caixa de texto Modelo de entrada, cole:

      {"environmentVariablesOverride": [ {"name": "IMAGE_TAG", "value":<IMAGE_TAG>},{"name":"REPO_NAME","value":<REPO_NAME>}]}
  • Escolha Usar papel existente e escolha o nome do papel de CloudWatch Eventos que você criou anteriormente no épico Create IAM roles.

Administrador da AWS, AWS DevOps, administrador de sistemas da AWS, administrador de nuvem, arquiteto de nuvem, DevOps engenheiro
TarefaDescriçãoHabilidades necessárias

Autenticar com o Amazon ECR

Autentique-se nos registros de origem e destino seguindo as etapas na documentação do Amazon ECR.

Administrador da AWS, AWS DevOps, administrador de sistemas da AWS, administrador de nuvem, DevOps engenheiro, arquiteto de nuvem

Replicação de imagem de teste.

Em sua conta de origem, envie uma imagem de contêiner para um repositório de origem novo ou existente do Amazon ECR com uma tag de imagem prefixada com release-. Para enviar a imagem, siga as etapas na documentação do Amazon ECR. 

Você pode monitorar o progresso do CodeBuild projeto no CodeBuild console

Depois que o CodeBuild projeto for concluído com sucesso, faça login na conta da AWS de destino, abra o console do Amazon ECR e confirme que a imagem existe no registro do Amazon ECR de destino.

Administrador da AWS, AWS DevOps, administrador de sistemas da AWS, administrador de nuvem, arquiteto de nuvem, DevOps engenheiro

Exclusão de imagem de teste.

Em sua conta de origem, envie uma imagem de contêiner para um repositório de origem novo ou existente do Amazon ECR com uma tag de imagem que não tenha o prefixo personalizado.  

Confirme se o CodeBuild projeto não foi iniciado e se nenhuma imagem de contêiner aparece no registro de destino.

Administrador da AWS, AWS DevOps, administrador de sistemas da AWS, administrador de nuvem, arquiteto de nuvem, DevOps engenheiro

Recursos relacionados

Mais informações

Para implantar automaticamente os recursos desse padrão, siga estas etapas:

  1. Baixe o anexo e extraia os dois CloudFormation modelos: part-1-copy-tagged-images.yaml part-2-destination-account-role.yaml e.

  2. Faça login no CloudFormation console da AWS e implante part-1-copy-tagged-images.yaml na mesma conta e região da AWS dos registros de origem do Amazon ECR. Atualizar parâmetros conforme necessário: O modelo define os seguintes recursos:

    • Função do Amazon CloudWatch Events IAM

    • Função CodeBuild do IAM do projeto AWS

    • CodeBuild Projeto AWS

    • Regra de CloudWatch eventos da AWS

  3. Anote o valor de SourceRoleName na guia Saídas. Você precisará desse valor na próxima etapa.

  4. Implante o segundo CloudFormation modelo,part-2-destination-account-role.yaml, na conta da AWS para a qual você deseja copiar as imagens do contêiner Amazon ECR. Atualizar parâmetros conforme necessário: Para o parâmetro SourceRoleName, especifique o valor da etapa 3. Esse modelo implanta o perfil do IAM entre contas.

  5. Valide a replicação e exclusão de imagens, conforme descrito na última etapa da seção Épicos.

Anexos

Para acessar o conteúdo adicional associado a este documento, descompacte o seguinte arquivo: attachment.zip