Como resolvo o erro “CannotPullContainerError: Você atingiu seu limite de taxa de extração” no Amazon ECS?

9 minuto de leitura
0

Quando tento extrair imagens do Docker Hub, minha tarefa do Amazon Elastic Container Service (Amazon ECS) falha com o seguinte erro: “CannotPullContainerError: a inspeção da imagem foi repetida 5 vezes: httpReaderSeeker: falha na abertura: código de status inesperado https://registry-1.docker.io/v2/manifests/sha256:2bb501e6429 Muitas solicitações - Mensagem do servidor: toomanyrequests: Você atingiu seu limite de taxa de extração. Você pode aumentar o limite autenticando e atualizando: https://www.docker.com/increase-rate-limit”

Breve descrição

Esse erro ocorre quando você tenta extrair uma imagem do repositório do Docker Hub público (no site do Docker Hub) depois de atingir o limite de taxa de extração do Docker (do site do Docker Hub). Exceder seu limite de taxa retorna um código de status HTTP de 429. O Docker Hub usa endereços IP para autenticar os usuários, e os limites da taxa de extração são baseados em endereços IP individuais. Para usuários anônimos, o limite de taxa é definido como 100 extrações a cada seis horas por endereço IP. Para usuários autenticados com um Docker ID, a taxa de extração é definida como 200 extrações a cada período de seis horas. Se sua solicitação de extração de imagens exceder esses limites, o Amazon ECS negará essas solicitações até que a janela de seis horas termine. Se você estiver executando seu workload do Amazon ECS ou do Amazon Elastic Kubernetes Service (Amazon EKS), os dados serão extraídos por meio de um gateway NAT com um endereço IP fixo. Nesse caso, a solicitação é limitada quando você excede o limite de extração.

Use o runbook AWSSupport-TroubleshootecstaskFailedToStart para solucionar os erros das tarefas do Amazon ECS que falham ao iniciar. Essa automação analisa as seguintes configurações:

  • Conectividade de rede com o registro de contêiner configurado
  • Permissões ausentes do AWS Identity and Access Management (AWS IAM) exigidas pelo perfil de execução
  • Conectividade de endpoint de nuvem privada virtual (VPC)
  • Configuração de regras do grupo de segurança
  • Referências de segredos do AWS Secrets Manager
  • Configuração de registro

Resolução

Importante:

  • Use o runbook AWSSupport-TroubleshootecstaskFailedToStart na mesma região da AWS em que seus recursos de cluster do ECS estão localizados.
  • Ao usar o runbook, você deve usar o ID de tarefa que falhou mais recentemente. Se a tarefa com falha fizer parte do Amazon ECS, use a tarefa que falhou mais recentemente no serviço. A tarefa com falha deve estar visível em ECS:DescribeTasks durante a execução da automação. Por padrão, as tarefas interrompidas do ECS ficam visíveis por uma hora após entrarem no estado Interrompido. O uso da ID de tarefa que falhou mais recentemente impede que a limpeza do estado da tarefa interrompa a análise durante a automação.

Observação: se o resultado do runbook não fornecer recomendações, use uma das abordagens manuais de solução de problemas na seção a seguir.

Para executar o runbook AWSSupport-TroubleshootECSTaskFailedToStart:

1.    Abra o console do AWS Systems Manager.

2.    No painel de navegação, em Change Management (Gerenciamento de Alterações), escolha Automation (Automação).

3.    Escolha Execute automation (Executar automação).

4.    Escolha a guia Owned by Amazo (Propriedade da Amazon).

5.    Em Automation document (Documento de automação), pesquise por TroubleshootECSTaskFailedToStart.

6.    Selecione o cartão AWSSupport-TroubleshootECSTaskFailedToStart.
Observação: certifique-se de selecionar o botão de opção no cartão e não o nome da automação com hiperlink.

7.    Escolha Next (Avançar).
Observação: Após a execução, os resultados da análise são preenchidos na seção Saída global. No entanto, aguarde até que o status do documento passe para Sucesso. Além disso, observe todas as exceções na seção Saída.

8.    Para Execute automation document (Executar documento de automação), escolha Simple execution (Execução simples).

9.    Na seção Input parameters (Parâmetros de entrada), em AutomationAssumeRole, insira o ARN do perfil que permite ao Systems Manager Automation executar ações.
**Observação:**certifique-se de que o AutomationAssumeRole ou o perfil ou usuário do IAM tenham as permissões de IAM necessárias para executar o runbook AWSSupport-TroublesotecstaskFailedToStart. Se você não especificar um perfil do IAM, o Systems Manager Automation usará as permissões do usuário ou do perfil do IAM que executa o runbook. Para mais informações sobre como criar o perfil de obtenção para o Systems Manager Automation, consulte Tarefa 1: Criar um perfil de serviço para automação.

10.    Em ClusterName, insira o nome do cluster em que a tarefa falhou ao iniciar.

11.    Em TaskId, insira a identificação da tarefa que falhou mais recentemente.

12.    Escolha Execute (Executar)

Com base na saída da automação, use uma das seguintes etapas manuais de solução de problemas.

Copie imagens públicas em um registro privado do Amazon ECR

Crie um repositório do Amazon Elastic Container Registry (Amazon ECR) e, em seguida, envie a imagem para esse novo repositório. Ao extrair as imagens do repositório Amazon ECR, você pode evitar exceder o limite de extração do Docker Hub.

1.    Execute um comando semelhante ao seguinte para extrair a imagem do Docker Hub:

docker pull example-image

2.    Execute um comando semelhante ao seguinte para autenticar seu cliente Docker para acessar o registro do Amazon ECR:

aws ecr get-login-password --region eu-west-1 | docker login --username AWS --password-stdin 1111222233334444.dkr.ecr.eu-west-1.amazonaws.com

3.    Execute um comando semelhante ao seguinte para marcar a imagem a ser enviada ao seu repositório:

docker tag myrepository:latest 1111222233334444.dkr.ecr.eu-west-1.amazonaws.com/myrepository:latest

4.    Execute um comando semelhante ao seguinte para enviar a imagem do Docker para um registro do Amazon ECR:

docker push 1111222233334444.dkr.ecr.eu-west-1.amazonaws.com/myrepository:latest

5.    Execute um comando semelhante ao seguinte para atualizar o arquivo do Docker para usar a imagem recém enviada do Amazon ECR como imagem base:

FROM 1111222233334444.dkr.ecr.eu-west-1.amazonaws.com/myrepository:tag

Nos comandos anteriores, substitua os seguintes valores pelos seus próprios valores:

  • example-image com o nome da imagem pública que você deseja enviar
  • 1111222233334444 com o ID da sua conta
  • **myrepository:latest ** com o nome do seu registro do Amazon ECR
  • eu-west-1 com a região de sua escolha

Autenticação da extração do Docker Hub

Ao se autenticar com o Docker Hub, você tem mais limites de taxa como usuário autenticado e a taxa é limitada com base no nome de usuário do Docker. Armazene seu nome de usuário e senha do Docker Hub como um segredo no AWS Secrets Manager e, em seguida, use esse segredo para se autenticar no Docker Hub.

Crie um segredo do Secrets Manager para credenciais do Docker Hub

Para criar um segredo para suas credenciais do Docker Hub, use as instruções na seção To create a basic secret (Como criar um segredo básico) em Turning on private registry authentication (Ativação da autenticação do registro privado).

Atualize seu perfil do IAM para execução de tarefas

Para conceder à tarefa do Amazon ECS acesso ao segredo, adicione manualmente as permissões necessárias como uma política embutida no perfil de execução da tarefa.

1.    Abra o console do IAM.

2.    No painel de navegação, selecione Roles (Perfis).

3.    Pesquise na lista de perfis ecstaskExecutionRole e escolha o perfil para visualizar as políticas anexadas.

4.    Na guia Permissions (Permissões), escolha Add Permissions (Adicionar permissões) e, em seguida, escolha Create inline policy (Criar política embutida).

5.    Na página Criar política, escolha JSON e, em seguida, copie e cole a seguinte política:

{
	"Version": "2012-10-17",
	"Statement": [{
		"Effect": "Allow",
		"Action": [
			"secretsmanager:GetSecretValue",
			"kms:Decrypt"
		],
		"Resource": [
			"arn:aws:secretsmanager:eu-west-1:1111222233334444:secret:dockerhub-0knT",
			"arn:aws:kms:eu-west-1:1111222233334444:key/mykey"
		]
	}]
}

Na política anterior, substitua os seguintes valores pelos seus próprios valores:

  • 1111222233334444 com o ID da sua conta
  • eu-west-1 com a região de sua escolha
  • mykey com sua chave do AWS KMS

Observação: inclua KMS:Decrypt somente se sua chave usar uma chave personalizada do AWS Key Management Service (AWS KMS). Adicione o ARN para sua chave personalizada como um recurso.

6.    Escolha Review policy (Revisar política).

7.    Em Name (Nome), insira o nome da política (ECSSecrets).

8.    Escolha Create policy (Criar política).

Crie uma definição de tarefa que use o segredo para a autenticação do Docker

Siga as instruções em Creating a task definition using the classic console (Criação de uma definição de tarefa usando o console clássico) para criar sua definição de tarefa do Amazon ECS. Em Task execution role (Perfil de execução de tarefa), selecione o perfil do IAM para execução de tarefas que você atualizou na seção anterior.

Na seção Container definitions (Definições de contêiner), conclua as seguintes etapas:

1.     Escolha Add container (Adicionar contêiner).

2.    Em Container name (Nome do contêiner), insira o nome do seu contêiner.

3.     Em Image (Imagem), insira o nome da imagem ou inclua o caminho para sua imagem privada (exemplo: repository-url/image.tag).

4.    Escolha Private repository authentication (Autenticação de repositório privado).

5.    Para o Secrets Manager ARN or name (Nome ou ARN do Secrets Manager), insira o ARN do segredo que você criou.

6.    Escolha Add (Adicionar).

Crie um cluster do Amazon ECS e execute a tarefa do Amazon ECS

Crie um cluster do Amazon ECS. Em seguida, use a definição de tarefa que você criou para executar a tarefa.

Use o registro público do Amazon ECR para imagens de contêineres públicos

Identifique as imagens públicas que você está usando no arquivo do Docker. Use os filtros de pesquisa apropriados para pesquisar essas imagens na Galeria Pública do Amazon ECR. Você não precisa se autenticar para navegar nos repositórios públicos e extrair imagens. O Amazon ECR Public contém imagens básicas populares, incluindo sistemas operacionais, imagens publicadas pela AWS, complementos do Kubernetes e artefatos. Extraia imagens do registro público do Amazon ECR para evitar atingir o limite de taxa do Docker Hub.

Use essas imagens como fonte para a imagem do contêiner em sua definição de tarefa:

ContainerDefinitions: [
 {
 ...
 Image: 'public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest'
 ...
 }
 ]

Você também pode optar por usar essas imagens como imagem base em seu arquivo do Docker:

Docker File  
FROM public.ecr.aws/amazonlinux/amazonlinux:latest

Atualize para uma assinatura do Docker Pro ou Team

Se você precisar de mais extrações, atualize seu plano para uma assinatura Docker Pro ou Team que ofereça 50.000 extrações em um período de 24 horas. Para mais informações sobre planos de preços, consulte Pricing and subscriptions (Preços e assinaturas) (no site do Docker Hub).

Informações relacionadas

Preços do Amazon ECR

Service Quotas públicas do Amazon ECR

AWS OFICIAL
AWS OFICIALAtualizada há um ano