Une problématique classique dans AWS concerne la mesure de flux et de latence réseau lors de la communication avec des entités situées à l’extérieur du cloud. Et notamment lors de connexions utilisant un VPN.
AWS fournit de nombreux outils dans le but de nous aider à optimiser la supervision de nos déploiements dans son cloud.
Certains de ces outils sont disponibles sous forme d’un template d’ec2 installé par un « document » du Service System Manager.
Pour notre problématique, une solution existante est décrite dans cet article de blog https://aws.amazon.com/fr/premiumsupport/knowledge-center/vpc-packet-loss-latency-gateway/
Cependant, l’installation de cet outil via un « document », comme décrit dans l’article ci-dessus, est trop complexe à mon goût.
J’ai donc pris le parti de l’installer une fois, regarder comment AWS « s’y prend » et réaliser la même chose mais beaucoup plus simplement.
Principe
Une ec2 de type t3.nano envoie des pings toutes les minutes à un système situé à l’extérieur du cloud.
Dans notre cas, un serveur Windows situé dans un datacenter relié au cloud AWS avec un VPN.
Cette ec2 de type t3.nano est créée avec un user_data pouvant être ré-exécuté à chaque redémarrage de l’ec2 (ce n’est pas le comportement par défaut).
Ce champ user_data contient :
- la création d’un script shell contenant la commande ping utilisée pour tester la connexion. Le système distant doit être autorisé à répondre au ping envoyé par le script shell.
- La mise en crontab pour l’exécution de ce script shell toutes les minutes.
- L’installation d’un agent CloudWatch.
- la création d’un fichier de configuration pour que l’agent CloudWatch remonte les informations récoltées au service de supervision CloudWatch.
Installation
- Créer une ec2 pouvant envoyer des pings à l’entité distante.
- Ajouter dans la zone user_data le script contenu dans l’annexe ci-dessous.
- Affecter un rôle à l’ec2 avec la policy CloudWatchAgentServerPolicy permettant à l’agent SSM de communiquer avec l’API correspondante.
- Une fois l’ec2 lancée, un custom namespace, dont le nom est défini dans le script user_data est créé automatiquement dans CloudWatch. Des dashboards sont créés dans Cloudwatch à partir des données remontées depuis l’agent SSM de l’ec2 dans le namespace.
Résultat
Il vous reste à créer un dashboard dans CloudWatch pour visualiser les données remontées.
Annexe
Le script ci-dessous est à copier dans le champ user_data de l’ec2.
Deux paramètres sont à modifier dans le script pour l’adapter :
- ADRESSE_VPN dans la crontab : adresse du serveur à « pinguer »
- « log_group_name » dans le fichier .json de paramétrage de l’agent SSM : custom namespaces CloudWatch qui recevra les points de mesure.
Content-Type: multipart/mixed; boundary="//" MIME-Version: 1.0 --// Content-Type: text/cloud-config; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="cloud-config.txt" #cloud-config cloud_final_modules: - [scripts-user, always] --// Content-Type: text/x-shellscript; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="userdata.txt" #!/bin/bash ########### # installation de l'envoi des metriques VPN vers cloudwatch yum install -y amazon-cloudwatch-agent ##### echo '#!/bin/bash ping -s 56 -c 30 $1 | sed -e "1,$ s/^/ /" | sed "s/%//g" | tail -n 3 | sed "s#/# #g" >> /home/ec2-user/logs/ping64.$(date +\%Y\%m\%d\%H)' > /home/ec2-user/ping64.sh ########### echo '{ "agent": { "run_as_user": "root" }, "logs": { "logs_collected": { "files": { "collect_list": [ { "file_path": "/home/ec2-user/logs/ping64.*", "log_group_name": "/flux-vpn", "log_stream_name": "ping64", "auto_removal":true } ] } } } }' > /home/ec2-user/config.json ########### echo 'ADRESSE_VPN="192.168.3.1" * * * * * /home/ec2-user/ping64.sh $ADRESSE_VPN '> /home/ec2-user/crontab.txt crontab -u ec2-user /home/ec2-user/crontab.txt mkdir /home/ec2-user/logs 2>/dev/null chmod u+x /home/ec2-user/*.sh chown ec2-user:ec2-user /home/ec2-user/* ########### /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/home/ec2-user/config.json -s