¿Cómo puedo evitar colocar tareas en instancias de contenedor de Amazon ECS con AMI de Amazon Linux 1 que no cuentan con suficiente espacio en disco?

6 minutos de lectura
0

Utilizo instancias de contenedor de Amazon Elastic Container Service (Amazon ECS) con imágenes de máquina de Amazon (AMI) de Amazon Linux 1. Sin embargo, no puedo iniciar tareas en instancias de contenedor de Amazon ECS con AMI de Linux 1 que no cuentan con suficiente espacio en disco. Esto sucede cuando el daemon de Docker intenta extraer la imagen de Docker de mi repositorio de imágenes de Docker y, luego, ejecutar las tareas. ¿Cómo puedo evitar este problema?

Descripción breve

Al iniciar una tarea con el tipo de lanzamiento de Amazon Elastic Compute Cloud (Amazon EC2), Amazon ECS no tiene en cuenta la disponibilidad de espacio en disco en las instancias de contenedor. Amazon ECS determina dónde colocar la tarea, según los requisitos especificados en la definición de tarea, tales como la CPU, la memoria y el puerto. Para resolver este problema, puede utilizar un script de supervisión de espacio en disco que supervise el espacio en disco. El script devuelve un valor que muestra el espacio en disco disponible en las instancias de contenedor de Amazon ECS. El valor que devuelve se asocia a una instancia de contenedor como atributo personalizado. El rol de AWS Identity and Access Management (IAM) asociado al perfil de instancia de contenedor tiene que tener permiso para actualizar este valor de atributo personalizado.

A continuación, utilice una definición de tarea para especificar una restricción de ubicación de tareas que restrinja la ubicación de las tareas en instancias de contenedor que no cuentan con suficiente espacio en disco.

Nota: El soporte de Amazon Linux 1 finaliza el 31 de diciembre de 2020. Se recomienda migrar las cargas de trabajo a Amazon Linux 2 antes de que finalice el soporte.

Resolución

Lanzamiento de su instancia de contenedor con una AMI de Amazon Linux optimizada para Amazon ECS

Importante: Se recomienda lanzar instancias con un grupo de escalamiento automático configurado con varias zonas de disponibilidad. Puede añadir comandos para arrancar las instancias en los datos de usuario de la configuración de lanzamiento.

Nota: Si recibe errores al ejecutar los comandos de la Interfaz de línea de comandos de AWS (AWS CLI), asegúrese de utilizar la versión más reciente de la AWS CLI.

1.    Ejecute el siguiente comando para instalar los paquetes AWS CLI y jq en la sección de datos de usuario de la configuración de lanzamiento de la instancia de contenedor. Para obtener más información, consulte ./jq en el sitio web de jq.

yum install -y aws-cli jq

Nota: La sección de datos de usuario lanza las instancias de Amazon EC2 mediante la ejecución de comandos en el momento del lanzamiento.

2.    Abra la consola de IAM y, a continuación, cree la siguiente política insertada:

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

Importante: La política anterior utiliza un parámetro comodín que permite a la entidad principal llamar a ecs:PutAttributes para cualquier recurso compatible (instancias de contenedor) de la cuenta. El ejemplo se ofrece para facilitar el uso, pero se recomienda conceder privilegios mínimos cuando sea posible. Para obtener más información, consulte Ejemplos de políticas basadas en la identidad de Amazon Elastic Container Service. La siguiente política de ejemplo limita la llamada solo a las instancias de contenedor de un clúster específico:

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

3.    Asocie la política insertada con el rol de IAM ecsInstanceRole.

Nota: El permiso de IAM asocia el atributo personalizado SpaceLeft a la instancia de contenedor mediante el comando aws ecs put-attribute en AWS CLI. El atributo personalizado SpaceLeft se calcula mediante el script de supervisión del espacio en disco.

Instalación y ejecución del script de supervisión del espacio en disco en la instancia de contenedor de Amazon ECS

1.    Para supervisar el espacio en disco (en GB) de su clúster, instale el siguiente script en la instancia de contenedor:

#! /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"

Nota: Puede asignar al script el nombre diskspaceMonitoring.sh y, a continuación, añadirlo a la ruta /home/ec2-user/diskspaceMonitoring.sh en cada instancia de contenedor de Amazon ECS de su clúster. También puede especificar el script de supervisión del espacio en disco como parte de los datos de usuario en la configuración de lanzamiento de la instancia de contenedor.

2.    En la instancia de contenedor, ejecute el siguiente script:

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

Nota: Puede ejecutar el script periódicamente como parte de un trabajo cron con un intervalo de un minuto. También puede elegir un intervalo de tiempo diferente. Puede añadir el script a los datos de usuario de su configuración de lanzamiento.

3.    Abra la consola de Amazon ECS y, a continuación, cree una restricción de ubicación de tareas con su definición de tareas de Amazon ECS. Por ejemplo:

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

La definición de tarea asociada ahora posee una restricción de ubicación que restringe la ubicación de las tareas en instancias de contenedor que no cuentan con suficiente espacio en disco.


Información relacionada

CannotCreateContainerError: API error (500): devmapper

Configuración de almacenamiento de AMI

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 3 años