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 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
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
| Tarefa | Description | Habilidades necessárias |
|---|
Configure AWS CLI perfis. | Configure o perfil da conta de origem: aws configure --profile source-account
# Enter: Access Key ID, Secret Access Key, Default region, Output format (json)
Configure o perfil da conta de destino: aws configure --profile destination-account
# Enter: Access Key ID, Secret Access Key, Default region, Output format (json)
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. | 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"
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"
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"
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 |
| Tarefa | Description | Habilidades 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. | 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
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. | 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
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 |
| Tarefa | Description | Habilidades necessárias |
|---|
Prepare o desenvolvimento do contêiner. | Verifique se o Docker está em execução: docker --version
docker info
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. | Crie a imagem do contêiner do Lambda: docker build -t ecr-copy-lambda . --no-cache
Verifique se a imagem foi criada: docker images ecr-copy-lambda
(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. | 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
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
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
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
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. | Liste as imagens presentes no repositório: aws ecr list-images \
--repository-name ecr-copy-lambda \
--profile source-account \
--region $SOURCE_REGION
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 |
| Tarefa | Description | Habilidades necessárias |
|---|
Prepare os parâmetros de implantação. | Configure o e-mail de notificação: export NOTIFICATION_EMAIL="your-email@company.com"
Defina os repositórios a serem copiados (separados por vírgulas): export REPOSITORY_LIST="app-frontend,app-backend,database-migrations"
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. | 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
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. | 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
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. | Verifique seu e-mail para confirmar a inscrição no SNS. Clique no link de confirmação presente no e-mail. 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 |
| Tarefa | Description | Habilidades necessárias |
|---|
Execute e monitore o processo de cópia. | Faça login no Console de gerenciamento da AWS e abra o console Step Functions. Localize a máquina de estado. Selecione Iniciar execução. Quando a execução terminar, os resultados serão exibidos na guia Entrada e saída de execução. (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. | Gere um nome exclusivo: export EXECUTION_NAME="ecr-copy-$(date +%Y%m%d-%H%M%S)"
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. | 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
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. | Liste os repositórios presentes na conta de destino: aws ecr describe-repositories \
--profile destination-account \
--region $DEST_REGION \
--query 'repositories[].repositoryName' \
--output table
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
| Problema | Solução |
|---|
Não foi possível executar o Step Functions. | 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
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
|