Como posso evitar a colocação de tarefas em instâncias de contêiner do Amazon ECS com AMIs do Amazon Linux 1 que não têm espaço em disco suficiente?

5 minuto de leitura
0

Uso instâncias de contêiner do Amazon Elastic Container Service (Amazon ECS) com imagens de máquina da Amazon (AMIs) Amazon Linux 1. No entanto, não consigo iniciar tarefas em instâncias de contêiner do Amazon ECS com AMIs do Linux 1 que não tenham espaço em disco suficiente. Isso acontece quando o daemon do Docker tenta extrair a imagem do Docker do meu repositório de imagens do Docker e, em seguida, executar as tarefas. Como posso evitar esse problema?

Breve descrição

Ao iniciar uma tarefa usando o tipo de inicialização do Amazon Elastic Compute Cloud (Amazon EC2), o Amazon ECS não considera a disponibilidade de espaço em disco nas instâncias de contêiner. O Amazon ECS determina onde colocar a tarefa com base nos requisitos especificados na definição da tarefa, como CPU, memória e porta. Para resolver esse problema, você pode usar um script de monitoramento de espaço em disco. O script retorna um valor mostrando o espaço em disco disponível nas instâncias de contêiner do Amazon ECS. O valor retornado é associado a uma instância de contêiner como um atributo personalizado. O perfil do AWS Identity and Access Management (IAM) associado ao perfil de instância do contêiner deve ter permissão para atualizar esse valor de atributo personalizado.

Em seguida, use uma definição de tarefa para especificar uma restrição de posicionamento de tarefas que restrinja a colocação de tarefas em instâncias de contêiner que não têm espaço em disco suficiente.

Observação: O Amazon Linux 1 chega ao fim do suporte em 31 de dezembro de 2020. É uma prática recomendada migrar workloads para o Amazon Linux 2 antes do fim do suporte.

Resolução

Inicie sua instância de contêiner com uma Amazon Linux AMI otimizada para Amazon ECS

Importante: É uma prática recomendada iniciar instâncias com um grupo do Auto Scaling configurado com várias zonas de disponibilidade. Você pode adicionar comandos para inicializar as instâncias nos dados do usuário da configuração de inicialização.

Observação: Se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), certifique-se de estar usando a versão mais recente da AWS CLI.

1.    Execute o comando a seguir para instalar os pacotes AWS CLI e jq na seção de dados do usuário da configuração de inicialização da instância de contêiner. Para obter mais informações, consulte ./jq no site da jq.

yum install -y aws-cli jq

Observação: A seção de dados do usuário inicializa as instâncias do Amazon EC2 executando comandos na inicialização.

2.    Abra o console do IAM e, em seguida, crie a seguinte política em linha:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ecs:PutAttributes",
            "Resource": "*"
        }
    ]
}

Importante: A política acima usa um parâmetro curinga, que permite que a entidade principal chame ecs:PutAttributes para quaisquer recursos compatíveis (instâncias de contêiner) na conta. O exemplo é para facilitar o uso, mas é uma prática recomendada conceder o mínimo de privilégios quando possível. Para obter mais informações, consulte exemplos de políticas baseadas em identidade do Amazon Elastic Container Service. O exemplo de política a seguir limita a chamada somente a instâncias de contêiner em um cluster específico:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:PutAttributes"
            ],
            "Resource": [
                "arn:aws:ecs:<region>:<accountId>:container-instance/<clusterName>/*"
            ]
        }
    ]
}

3.    Associe a política em linha ao perfil do IAM ecsInstanceRole.

Observação: A permissão do IAM associa o atributo personalizado SpaceLeft à instância de contêiner usando o comando aws ecs put-attribute na AWS CLI. O atributo personalizado SpaceLeft é calculado pelo script de monitoramento do espaço em disco.

Instale e execute o script de monitoramento de espaço em disco na instância de contêiner do Amazon ECS

1.    Para monitorar o espaço em disco (em GB) do seu cluster, instale o seguinte script na instância de contêiner:

#! /usr/bin/env bash
set -o pipefail
set -o nounset
set -o errexit

until curl -s http://localhost:51678/v1/metadata
do
   sleep 1
done

clusterName=$(curl -s http://localhost:51678/v1/metadata | jq .Cluster | tr -d '"' )
SpaceLeft=$(docker info | grep 'Data Space Available' | cut -d':' -f2)
Unit=$(echo "$SpaceLeft" | grep -o '..$')
if [ "$Unit" != GB ]; then
    SpaceLeft=$(echo "$SpaceLeft" | sed 's/[A-Za-z]*//g' | cut -d '.' -f1)
    SpaceLeftValue=$(echo "$SpaceLeft" | awk '{$1=$1/(1000); print $1;}')
else
        SpaceLeftValue=$(echo "$SpaceLeft" | sed 's/[A-Za-z]*//g')
fi

instanceArn=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F/ '{print $NF}' )
region=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F: '{print $4}')

aws ecs put-attributes \
  --cluster "$clusterName" \
  --attributes name="SpaceLeft",value="$SpaceLeftValue",targetType="container-instance",targetId="$instanceArn" \
  --region "$region"

Observação: Você pode nomear o script como diskspaceMonitoring.sh e depois adicioná-lo ao caminho /home/ec2-user/diskspaceMonitoring.sh em cada instância de contêiner do Amazon ECS em seu cluster. Você também pode especificar o script de monitoramento do espaço em disco como parte dos dados do usuário na configuração de inicialização da instância de contêiner.

2.    Na instância de contêiner, execute o seguinte script:

$echo "* * * * * root /home/ec2-user/diskspaceMonitoring.sh" >> /etc/crontab

Observação: Você pode executar o script periodicamente como parte de um trabalho cron em um intervalo de um minuto. Você também pode escolher um intervalo de tempo diferente. Você pode adicionar o script aos dados do usuário em sua configuração de inicialização.

3.    Abra o console do Amazon ECS e, em seguida, crie uma restrição de posicionamento de tarefas com sua definição de tarefa do Amazon ECS. Por exemplo:

"placementConstraints": [
    {
        "expression": "attribute:SpaceLeft >= 0.1",
        "type": "memberOf"
    }
]

A definição de tarefa associada agora tem uma restrição de posicionamento que restringe a colocação de tarefas em instâncias de contêiner que não têm espaço em disco suficiente.


Informações relacionadas

CannotCreateContainerError: Erro de API (500): devmapper

Configuração de armazenamento AMI

AWS OFICIAL
AWS OFICIALAtualizada há 3 anos