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 ?

Date de la dernière mise à jour : 28/01/2021

J'utilise des tâches sur des instances de conteneur Amazon Elastic Container Service (Amazon ECS) avec des Amazon Machine Images (AMI) Amazon Linux 1. Cependant, je ne peux pas démarrer des tâches sur des instances de conteneur Amazon ECS avec des AMI Linux 1 qui n'ont pas assez d'espace disque. Cela a lieu lorsque le processus Docker essaie d'obtenir l'image Docker au sein de mon répertoire d'images Docker, puis d'exécuter les tâches. Comment puis-je éviter ce problème ?

Brève description

Lors du démarrage d'une tâche avec le type de lancement Amazon Elastic Compute Cloud (Amazon EC2), Amazon ECS ne tient pas compte de la disponibilité de l'espace disque sur les instances de conteneur. Amazon ECS détermine où placer la tâche en fonction des exigences spécifiées dans la définition de tâche, comme le processeur, la mémoire et le port.

Pour résoudre ce problème, vous pouvez utiliser un script de surveillance d'espace disque qui surveille l'espace disque. Le script renvoie une valeur indiquant l'espace disque disponible sur les instances de conteneur Amazon ECS. La valeur renvoyée est associée à une instance de conteneur avec un attribut personnalisé. Le rôle AWS Identity and Access Management (IAM) associé au profil d'instance de conteneur doit avoir l'autorisation de mettre à jour cette valeur d'attribut personnalisé.

Ensuite, utilisez une définition de tâche pour spécifier une contrainte de placement de tâche qui restreint le placement de tâche pour les instances de conteneur qui n'ont pas assez 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.

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.

Remarque : si vous recevez des erreurs lors de l'exécution de commandes depuis l'interface de ligne de commande AWS (AWS CLI), assurez-vous d'utiliser la version la plus récente d'AWS CLI.

1.    Exécutez la commande suivante pour installer l'AWS CLI et les packages jq dans la section des données utilisateur de la configuration de lancement d'instance de conteneur. Pour plus d'informations, consultez la section ./jq sur la page Internet jq.

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": "*"
        }
    ]
}

Important : la stratégie ci-dessus utilise un paramètre générique, qui permet au mandataire d'appeler ecs:PutAttributes pour toutes les ressources compatibles (instances de conteneur) du compte. L'exemple permet de faciliter l'utilisation, mais il est préférable d'accorder le principe du moindre privilège lorsque cela est possible. Pour en savoir plus, consultez les exemples de stratégie basée sur l'identité Amazon Elastic Container Service. L'exemple de stratégie suivant limite l'appel aux instances de conteneur d'un cluster spécifique :

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

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.

Installez et exécutez 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"
    }
]

La définition de tâche associée a désormais une contrainte de placement qui restreint le placement de tâches pour les instances de conteneur qui n'ont pas assez d'espace disque.


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


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