Amazon Elastic Container Service (ECS)
Rapport de recherche Datadog : Bilan sur l'adoption de l'informatique sans serveur Rapport : Bilan sur l'adoption de l'informatique sans serveur

Amazon Elastic Container Service (ECS)

Crawler Crawler

Présentation

Amazon Elastic Container Service (ECS) est un service d’orchestration de conteneurs hautement évolutif et à hautes performances pour des conteneurs Docker s’exécutant sur des instances EC2.

Cette page aborde la configuration d’AWS ECS avec l’Agent de conteneur Datadog v6. Pour d’autres configurations, consultez les pages suivantes :

Configuration

Pour surveiller vos conteneurs et tâches ECS avec Datadog, exécutez l’Agent en tant que conteneur sur chaque instance EC2 de votre cluster ECS. Voici les différentes étapes de configuration à suivre :

  1. Ajouter une tâche ECS
  2. Créer ou modifier votre stratégie IAM
  3. Planifier l’Agent Datadog en tant que service Daemon

Si vous n’avez pas encore configuré un cluster EC2 Container Service, consultez la section de mise en route de la documentation ECS.

Collecte de métriques

Créer une tâche ECS

Cette tâche lance le conteneur Datadog. Si vous devez modifier la configuration, changez la définition de cette tâche en suivant les instructions indiquées plus loin dans ce guide. Si vous utilisez l’APM, DogStatsD ou des logs, définissez les flags appropriés dans la définition de la tâche :

  • Si vous utilisez l’APM, définissez portMappings afin que vos conteneurs en aval puissent transmettre des traces au service de l’Agent. L’APM reçoit les traces avec les ports 8126 et TCP. Configurez donc ces ports sur hostPort dans la définition de la tâche. Attention : pour activer la collecte de traces à partir d’autres conteneurs, vous devez vous assurer que la variable d’environnement DD_APM_NON_LOCAL_TRAFFIC est définie sur true. En savoir plus sur l’utilisation de l’APM avec des conteneurs.
  • Si vous utilisez DogStatsD, configurez un hostPort de 8125 en tant que UDP dans la définition de la tâche. Pour activer la collecte de métriques avec DogStatsD à partir d’autres conteneurs, vous devez vous assurer que la variable d’environnement DD_DOGSTATSD_NON_LOCAL_TRAFFIC est définie sur true.
  • Si vous utilisez des logs, consultez la documentation relative à la collecte de logs.

Vérifiez bien les réglages de groupe de sécurité pour vos instances EC2. Assurez-vous que ces ports ne sont pas publiquement accessibles. Datadog utilise une IP privée pour transmettre les données des conteneurs à l’Agent.

Vous pouvez configurer la tâche à l’aide des outils AWS CLI ou de la console Web d’Amazon.

  1. Téléchargez datadog-agent-ecs.json (datadog-agent-ecs1.json si vous utilisez une AMI Amazon Linux d’origine).
  2. Modifiez datadog-agent-ecs.json et remplacez <YOUR_DATADOG_API_KEY> par la clé d’API Datadog de votre compte.
  3. Facultatif : ajoutez un check de santé de l’Agent.
  4. Si vous êtes sur le site européen de Datadog, vous pouvez également modifier datadog-agent-ecs.json et remplacer DD_SITE par DD_SITE:datadoghq.eu.
  5. Vous pouvez activer la collecte de logs en consultant la rubrique dédiée.
  6. Enfin, vous pouvez activer la collecte de processus en consultant la rubrique dédiée.
  7. Exécutez la commande suivante :

    aws ecs register-task-definition --cli-input-json file://path/to/datadog-agent-ecs.json
Check de santé de l’Agent

Ajoutez le bloc suivant à la définition de votre tâche ECS pour créer un check de santé de l’Agent :

"healthCheck": {
  "retries": 3,
  "command": ["CMD-SHELL","agent health"],
  "timeout": 5,
  "interval": 30,
  "startPeriod": 15
}
  1. Connectez-vous à votre console AWS et accédez à la section EC2 Container Service.
  2. Cliquez sur le cluster pour lequel vous souhaitez ajouter Datadog.
  3. Cliquez sur Task Definitions sur le côté gauche, puis cliquez ensuite sur le bouton Create new Task Definition.
  4. Saisissez un Task Definition Name, tel que datadog-agent-task.
  5. Cliquez sur le lien Add volume.
  6. Pour Name, saisissez docker_sock. Pour Source Path, saisissez /var/run/docker.sock. Cliquez sur Add.
  7. Ajoutez un autre volume avec le nom proc et le chemin source /proc/.
  8. Ajoutez un autre volume avec le nom cgroup et le chemin source /sys/fs/cgroup/ (ou /cgroup/ si vous utilisez une AMI Amazon Linux d’origine).
  9. Cliquez sur le gros bouton Add container.
  10. Pour le champ Container name, saisissez datadog-agent.
  11. Pour le champ Image, saisissez datadog/agent:latest.
  12. Pour Maximum memory, indiquez 256. Remarque : en cas d’utilisation intense des ressources, il se peut que vous ayez besoin de rehausser la limite de mémoire.
  13. Faites défiler jusqu’à atteindre la section Advanced container configuration, puis saisissez 10 pour CPU units.
  14. Pour Env Variables, ajoutez la clé DD_API_KEY et indiquez votre clé d’API Datadog en valeur. Si vous préférez stocker ce type de secrets dans S3, consultez le guide de configuration d’ECS.
  15. Ajoutez une variable d’environnement supplémentaire pour chaque tag à ajouter en utilisant la clé DD_TAGS.
  16. Faites défiler jusqu’à atteindre la section Storage and Logging.
  17. Dans Mount points, sélectionnez le volume de source docker_sock et indiquez /var/run/docker.sock dans le chemin du conteneur. Cochez ensuite la case Read only.
  18. Ajoutez un point de montage supplémentaire pour proc et saisissez /host/proc/ dans le chemin du conteneur. Cochez la case Read only.
  19. Ajoutez un troisième point de montage pour cgroup et saisissez /host/sys/fs/cgroup dans le chemin du conteneur. Cochez la case Read only (utilisez /host/cgroup/ si vous utilisez une AMI Amazon Linux d’origine).

Remarque : si vous définissez la tâche Datadog de façon à utiliser 10 « CPU units », le paramètre aws.ecs.cpuutilization de service:datadog-agent peut afficher une exécution de 1 000 %. Cela est dû à une particularité de l’affichage de l’utilisation de processeur par AWS. Vous pouvez ajouter davantage de « CPU units » pour corriger votre graphique.

Créer ou modifier votre stratégie IAM

Ajoutez les autorisations suivantes à votre stratégie IAM Datadog afin de recueillir des métriques Amazon ECS. Pour en savoir plus sur les stratégies ECS, consultez la documentation du site Web d’AWS.

Autorisation AWSDescription
ecs:ListClustersRenvoie la liste des clusters existants.
ecs:ListContainerInstancesRenvoie la liste des instances de conteneur dans un cluster précis.
ecs:ListServicesÉnumère les services qui s’exécutent sur un cluster précis.
ecs:DescribeContainerInstancesDécrit les instances de conteneur Amazon ECS.

Exécuter l’Agent en tant que service Daemon

Dans l’idéal, l’Agent Datadog charge un conteneur sur chaque instance EC2. Pour y parvenir, nous vous conseillons d’exécuter l’Agent Datadog en tant que service Daemon.

Planifier un service Daemon dans AWS à l’aide de la tâche ECS de Datadog
  1. Connectez-vous à la console AWS et accédez à la section ECS Clusters. Cliquez sur le cluster sur lequel vous exécutez l’Agent.
  2. Cliquez sur le bouton Create sous « Services » pour créer un service.
  3. Pour le type de lancement, sélectionnez « EC2 », puis la définition de tâche précédemment créée.
  4. Sélectionnez le type de service DAEMON, puis saisissez un nom de service. Cliquez ensuite sur Next.
  5. Puisque le service s’exécute une fois sur chaque instance, vous n’avez pas besoin d’un répartiteur de charge. Sélectionnez None, puis cliquez sur Next.
  6. Les services Daemon n’ont pas besoin d’Auto Scaling. Vous pouvez donc cliquer sur Next Step, puis sur Create Service.

Détection dynamique et surveillance des services en cours d’exécution

La fonction Autodiscovery de Datadog peut être utilisée avec ECS et Docker afin de découvrir et surveiller automatiquement les tâches s’exécutant dans votre environnement.

Mode AWSVPC

Pour l’Agent v6.10+, le mode AWSVPC est pris en charge à la fois pour les conteneurs d’application et pour le conteneur de l’Agent, sous réserve des conditions suivantes :

  1. Pour les applications et l’Agent en mode AWSVPC, les groupes de sécurité doivent être configurés pour permettre :

    • au groupe de sécurité de l’Agent de se connecter aux conteneurs d’application sur les ports concernés.
    • au groupe de sécurité de l’Agent de se connecter aux instances du host sur le port TCP 51678. Le conteneur de l’Agent ECS doit s’exécuter en mode réseau host (par défaut) ou avoir un port lié au host.
  2. Pour les applications en mode AWSVPC et l’Agent en mode pont, les groupes de sécurité doivent être configurés de façon à autoriser le groupe de sécurité des instances de host à se connecter aux conteneurs d’application sur les ports concernés.

Collecte de tags de ressource

Pour collecter les tags de ressource ECS :

  1. Vérifiez que vos [instances de conteneur Amazon ECS][23] sont associées à un rôle IAM. Cette opération peut être effectuée lors de la création d’un cluster via l’assistant de création de clusters ECS ou via la configuration de lancement utilisée par un groupe autoscaling.
  2. Remplacez le rôle IAM utilisé par vos instances de conteneur Amazon ECS par : ecs:ListTagsForResource.
  3. Modifiez votre fichier datadog-agent-ecs.json (datadog-agent-ecs1.json si vous utilisez une AMI Amazon Linux d’origine) afin d’activer la collecte de tags de ressource en ajoutant la variable d’environnement suivante :

    {
      "name": "DD_ECS_COLLECT_RESOURCE_TAGS_EC2",
      "value": "true"
    }

Remarques

  • Vérifiez que votre rôle IAM est associé à vos instances de conteneur Amazon ECS et non pas à l’instance EC2 sous-jacente.
  • Les tags de ressource ECS peuvent être recueillis à partir des instances EC2, mais pas depuis AWS Fargate.
  • Cette fonctionnalité nécessite la version 6.17+ ou 7.17+ de l’Agent Datadog.
  • L’Agent prend en charge la collecte de tags ECS à partir des ressources ECS tasks, services et container instances.

Collecte de logs

Pour recueillir tous les logs écrits par des applications s’exécutant dans vos conteneurs ECS et les envoyer à votre application Datadog :

  1. Suivez les instructions ci-dessus pour installer l’Agent Datadog.
  2. Modifiez votre fichier datadog-agent-ecs.json (datadog-agent-ecs1.json si vous utilisez une AMI Amazon Linux d’origine) avec la configuration suivante :

    {
        "containerDefinitions": [
        (...)
          "mountPoints": [
            (...)
            {
              "containerPath": "/opt/datadog-agent/run",
              "sourceVolume": "pointdir",
              "readOnly": false
            },
            (...)
          ],
          "environment": [
            (...)
            {
              "name": "DD_LOGS_ENABLED",
              "value": "true"
            },
            {
              "name": "DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL",
              "value": "true"
            },
            (...)
          ]
        }
      ],
      "volumes": [
        (...)
        {
          "host": {
            "sourcePath": "/opt/datadog-agent/run"
          },
          "name": "pointdir"
        },
        (...)
      ],
      "family": "datadog-agent-task"
    }
  3. Assurez-vous que votre définition de conteneur ne contient pas de paramètre logConfiguration.logDriver de façon à ce que les logs soient écrits dans stdout/stderr et recueillis par l’Agent. Si ce paramètre est défini sur awslogs, recueillez vos logs Amazon ECS sans l’Agent en utilisant AWS Lambda pour recueillir les logs ECS à partir de CloudWatch.

Activer la collecte de logs pour des intégrations

L’attribut source est utilisé pour identifier l’intégration à utiliser pour chaque conteneur. Contournez-le directement dans vos étiquettes de conteneurs pour commencer à recueillir les logs d’une intégration. Lisez le guide sur Autodiscovery pour les logs de Datadog pour en savoir plus sur ce processus.

Collecte de processus

Pour recueillir des informations sur les processus pour l’ensemble de vos conteneurs et les envoyer à Datadog :

  1. Suivez les instructions ci-dessus pour installer l’Agent Datadog.
  2. Modifiez votre fichier datadog-agent-ecs.json (datadog-agent-ecs1.json si vous utilisez une AMI Amazon Linux d’origine) avec la configuration suivante :

    {
    "containerDefinitions": [
    (...)
      "mountPoints": [
        (...)
        {
          "containerPath": "/etc/passwd",
          "sourceVolume": "passwd",
          "readOnly": true
        },
        (...)
      ],
      "environment": [
        (...)
        {
          "name": "DD_PROCESS_AGENT_ENABLED",
          "value": "true"
        }
      ]
    }
    ],
    "volumes": [
    (...)
    {
      "host": {
        "sourcePath": "/etc/passwd"
      },
      "name": "passwd"
    },
    (...)
    ],
    "family": "datadog-agent-task"
    }

Collecte de traces

Après avoir installé l’Agent Datadog, activez la collecte de traces via l’une des méthodes suivantes :

  1. En configurant les paramètres suivants dans la définition de tâche pour le conteneur datadog/agent :

    • Mappage de port : host/conteneur port 8126, protocole tcp
    • Variables d’environnement : DD_APM_ENABLED=true, DD_APM_NON_LOCAL_TRAFFIC=true (cela active la collecte de traces depuis d’autres conteneurs).

    Consulter l’ensemble des variables d’environnement disponibles pour la collecte de traces via l’Agent.

  2. Attribuez l’adresse IP privée utilisée par chaque instance sous-jacente sur laquelle vos conteneurs sont exécutés dans votre conteneur d’application à la variable d’environnement DD_AGENT_HOST. Les traces de votre application seront ainsi transmises à l’Agent. L’endpoint de métadonnées d’Amazon EC2 peut être utilisé pour identifier l’adresse IP privée. Pour récupérer l’adresse IP privée de chaque host, effectuez un curl sur l’URL suivante :

    curl http://169.254.169.254/latest/meta-data/local-ipv4

Ensuite, définissez le résultat comme la variable d’environnement de hostname de votre Agent de trace pour chaque conteneur d’application qui transmet des traces à l’APM :

```text
os.environ['DD_AGENT_HOST'] = <EC2_PRIVATE_IP>
```

Si les variables de votre application ECS sont définies au moment du lancement, vous devez définir le hostname en tant que variable d’environnement avec DD_AGENT_HOST. Vous pouvez également définir le hostname dans le code source de votre application pour Python, Javascript ou Ruby. Pour Java et .NET, vous pouvez définir le hostname dans la tâche ECS. Par exemple :

import requests
from ddtrace import tracer


def get_aws_ip():
  r = requests.get('http://169.254.169.254/latest/meta-data/local-ipv4')
  return r.text

tracer.configure(hostname=get_aws_ip())

Pour découvrir comment définir le hostname de l’Agent dans d’autres langages, consultez les exemples de la section Modifier le hostname de l’Agent.

const tracer = require('dd-trace');
const request = require('request');

request('http://169.254.169.254/latest/meta-data/local-ipv4', function(
    error,
    resp,
    body
) {
    tracer.init({ hostname: body });
});

Pour découvrir comment définir le hostname de l’Agent dans d’autres langages, consultez les exemples de la section Modifier le hostname de l’Agent.

require 'ddtrace'
require 'net/http'

Datadog.configure do |c|
  c.tracer hostname: Net::HTTP.get(URI('http://169.254.169.254/latest/meta-data/local-ipv4'))
end

Copiez ce script dans le champ entryPoint de votre définition de tâche ECS en mettant à jour les valeurs avec le fichier JAR et les flags d’argument de votre application.

"entryPoint": [
  "sh",
  "-c",
  "export DD_AGENT_HOST=$(curl http://169.254.169.254/latest/meta-data/local-ipv4); java -javaagent:/app/dd-java-agent.jar <FLAGS_ARGUMENT_APPLICATION> -jar <FICHIER_JAR/FICHIER_WAR_APPLICATION>"
]

Pour découvrir comment définir le hostname de l’Agent dans d’autres langages, consultez les exemples de la section Modifier le hostname de l’Agent.

"entryPoint": [
  "sh",
  "-c",
  "export DD_AGENT_HOST=$(curl http://169.254.169.254/latest/meta-data/local-ipv4); dotnet ${APP_PATH}"
]

Données collectées

Métriques

aws.ecs.cpuutilization
(gauge)
Average percentage of CPU units that are used in the cluster or service.
Shown as percent
aws.ecs.cpuutilization.minimum
(gauge)
Minimum percentage of CPU units that are used in the cluster or service.
Shown as percent
aws.ecs.cpuutilization.maximum
(gauge)
Maximum percentage of CPU units that are used in the cluster or service.
Shown as percent
aws.ecs.memory_utilization
(gauge)
Average percentage of memory that is used in the cluster or service.
Shown as fraction
aws.ecs.memory_utilization.minimum
(gauge)
Minimum percentage of memory that is used in the cluster or service.
Shown as fraction
aws.ecs.memory_utilization.maximum
(gauge)
Maximum percentage of memory that is used in the cluster or service.
Shown as fraction
aws.ecs.service.cpuutilization
(gauge)
Average percentage of CPU units that are used in the service.
Shown as percent
aws.ecs.service.cpuutilization.minimum
(gauge)
Minimum percentage of CPU units that are used in the service.
Shown as percent
aws.ecs.service.cpuutilization.maximum
(gauge)
Maximum percentage of CPU units that are used in the service.
Shown as percent
aws.ecs.service.memory_utilization
(gauge)
Average percentage of memory that is used in the service.
Shown as fraction
aws.ecs.service.memory_utilization.minimum
(gauge)
Minimum percentage of memory that is used in the service.
Shown as fraction
aws.ecs.service.memory_utilization.maximum
(gauge)
Maximum percentage of memory that is used in the service.
Shown as fraction
aws.ecs.cluster.cpuutilization
(gauge)
Average percentage of CPU units that are used in the cluster.
Shown as percent
aws.ecs.cluster.cpuutilization.minimum
(gauge)
Minimum percentage of CPU units that are used in the cluster.
Shown as percent
aws.ecs.cluster.cpuutilization.maximum
(gauge)
Maximum percentage of CPU units that are used in the cluster.
Shown as percent
aws.ecs.cluster.memory_utilization
(gauge)
Average percentage of memory that is used in the cluster.
Shown as fraction
aws.ecs.cluster.memory_utilization.minimum
(gauge)
Minimum percentage of memory that is used in the cluster.
Shown as fraction
aws.ecs.cluster.memory_utilization.maximum
(gauge)
Maximum percentage of memory that is used in the cluster.
Shown as fraction
aws.ecs.cpureservation
(gauge)
Average percentage of CPU units that are reserved by running tasks in the cluster.
Shown as percent
aws.ecs.cpureservation.maximum
(gauge)
Maximum percentage of CPU units that are reserved by running tasks in the cluster.
Shown as percent
aws.ecs.cpureservation.minimum
(gauge)
Minimum percentage of CPU units that are reserved by running tasks in the cluster.
Shown as percent
aws.ecs.memory_reservation
(gauge)
Average percentage of memory that is reserved by running tasks in the cluster.
Shown as percent
aws.ecs.memory_reservation.minimum
(gauge)
Minimum percentage of memory that is reserved by running tasks in the cluster.
Shown as percent
aws.ecs.memory_reservation.maximum
(gauge)
Maximum percentage of memory that is reserved by running tasks in the cluster.
Shown as percent
aws.ecs.running_tasks_count
(gauge)
The number of tasks on the container instance that are in the RUNNING status.
aws.ecs.pending_tasks_count
(gauge)
The number of tasks on the container instance that are in the PENDING status.
aws.ecs.registered_cpu
(gauge)
The number of CPU units registered on the container instance
aws.ecs.remaining_cpu
(gauge)
The number of CPU units remaining on the container instance
aws.ecs.registered_memory
(gauge)
The number of Memory units registered on the container instance
aws.ecs.remaining_memory
(gauge)
The number of Memory units remaining on the container instance
aws.ecs.services
(gauge)
The number of services running per cluster
aws.ecs.service.pending
(gauge)
The number of tasks in the cluster that are in the pending state
aws.ecs.service.desired
(gauge)
The number of tasks in the cluster that are in the desired state
aws.ecs.service.running
(gauge)
The number of tasks in the cluster that are in the running state

Chacune des métriques récupérées à partir d’AWS se voit assigner les mêmes tags que ceux qui apparaissent dans la console AWS, y compris, mais sans s’y limiter, le hostname et les groupes de sécurité.

Événements

Pour réduire les données parasites, l’intégration AWS ECS est automatiquement configurée de façon à inclure les événements qui contiennent les termes suivants : drain, error, fail, insufficient memory, pending, reboot et terminate. Vous trouverez ci-dessous des exemples d’événement :

Pour supprimer ce filtre et recevoir tous les événements de votre intégration Datadog/AWS ECS, contactez l’assistance Datadog.

Checks de service

  • aws.ecs.agent_connected : renvoie CRITICAL si l’Agent n’est pas capable de se connecter. Si ce n’est pas le cas, renvoie OK.

Dépannage

Besoin d’aide ? Contactez l’assistance Datadog.

Pour aller plus loin

Documentation, liens et articles supplémentaires utiles: