Gestion des logs Elastic BeanStalk avec Cloudwatch et ElasticSearch – 1ère Partie

L’utilisation de SSH pour regarder les logs directement sur un serveur est ennuyeuse, surtout si vous travaillez avec une application dans un cluster: vous devez vérifier chaque machine avant de trouver la trace que vous recherchiez. Dans un environnement élastique (comme Elastic BeanStalk), c’est un travail plus difficile: il faut du temps récupérer le nom de domaine / IP de chacune vos instances et celles-ci n’ont aucune garantie de rester actives suffisament longtemps pour analyser leurs logs… Avec AWS, en configurant les bons outils, vous pouvez centraliser facilement vos journaux. Notamment grâce à Amazon CloudWatch Logs (pour lire chaque fichier de logs, de chaque instance EC2) et Amazon ElasticSearch Service (pour centraliser tous les fichiers journaux dans un seul endroit).

Stratégie de mise en place

Chaque EC2 déployée par Elastic Beanstalk sera configuré pour envoyer ses logs à CloudWatch Logs. Ensuite, chaque fichier de logs d’Amazon Cloudwatch Logs sera transféré dans une base de données ElasticSearch qui indexera toutes ces informations. Ces logs seront centralisés et consultables, avec Kibana.

Envoyer les logs applicatives à CloudWatch

Votre application déployée avec Elastic Beanstalk doit écrire dans les fichiers, les logs que vous attendez … une manière très classique! Un agent dédié nommé Cloudwatch Agent est configuré sur votre instance EC2 pour ce travail et diffusera, par défaut toutes les 5s et en fonction de vos fichiers, vos logs dans CloudWatch Logs.

Si vous n’utilisez pas Elastic Beanstalk, vous devriez l’installer manuellement (reportez-vous à la documentation Amazon sur ce sujet). Avec Elastic Beanstalk, l’agent Cloudwatch pourrait être installé et configuré automatiquement avec l’insertion de scripts dans le répertoire .ebextensions à la racine de votre Docker ou de tout fichier que vous déployez.

Vous pouvez ajouter des fichiers de configuration AWS Elastic Beanstalk (.ebextensions) au code source de votre application Web pour configurer votre environnement et personnaliser les ressources AWS qu’il contient. Les fichiers de configuration sont des documents formatés YAML avec une extension de fichier .config que vous placez dans un dossier nommé .ebextensions et déployez-vous dans votre module source d’application.

Setup the deployed application

Le repository Github suivant vous montrera une démo d’une application Docker Spring Boot, configurée pour que ses logs soient transférés sur CloudWatch Logs.

Dans le répertoire .ebextensions de ce repository Github, vous verrez les 4 fichiers suivants qui permettront à l’agent CloudWatch et transmet vos journaux aux journaux CloudWatch:

  • cwl-setup.config: configurez l’agent AWS CloudWatch sur vos instances EC2
  • eb-logs.config: configurez la publication du journal Elastic BeanStalk pour inclure les journaux d’administration pour les journaux de Cloudwatch.
  • cwl-springbootlogsapp.config: il contient la configuration pour trouver votre fichier de journaux d’applications. Modifiez ce fichier pour adapter le chemin / modèle à votre fichier journal.
  • cwl-webrequest-metrics.config: il contient la configuration pour produire des statistiques, en fonction de l’état HTTP, connecté par le serveur nginx (proxy par défaut pour les déploiements Docker).

Configurer les droits Elastic Beanstalk

L’utilisateur qui exécutera vos instances EC2 doit avoir les droits IAM pour gérer CloudWatch:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "logs:DescribeLogStreams"
    ],
      "Resource": [
        "arn:aws:logs:*:*:*"
    ]
  }
 ]
}

Visualiser vos fichiers de logs

Une fois votre application déployées avec les configurations contenu dans .ebxtensions et les droits appropriés dans AWS, connectez vous dans la console AWS à CloudWatch Logs. Vous pourrez alors voir chaque fichier dans ce que l’on appelle un Log Group.

Si vous cliquez sur un Log Group, vous verrez les Log Stream. Habituellement, vous avez un flux de connexion par instance de serveur et de fichier:

Et si vous cliquez sur un flux de connexion, vous pourrez lire vos logs applicatives

Aller plus loin

Maintenant, vous pouvez surveiller vos journaux dans votre console AWS. Comme on l’a vu, les journaux sont divisés en fichiers et serveurs. Pour une meilleure analyse, d’une application exécutée sur un environnement distribué/clusterisé, nous verrons dans un prochain article comment gérer cela avec ElasticSearch.