<section style="text-align: center;"> # AGENTS AWS #### PF-790 12/04/2022 --- <section style="text-align: left;"> ## Objectifs - Etudier les agents proposés par AWS pour : - collecter des métriques/logs - les envoyer dans un outil centralisé (Cloudwatch) pour alerting et analyse. --- <section style="text-align: left;"> ## CWAgent Le seul agent proposé par AWS pour la collecte des métriques et logs est **Cloudwatch Agent** (CWAgent). --- <section style="text-align: left;"> ## Fonctionnalités CWAgent - Récupération/filtrage des métriques et logs - Envoi des métriques et logs dans Cloudwatch - Configuration unifiée - Interfaçage possible avec Collectd (Linux), Procstat, StatsD et Prometheus --- <section style="text-align: left;"> ## Installation CWAgent Il existe 3 [méthodes d'installation](https://docs.aws.amazon.com/fr_fr/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-on-EC2-Instance.html) pour CWAgent : - en ligne de commande - avec AWS Systems Manager - avec AWS CloudFormation --- <section style="text-align: left;"> ## Étapes procédure manuelle Le déploiement se déroule en plusieurs étapes : - **Préparation** - installation (si nécessaire) de gpg puis ajout de la clé servant à vérifier l'intégrité des packages - téléchargement du paquet CWAgent et de son fichier signature - vérification de l'intégrité du paquet - **Installation** - **Post-installation** - création d'un rôle IAM --- <section style="text-align: left;"> ## Étapes post-install Tous les droits sont définis dans un rôle IAM. - Les droits pour envoyer des métriques/logs nécessitent la policy `CloudWatchAgentServerPolicy`. - Les droits pour définir ou modifier la rétention des logs nécessitent une policy custom contenant : `"Effect": "Allow",` `"Action": "logs:PutRetentionPolicy"` Lorsque le rôle a été créé, il faut [l'attribuer à la VM](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/iam-roles-for-amazon-ec2.html#attach-iam-role). --- <section style="text-align: left;"> ## Configuration: les étapes Le fichier de configuration passe par differentes étapes : - un fichier (<!-- .element: style="font-size: .8em" -->`config.json`) généré par un wizard ou écrit à la main.<!-- .element: style="font-size: .8em" --> - l'outil amazon-cloudwatch-agent-ctl utilise ce fichier et génère un autre fichier json (<!-- .element: style="font-size: .8em" -->`file_config.json`).<!-- .element: style="font-size: .8em" --> - C'est le fichier qu'il faut reprendre si l'on souhaite changer sa configuration.<!-- .element: style="font-size: .8em" --> - au démarrage du service, ce fichier est transformé en un fichier toml (<!-- .element: style="font-size: .8em" -->`amazon-cloudwatch-agent.toml`).<!-- .element: style="font-size: .8em" --> - Il est regénéré à chaque démarrage du service<!-- .element: style="font-size: .8em" --> --- <section style="text-align: left;"> ## Configuration: le Wizard Le Wizard - présente un questionnaire pour faire le tour des paramètres configurables, avec 3 modes:<!-- .element: style="font-size: .7em" --> - basic - standard - advanced - génère un fichier <!-- .element: style="font-size: .7em" -->`config.json`.<!-- .element: style="font-size: .7em" --> Les modes correspondent à des jeux de [métriques prédéfinies](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/create-cloudwatch-agent-configuration-file-wizard.html). Le fichier `config.json` est toujours modifiable ultérieurement. --- <section style="text-align: left;"> ## Configuration : la mise en place #### Linux ``` sudo \ /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \ -a fetch-config -m ec2 -s -c file:config.json ``` #### Windows ``` & "C:\Program Files\Amazon\AmazonCloudWatchAgent... \amazon-cloudwatch-agent-ctl.ps1" -a fetch-config -m ec2 -s -c file:config.json ``` --- <section style="text-align: left;"> ## Mise à jour de la configuration - Récuperer le fichier de configuration <!-- .element: style="font-size: .8em" -->`file_config.json` (le copier ailleurs) depuis son répertoire :<!-- .element: style="font-size: .8em" --> - Linux: `/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/` - Windows: `C:\ProgramData\Amazon\AmazonCloudWatchAgent\Configs\` - Mettre à jour le fichier<!-- .element: style="font-size: .8em" --> - Relancer la commande de mise en place du service et de la configuration.<!-- .element: style="font-size: .8em" --> --- <section style="text-align: left;"> ## Principe démarrage du service - Le service CWAgent est défini comme un service du système d'exploitation. Il se lance et s'arrête donc simplement comme un service. - Au démarrage, il utilise le fichier de configuration `file_config.json` et génère un autre fichier au format toml (en l'écrasant). --- <section style="text-align: left;"> ## Empreinte de l'agent (CPU/MEM) - Linux - méthode utilisée: récupération des infos dans `/proc/<pid>/status` - memoire: 51M - cpu: 0.35% - Windows - méthode utilisée: [Process Explorer](https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer) - memoire: 12M - cpu: 0.01% --- <section style="text-align: left;"> ## Métriques applicatives - L'envoi de métriques applicatives se configure de la même manière sur Linux et Windows. - Le principe est d'utiliser un des protocoles implémentés par Cloudwatch Agent : - Procstat (Linux/Windows) - StatsD (Linux/Windows) - Collectd (Linux) - Prometheus (Linux/Windows) --- <section style="text-align: left;"> ## Métriques applicatives : test sur Linux - Configuration StatsD : ``` "statsd": { "metrics_aggregation_interval": 60, "metrics_collection_interval": 10, }, ``` - Script utilisé ``` while true; do n=$(expr $n + 1) echo "pf-760.metric:$n|c" | nc -w 1 -u localhost 8125 sleep 10 done ``` --- <section style="text-align: left;"> ## Résultat sur Linux ![](/uploads/upload_13cdc8769ca2e828eb0d719184d00588.png) --- <section style="text-align: left;"> ## Métriques applicatives : test sur Windows - Script utilisé ``` function Send-UdpDatagram { ... } $counter = 1; while($true){ "Send UDP test $counter" sleep 2 Send-UdpDatagram -EndPoint "127.0.0.1" -Port 8125 ` -Message "pf-790_metric_sleep_2:7|c" $counter++ } ``` --- <section style="text-align: left;"> ## Résultat sur Windows ![](/uploads/upload_ae4508e302f4fc95f21420d8115e42cc.png) --- <section style="text-align: left;"> ## Envoi de logs - L'envoi de logs se [configure](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html#CloudWatch-Agent-Configuration-File-Logssection) dans le même fichier que les métriques - Les logs peuvent être extraites de - fichiers (Windows/Linux) - Windows Events (Windows) - Journald (Linux) n'est pas documenté au moment de cette étude (avril 2022) - Il n'y a pas de notion de logs système ou logs applicatives --- <section style="text-align: left;"> ## Filtrage des métriques - Il n'y a pas de notion de filtrage de métriques. - La configuration de la récupération des métriques est effectuée de façon déclarative (il suffit de ne pas les déclarer pour ne pas les collecter). --- <section style="text-align: left;"> ## Filtrage des logs - Au niveau des fichiers de logs, il n'y a pas de notion de filtrage. - La configuration de la récupération des logs est effectuée de façon déclarative (il suffit de ne pas les déclarer pour ne pas les collecter). - Il est possible de filtrer à l'intérieur d'un fichier de logs ou de Windows Events. --- <section style="text-align: left;"> ## Filtrage des logs d'une même source - Il est possible de filtrer les lignes de logs à l'intérieur d'un fichier de logs ou de Windows Events. - Il contient une liste de filtres à base d'expressions régulières et de *include* et *d'exclude*. --- <section style="text-align: left;"> ## Filtrage de logs : exemple Exemple de configuration ``` "filters": [ { "type": "exclude", "expression": "Firefox" }, { "type": "include", "expression": "P(UT|OST)" } ] ``` --- <section style="text-align: left;"> ## Limitations CWAgent (1/2) - **Limitations à l'installation** - il n’y a pas de repo deb/rpm à ajouter sur Linux pour pouvoir faire un <!-- .element: style="font-size: .7em" -->`apt-get install`.<!-- .element: style="font-size: .7em" --> - il y a une certaine complexité pour la configuration de l’agent (la manipulation des fichiers de configuration JSON est fastidieuse et sujet aux erreurs).<!-- .element: style="font-size: .7em" --> - **Limitations coûts** - les coûts grimpent rapidement (le coût dépend de la fréquence de collecte des métriques et du nombre de métriques collectées).<!-- .element: style="font-size: .7em" --> - Il existe un grand nombre de paramètres qui affectent les coûts de CloudWatch et cela peut devenir extrêmement complexe de les chiffrer même avec une surveillance de base.<!-- .element: style="font-size: .7em" --> --- <section style="text-align: left;"> ## Limitations CWAgent 2/2 - **Limitations mode opérationel** - CWAgent ne présente pas de métriques intrinsèques. Pour diagnostiquer un problème sur l’agent, nous ne disposons que des logs et celles-ci sont peu explicites.<!-- .element: style="font-size: .7em" --> - **Autres limitations** - logs : Journald n’est pas supporté sur Linux<!-- .element: style="font-size: .7em" --> - mise à jour de l’agent :<!-- .element: style="font-size: .7em" --> - il n’y a aucun processus permettant de signaler que l’agent est obsolète. - la mise à jour n'est pas documentée. --- ## Tableau récapitulatif ![](/uploads/upload_2208c6da2543c66aea94ffb727661596.png) --- <section style="text-align: left;"> ## Conclusions - Ça marche - C'est bien documenté - Nous n'avons pas identifié de limites insurmontables - Dans nos idées de cas d'usages, il y avait toujours une solution sur AWS - Le support de plusieurs protocoles externes permet un interfaçage facilité. --- <section style="text-align: left;"> ## Liens : * [Référence de l'étude dans Confluence](https://confluence.corp.cloudwatt.com/pages/viewpage.action?spaceKey=CAAS&title=Agents+AWS) * [Documentation de l'agent Cloudwatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html) --- <section style="text-align: left;"> ## Questions ... et sinon, merci pour votre attention :slightly_smiling_face: <style type="text/css"> p { font-size: smaller; } .reveal ul ul li { font-size: smaller; } .reveal ol li { font-size: smaller; } .reveal ol li ul li { font-size: smaller; } .reveal section { text-align: left; } } .reveal h3 { color: orange; text-align: center; border-bottom: 1px solid orange; } .reveal h2 { color: orange; text-align: center; border-bottom: 1px solid orange; } .reveal h1 { color: orange; text-align: center; border-bottom: 1px solid orange; margin-bottom: 0.4em; } .reveal code { color: aquamarine; font-size: smaller; } </style>
{"type":"slide","slideOptions":{"transition":"slide","center":true}}