View a markdown version of this page

Copie imagens de contêineres do Amazon ECR entre e Contas da AWS Regiões da AWS - 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á.

Copie imagens de contêineres do Amazon ECR entre e Contas da AWS Regiões da AWS

Faisal Shahdad, Amazon Web Services

Resumo

Esse padrão mostra como usar uma abordagem sem servidor para replicar imagens marcadas de repositórios existentes do Amazon Elastic Container Registry (Amazon ECR) para outros repositórios e. Contas da AWS Regiões da AWS A solução é usada AWS Step Functions para gerenciar o fluxo de trabalho de replicação e AWS Lambda as funções para copiar imagens de contêineres grandes.

O Amazon ECR usa recursos nativos de replicação entre regiões e entre contas, que replicam imagens de contêiner por diferentes regiões e contas. No entanto, esses recursos só passam a replicar imagens depois que a replicação é ativada. Não existe um mecanismo para replicar imagens já existentes em diferentes regiões e contas.

Esse padrão ajuda as equipes de inteligência artificial (IA) a distribuir modelos, estruturas de aprendizado de máquina (ML) em contêineres (por exemplo, PyTorch TensorFlow, e Hugging Face) e dependências para outras contas e regiões. Isso pode auxiliar na superação de limitações de serviço e na otimização do uso de recursos de computação, como GPU. É possível replicar somente determinados repositórios do Amazon ECR provenientes de contas e regiões específicas. Para obter mais informações, consulte Cross-Region replication in Amazon ECR has landed.

Pré-requisitos e limitações

Pré-requisitos

  • Duas ou mais ativas Contas da AWS (uma conta de origem e uma conta de destino, no mínimo)

  • Permissões apropriadas AWS Identity and Access Management (IAM) em todas as contas

  • Docker para criar a imagem de contêiner do Lambda

  • AWS Command Line Interface (AWS CLI) configurado para todas as contas

Limitações

  • Exclusão de imagens sem etiquetas: a solução copia apenas imagens de contêiner que contam com etiquetas explícitas. Imagens sem etiquetas que contam com arquivos de resumo SHA256 são desconsideradas.

  • Restrições de tempo limite de execução do Lambda — AWS Lambda é limitado a um tempo limite máximo de execução de 15 minutos, o que pode ser insuficiente para copiar grandes imagens de contêineres ou repositórios.

  • Gerenciamento manual de imagens de contêiner: o código Python crane-app.py requer um novo desenvolvimento e implantação da imagem de contêiner do Lambda.

  • Capacidade limitada de processamento paralelo: a configuração MaxConcurrency destinada ao estado limita quantos repositórios podem ser copiados simultaneamente. No entanto, você pode modificar essa configuração no AWS CloudFormation modelo da conta de origem. É válido salientar que valores de concorrência mais elevados podem fazer você exceder os limites de taxa do serviço e as cotas de execução do Lambda no nível da conta.

Arquitetura

Pilha de destino

O padrão conta com quatro componentes principais:

  • Infraestrutura da conta de origem — CloudFormation modelo que cria os componentes de orquestração

  • Infraestrutura da conta de destino — CloudFormation modelo que cria funções de acesso entre contas

  • Função do Lambda: função baseada em Python que usa a ferramenta Crane para realizar uma cópia eficiente das imagens

  • Imagem de contêiner: o contêiner do Docker que adiciona as ferramentas necessárias na função do Lambda

Arquitetura de destino

Fluxo de trabalho do Step Functions

A máquina de estado do Step Functions realiza a orquestração das seguintes etapas, como ilustrado no diagrama a seguir:

  • PopulateRepositoryList: realiza verificações nos repositórios do Amazon ECR e preenche o Amazon DynamoDB

  • GetRepositoryList: recupera uma lista exclusiva de repositórios do DynamoDB

  • DeduplicateRepositories: garante que não haja processamento duplicado

  • CopyRepositories: gerencia a cópia paralela dos repositórios

  • NotifySuccess/NotifyFailure: envia notificações pelo Amazon Simple Notification Service (Amazon SNS) com base no resultado da execução

Ferramentas

Ferramentas da Amazon

  • CloudWatchA Amazon ajuda você a monitorar as métricas dos seus AWS recursos e dos aplicativos em que você executa AWS em tempo real.

  • O Amazon DynamoDB é um serviço de banco de dados NoSQL totalmente gerenciado que fornece performance rápida, previsível e escalável.

  • O Amazon Simple Notification Service (Amazon SNS) ajuda você a coordenar e gerenciar a troca de mensagens entre publicadores e clientes, incluindo servidores web e endereços de e-mail.

  • AWS Identity and Access Management (IAM) ajuda você a gerenciar com segurança o acesso aos seus AWS recursos controlando quem está autenticado e autorizado a usá-los.

  • O AWS Lambda é um serviço de computação que ajuda a executar código sem exigir provisionamento ou gerenciamento de servidores. Ele executa o código somente quando necessário e dimensiona automaticamente, assim, você paga apenas pelo tempo de computação usado.

  • AWS Step Functionsé um serviço de orquestração sem servidor que ajuda você a combinar funções do Lambda e outras para criar aplicativos essenciais para os negócios. Serviços da AWS

Outras ferramentas

  • O Crane é uma ferramenta de orquestração do Docker. É semelhante ao Docker Compose, mas conta com recursos adicionais.

  • O Docker é um conjunto de produtos de plataforma como serviço (PaaS) que usam virtualização em nível de sistema operacional para disponibilizar software em contêineres.

Repositório de código

  • O código desse padrão está disponível no GitHub sample-ecr-copy repositório. Você pode usar o CloudFormation modelo do repositório para criar os recursos subjacentes.

Práticas recomendadas

Respeite o princípio de privilégio mínimo, garantindo somente as permissões estritamente necessárias para a execução de uma tarefa. Para obter mais informações, consulte Concessão de privilégio mínimo e Práticas recomendadas de segurança na documentação do IAM.

Épicos

TarefaDescriptionHabilidades necessárias

Configure AWS CLI perfis.

  1. Configure o perfil da conta de origem:

    aws configure --profile source-account # Enter: Access Key ID, Secret Access Key, Default region, Output format (json)
  2. Configure o perfil da conta de destino:

    aws configure --profile destination-account # Enter: Access Key ID, Secret Access Key, Default region, Output format (json)
  3. Verifique as configurações:

    aws sts get-caller-identity --profile source-account aws sts get-caller-identity --profile destination-account
DevOps engenheiro, engenheiro de dados, engenheiro de ML

Colete as informações necessárias.

  1. Obtenha a ID da conta de origem:

    export SOURCE_ACCOUNT_ID=$(aws sts get-caller-identity --profile source-account --query Account --output text) echo "Source Account ID: $SOURCE_ACCOUNT_ID"
  2. Obtenha a ID da conta de destino:

    export DEST_ACCOUNT_ID=$(aws sts get-caller-identity --profile destination-account --query Account --output text) echo "Destination Account ID: $DEST_ACCOUNT_ID"
  3. Defina Regiões da AWS o. Modifique este comando conforme sua região:

    export SOURCE_REGION="us-east-1" export DEST_REGION="us-east-2"
  4. Liste os repositórios existentes do Amazon ECR na conta de origem:

    aws ecr describe-repositories --profile source-account --region $SOURCE_REGION --query 'repositories[].repositoryName' --output table
DevOps engenheiro, engenheiro de dados, engenheiro de ML

Clonar o repositório.

Clone o repositório do padrão para sua estação de trabalho local:

git clone https://github.com/aws-samples/sample-ecr-copy
DevOps engenheiro, engenheiro de dados, engenheiro de ML
TarefaDescriptionHabilidades necessárias

Valide o modelo.

Valide o CloudFormation modelo:

aws cloudformation validate-template \ --template-body file://"Destination Account cf_template.yml" \ --profile destination-account
DevOps engenheiro, engenheiro de ML, engenheiro de dados

Implante a infraestrutura da conta de destino.

  1. Implante a pilha da conta de destino:

    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
  2. Aguarde a conclusão da pilha:

    aws cloudformation wait stack-create-complete \ --stack-name ecr-copy-destination \ --profile destination-account \ --region $DEST_REGION
Engenheiro de dados, engenheiro de ML, DevOps engenheiro

Verificar a implantação.

  1. Obtenha as saídas da pilha:

    aws cloudformation describe-stacks \ --stack-name ecr-copy-destination \ --profile destination-account \ --region $DEST_REGION \ --query 'Stacks[0].Outputs' \ --output table
  2. Armazene o perfil do IAM entre contas:

    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 engenheiro, engenheiro de ML, engenheiro de dados
TarefaDescriptionHabilidades necessárias

Prepare o desenvolvimento do contêiner.

  1. Verifique se o Docker está em execução:

    docker --version docker info
  2. Certifique-se de que os arquivos crane-app.py e Dockerfile estão no diretório atual:

    ls -la crane-app.py Dockerfile
Engenheiro de dados, engenheiro de ML, DevOps engenheiro

Crie a imagem do contêiner.

  1. Crie a imagem do contêiner do Lambda:

    docker build -t ecr-copy-lambda . --no-cache
  2. Verifique se a imagem foi criada:

    docker images ecr-copy-lambda
  3. (Opcional) Teste o contêiner localmente:

    docker run --rm --entrypoint python ecr-copy-lambda -c "import boto3; print('Container working')"
Engenheiro de dados, engenheiro de ML, DevOps engenheiro

Crie um repositório e faça o upload da imagem.

  1. Crie um repositório do Amazon ECR na conta de origem:

    aws ecr create-repository \ --repository-name ecr-copy-lambda \ --profile source-account \ --region $SOURCE_REGION
  2. Obtenha um token de login do Amazon ECR e autentique o 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
  3. Coloque uma etiqueta na imagem para o Amazon ECR:

    docker tag ecr-copy-lambda:latest \ $SOURCE_ACCOUNT_ID.dkr.ecr.$SOURCE_REGION.amazonaws.com/ecr-copy-lambda:latest
  4. Faça o upload da imagem para o Amazon ECR:

    docker push $SOURCE_ACCOUNT_ID.dkr.ecr.$SOURCE_REGION.amazonaws.com/ecr-copy-lambda:latest
  5. Armazene o URI da imagem para uso posterior:

    export LAMBDA_IMAGE_URI="$SOURCE_ACCOUNT_ID.dkr.ecr.$SOURCE_REGION.amazonaws.com/ecr-copy-lambda:latest" echo "Lambda Image URI: $LAMBDA_IMAGE_URI"
Engenheiro de dados, engenheiro de ML, DevOps engenheiro

Verifique a imagem.

  1. Liste as imagens presentes no repositório:

    aws ecr list-images \ --repository-name ecr-copy-lambda \ --profile source-account \ --region $SOURCE_REGION
  2. Obtenha os detalhes da imagem:

    aws ecr describe-images \ --repository-name ecr-copy-lambda \ --profile source-account \ --region $SOURCE_REGION
Engenheiro de dados, engenheiro de ML, DevOps engenheiro
TarefaDescriptionHabilidades necessárias

Prepare os parâmetros de implantação.

  1. Configure o e-mail de notificação:

    export NOTIFICATION_EMAIL="your-email@company.com"
  2. Defina os repositórios a serem copiados (separados por vírgulas):

    export REPOSITORY_LIST="app-frontend,app-backend,database-migrations"
  3. Configure o ambiente:

    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"
Engenheiro de dados, DevOps engenheiro, engenheiro de ML

Valide o modelo de origem.

Valide o CloudFormation modelo de origem:

aws cloudformation validate-template \ --template-body file://"Source Account Cf template.yml" \ --profile source-account
Engenheiro de dados, engenheiro de ML, DevOps engenheiro

Implante a infraestrutura de origem.

  1. Implante a pilha de contas de origem:

    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
  2. Aguarde a conclusão da pilha (o processo pode demorar até 10 minutos):

    aws cloudformation wait stack-create-complete \ --stack-name ecr-copy-source \ --profile source-account \ --region $SOURCE_REGION
Engenheiro de dados, engenheiro de ML, DevOps engenheiro

Verifique a implantação e colete as saídas.

  1. Obtenha as saídas da pilha:

    aws cloudformation describe-stacks \ --stack-name ecr-copy-source \ --profile source-account \ --region $SOURCE_REGION \ --query 'Stacks[0].Outputs' \ --output table
  2. Armazene os nomes de recursos da Amazon (ARNs) para a máquina de estado e o tópico do SNS:

    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 engenheiro, engenheiro de ML, engenheiro de dados

Confirme sua inscrição por e-mail.

  1. Verifique seu e-mail para confirmar a inscrição no SNS.

  2. Clique no link de confirmação presente no e-mail.

  3. Verifique o status da assinatura.

    aws sns list-subscriptions-by-topic \ --topic-arn $SNS_TOPIC_ARN \ --profile source-account \ --region $SOURCE_REGION
Engenheiro de dados, engenheiro de ML, DevOps engenheiro
TarefaDescriptionHabilidades necessárias

Execute e monitore o processo de cópia.

  1. Faça login no Console de gerenciamento da AWS e abra o console Step Functions.

  2. Localize a máquina de estado.

  3. Selecione Iniciar execução.

    Quando a execução terminar, os resultados serão exibidos na guia Entrada e saída de execução.

  4. (Opcional) Se você quiser continuar executando o Step Functions usando o AWS CLI, siga as etapas restantes neste épico.

DevOps engenheiro, engenheiro de ML, engenheiro de dados

Execute a função de etapa.

  1. Gere um nome exclusivo:

    export EXECUTION_NAME="ecr-copy-$(date +%Y%m%d-%H%M%S)"
  2. Execute a função de etapa.

    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 engenheiro, engenheiro de ML, engenheiro de dados

Monitore o progresso.

  1. Verifique o status:

    aws stepfunctions describe-execution \ --execution-arn $EXECUTION_ARN \ --profile source-account \ --region $SOURCE_REGION \ --query '{Status:status,StartDate:startDate,StopDate:stopDate}' \ --output table
  2. Obtenha o histórico:

    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 engenheiro, engenheiro de ML, engenheiro de dados

Verifique os resultados.

Aguarde o processo ser concluído (com atualizações a cada 30 segundos):

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 engenheiro, engenheiro de ML, engenheiro de dados

Verifique as imagens.

  1. Liste os repositórios presentes na conta de destino:

    aws ecr describe-repositories \ --profile destination-account \ --region $DEST_REGION \ --query 'repositories[].repositoryName' \ --output table
  2. Confira as imagens do repositório:

    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 engenheiro, engenheiro de dados, engenheiro de ML

Solução de problemas

ProblemaSolução

Não foi possível executar o Step Functions.

  1. Para recuperar eventos de falha detalhados do histórico, execute o seguinte AWS CLI comando:

    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
  2. Para recuperar registros de funções do Lambda que falharam, execute o AWS CLI seguinte comando:

    # 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

Recursos relacionados

Mais informações

Parâmetros de configuração

Parâmetro

Description

Exemplo

SourceAccountId

Conta da AWS ID de origem

11111111111

DestinationAccountId

Conta da AWS ID de destino

22222222222

DestinationRegion

Alvo Região da AWS

us-east-2

SourceRegion

Fonte Região da AWS

us-east-1

NotificationEmail

E-mail para receber notificações

abc@xyz.com

RepositoryList

Repositórios a serem copiados

repo1,repo2,repo3

LambdaImageUri

URI da imagem de contêiner do Lambda

${ACCOUNT}.dkr.ecr.${REGION}.amazonaws.com/ecr-copy-lambda:latest