<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

---
<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

---
<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

---
<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>