Démarrage d'une tâche au moment du lancement d'une instance de conteneur - Amazon Elastic Container Service

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Démarrage d'une tâche au moment du lancement d'une instance de conteneur

En fonction de la conception de l'architecture de votre application, vous devrez peut-être exécuter un conteneur spécifique sur chaque instance de conteneur pour traiter les problèmes de sécurité et de fonctionnement, telles que la surveillance, la sécurité, les métriques, la découverte de service ou la journalisation.

Pour ce faire, vous pouvez configurer vos instances de conteneur de façon à ce qu'elles appellent la commande docker run avec le script de données utilisateur au moment du lancement ou dans un système d'initialisation comme Upstart ou systemd. Bien que cette méthode soit efficace, elle présente quelques inconvénients, étant donné qu'Amazon ECS n'a pas connaissance du conteneur et qu'il ne peut pas surveiller l'UC, la mémoire, les ports ni aucune autre ressource utilisée. Afin de veiller à ce qu'Amazon ECS prenne en compte correctement toutes les ressources de la tâche, vous devez créer une définition de tâche pour le conteneur que vous voulez exécuter sur vos instances de conteneur. Ensuite, utilisez Amazon ECS pour placer la tâche au moment du lancement avec les données utilisateur Amazon EC2.

Le script de données utilisateur Amazon EC2 de la procédure suivante utilise l'API d'introspection Amazon ECS pour identifier l'instance de conteneur. Ensuite, il utilise la start-task commande AWS CLI et pour exécuter une tâche spécifiée sur lui-même au démarrage.

Pour démarrer une tâche au moment du lancement d'une instance de conteneur
  1. Si vous ne l'avez pas déjà fait, créez une définition de tâche avec le conteneur que vous souhaitez exécuter sur votre instance de conteneur au moment du lancement en suivant les procédures décrites dans Création d'une définition de tâche à l'aide de la console.

  2. Modifiez votre rôle IAM ecsInstanceRole pour ajouter des autorisations pour l'opération d'API StartTask. Pour plus d’informations, consultez Rôle IAM d'instance de conteneur Amazon ECS.

    1. Ouvrez la console IAM à l’adresse https://console.aws.amazon.com/iam/.

    2. Dans le panneau de navigation, sélectionnez Rôles.

    3. Cliquez sur le bouton ecsInstanceRole. Si le rôle n'existe pas, utilisez la procédure de Rôle IAM d'instance de conteneur Amazon ECS pour créer le rôle et revenez ensuite à la procédure actuelle. Si le rôle existe, sélectionnez-le pour afficher les politiques attachées.

    4. Sous l'onglet Permissions (Autorisations), choisissez Add inline policy (Ajouter une politique en ligne).

    5. Pour Service, sélectionnez Choose a service (Choisir un service), Elastic Container Service.

    6. Pour Actions, tapez StartTaskdans le champ de recherche, puis sélectionnez StartTask.

    7. Pour Ressources, sélectionnez All resources (Toutes les ressources), puis choisissez Review policy (Examiner une politique).

    8. Sur la page Review policy (Examiner une politique), entrez le nom de votre politique, par exemple ecs-start-task, puis sélectionnez Create policy (Créer une politique).

  3. Lancez une ou plusieurs instances de conteneur avec l'AMI Amazon Linux 2 optimisée pour Amazon ECS en suivant la procédure décrite dans Lancement d'une instance de conteneur Amazon ECS Linux, mais dans Étape 7 copiez et coller le script de données utilisateur MIME en plusieurs parties ci-dessous dans le champ User data (Données utilisateur). Remplacez your_cluster_name par le cluster auprès duquel l'instance de conteneur est enregistrée et my_task_def par la définition de tâche à exécuter sur l'instance lors du lancement.

    Note

    Le contenu du fichier MIME en plusieurs parties ci-dessous utilise un script shell pour définir les valeurs de configuration et installer les packages. Il utilise également une tâche systemd pour démarrer la tâche après le lancement du service ecs et une fois que l'API d'introspection est disponible.

    Content-Type: multipart/mixed; boundary="==BOUNDARY==" MIME-Version: 1.0 --==BOUNDARY== Content-Type: text/x-shellscript; charset="us-ascii" #!/bin/bash # Specify the cluster that the container instance should register into cluster=your_cluster_name # Write the cluster configuration variable to the ecs.config file # (add any other configuration variables here also) echo ECS_CLUSTER=$cluster >> /etc/ecs/ecs.config START_TASK_SCRIPT_FILE="/etc/ecs/ecs-start-task.sh" cat <<- 'EOF' > ${START_TASK_SCRIPT_FILE} exec 2>>/var/log/ecs/ecs-start-task.log set -x # Install prerequisite tools yum install -y jq aws-cli # Wait for the ECS service to be responsive until curl -s http://localhost:51678/v1/metadata do sleep 1 done # Grab the container instance ARN and AWS Region from instance metadata instance_arn=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F/ '{print $NF}' ) cluster=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .Cluster' | awk -F/ '{print $NF}' ) region=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F: '{print $4}') # Specify the task definition to run at launch task_definition=my_task_def # Run the AWS CLI start-task command to start your task on this container instance aws ecs start-task --cluster $cluster --task-definition $task_definition --container-instances $instance_arn --started-by $instance_arn --region $region EOF # Write systemd unit file UNIT="ecs-start-task.service" cat <<- EOF > /etc/systemd/system/${UNIT} [Unit] Description=ECS Start Task Requires=ecs.service After=ecs.service [Service] Restart=on-failure RestartSec=30 ExecStart=/usr/bin/bash ${START_TASK_SCRIPT_FILE} [Install] WantedBy=default.target EOF # Enable our ecs.service dependent service with `--no-block` to prevent systemd deadlock # See https://github.com/aws/amazon-ecs-agent/issues/1707 systemctl enable --now --no-block "${UNIT}" --==BOUNDARY==--
  4. Vérifiez que vos instances de conteneur sont lancées dans le cluster approprié et que vos tâches ont démarré.

    1. Ouvrez la console à partir de l'adresse https://console.aws.amazon.com/ecs/v2.

    2. Dans la barre de navigation, sélectionnez la région dans laquelle se trouve votre cluster.

    3. Dans le panneau de navigation, choisissez Clusters, puis sélectionnez le cluster qui héberge vos instances de conteneur.

    4. Sur la page Cluster, choisissez Tâches, puis choisissez vos tâches.

      Chaque instance de conteneur que vous avez lancée doit comporter votre tâche en cours d'exécution.

      Si vous ne voyez pas vos tâches, vous pouvez vous connecter à vos instances de conteneur avec le protocole SSH et vérifier le fichier /var/log/ecs/ecs-start-task.log pour consulter les informations de débogage.