Comment éviter de placer des tâches sur des instances de conteneur Amazon ECS avec des AMI Amazon Linux 1 qui n'ont pas assez d'espace disque ?

Dernière mise à jour : 20/08/2020

Je ne peux pas démarrer des tâches sur des instances de conteneur Amazon Elastic Container Service (Amazon ECS) avec des Amazon Machine Images (AMI) Amazon Linux 1 qui ne disposent pas de suffisamment d'espace disque. Cela se produit lorsque le démon Docker essaie d'extraire l'image Docker de mon référentiel d'images Docker, puis d'exécuter les tâches.

Brève description

Lorsque vous lancez une tâche qui utilise le type de lancement Amazon Elastic Compute Cloud (Amazon EC2), Amazon ECS détermine où placer la tâche en fonction des exigences spécifiées dans la définition de tâche, telles que l'UC, la mémoire et le port. Amazon ECS ne prend pas en compte l'espace disque disponible sur les instances de conteneur.

Pour résoudre ce problème, vous pouvez utiliser un script de surveillance de l'espace disque qui contrôle l'espace disque, puis renvoie une valeur indiquant l'espace disque disponible sur les instances de conteneur Amazon ECS. Cette valeur est associée à l'instance de conteneur en tant qu'attribut personnalisé. Le rôle AWS Identity and Access Management (IAM) associé au profil d'instance de l'instance de conteneur doit avoir l'autorisation de mettre à jour cette valeur d'attribut personnalisé. Après avoir installé ce script, utilisez une définition de tâche pour spécifier une contrainte de placement de tâche qui évite le placement des tâches sur les instances de conteneur qui ne disposent pas de suffisamment d'espace disque.

Remarque : Amazon Linux 1 ne sera plus en charge à partir du 31 décembre 2020. Il est recommandé de migrer des charges de travail vers Amazon Linux 2 avant la fin du support.

Résolution

Lancez votre instance de conteneur avec une AMI Amazon Linux optimisée pour Amazon ECS

Important : il est recommandé de lancer des instances avec un groupe Auto Scaling configuré avec plusieurs zones de disponibilité. Vous pouvez ajouter des commandes pour amorcer les instances dans les données utilisateur de la configuration de lancement.

1.    Pour installer l'interface de ligne de commande AWS (AWS CLI) et les packages jq (obtenus sur lesite Web jq) dans la section des données utilisateur de la configuration de lancement de l'instance de conteneur, exécutez la commande suivante :

yum install -y aws-cli jq

Remarque : la section des données utilisateur amorce les instances Amazon EC2 en exécutant des commandes au lancement.

2.    Ouvrez la console IAM, puis créez la stratégie en ligne suivante :

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

Remarque : la stratégie en ligne accorde l'autorisation au rôle IAM associé au profil d'instance IAM attaché à l'instance de conteneur.

3.    Associez la stratégie en ligne au rôle IAM ecsInstanceRole.

Remarque : l'autorisation IAM associe l'attribut personnalisé SpaceLeft à l'instance de conteneur à l'aide de la commande aws ecs put-attribute dans l'interface de ligne de commande AWS. L'attribut personnalisé SpaceLeft est calculé par le script de surveillance de l'espace disque.

Installer et exécuter le script de surveillance de l'espace disque sur l'instance de conteneur Amazon ECS

1.    Pour surveiller l'espace disque (en Go) de votre cluster, installez le script suivant sur l'instance de conteneur :

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

Remarque : vous pouvez nommer le script diskspaceMonitoring.sh, puis l'ajouter au chemin /home/ec2-user/diskspaceMonitoring.sh sur chaque instance de conteneur Amazon ECS de votre cluster. Vous pouvez également spécifier le script de surveillance de l'espace disque comme appartenant aux données utilisateur sur la configuration de lancement de l'instance de conteneur.

2.    Sur l'instance de conteneur, exécutez le script suivant :

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

Remarque : vous pouvez exécuter le script régulièrement dans le cadre d'une tâche cron à un intervalle d'une minute. Vous pouvez également choisir un intervalle de temps différent. Vous pouvez ajouter le script aux données utilisateur de votre configuration de lancement.

3.    Ouvrez la console Amazon ECS, puis créez une contrainte de placement de tâche avec votre définition de tâche Amazon ECS. Par exemple :

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

Remarque : la définition de tâche associée a désormais une contrainte de placement qui évite le placement des tâches sur les instances de conteneur qui n'ont pas suffisamment d'espace disque.


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?