AWS surveillance débit et latence d’un VPN

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

  1. Créer une ec2 pouvant envoyer des pings à l’entité distante.
  2. Ajouter dans la zone user_data le script contenu dans l’annexe ci-dessous.
  3. Affecter un rôle à l’ec2 avec la policy CloudWatchAgentServerPolicy permettant à l’agent SSM de communiquer avec l’API correspondante.
  4. 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