Loupe

Créer un serveur de log avec Docker, Elastic Search, Kibana and Nginx : hébergement Iaas dans Azure [part 2]

Dans mon précèdent article, nous avons déployé un serveur log “conteneurisé” sur une machine virtuelle Azure. Dans cette seconde partie, nous allons mettre à jour les fichiers Docker et le script de déploiement pour stocker les logs Elastic Search dans un partage de fichier Azure.

Cet article est le troisième d’une série nommée « Créer un serveur de log avec Docker, Elastic Search, Kibana et Nginx ». Pour avoir une bonne compréhension de cet article, il est conseillé de lire les deux précédents :

Utilisation du plugin Docker « cloudstor »

Avec la première basique de notre serveur de log, les logs générés par Elastic Search sont stockés sur le disque de la machine virtuelle. Une première amélioration consiste à stocker ces logs non pas sur le disque de la machine mais sur un disque de donnée. Une seconde option consiste à externaliser le stockage des logs en dehors de la machine virtuelle en utilisant le plugin docker nommé « cloudstor ». Ce dernier permet de monter un volume Docker sur un service de stockage de données dans Azure ou Amazon. Nous pouvons donc facilement héberger notre serveur de log sur l’un des deux fournisseurs de cloud.

Architecture Azure cible

1.PNG

Deux nouvelles variables (informations sur le compte de stockage)

La principale différence avec la première version du script est que nous voulons maintenant utiliser un compte de stockage pour stocker les logs. Nous avons donc besoin de deux nouvelles variables pour stocker le nom du compte de stockage (storageAccountName) et le nom du partage de fichier (storageAccountFileShareName).

Voici l’ensemble des variables utilisées dans le script :

rgName=''
vmName=''
vmUser=''
vmLocation=''
vmOpenPort=80 
storageAccountName=""
storageAccountFileShareName=""
passwordHash=''

Création du compte de stockage  et du partage de fichier

Dans un premier temps nous avons besoin d’une fonction qui va créer le compte de stockage Azure ainsi que le partage de fichier. Ce partage de fichier sera directement utilisé par cloudstor.

create_AzureStorageAndFileShare(){
 echo -- create the storage account
 az storage account create -n $storageAccountName -g $rgName -l $vmLocation --sku Standard_LRS
 storageConnexionString=$(az storage account show-connection-string -n $storageAccountName -g $rgName --query 'connectionString' -o tsv)
 storagePrimaryKey=$(az storage account keys list --resource-group $rgName --account-name $storageAccountName --query "[0].value" | tr -d '"')

 echo -- create the file share
 az storage share create --name $storageAccountFileShareName --connection-string $storageConnexionString
}

Nous utilisons la commande az storage account create pour créer le compte de stockage. Il faut lui passer le nom du compte (qui doit être unique). Ensuite nous récupérons la chaine de connexion et la clef d’accès au compte de stockage que nous utilisons pour créer le partage de fichier avec la commande az storage share create.

install_CloudstorePlugin (){
 echo install cloudstor plugin
 az vm run-command invoke -g $rgName -n $vmName --command-id RunShellScript --scripts "sudo docker plugin install docker4x/cloudstor:17.05.0-ce-azure2 --grant-all-permissions --alias cloudstor:azure CLOUD_PLATFORM=AZURE AZURE_STORAGE_ACCOUNT="$storageAccountName" AZURE_STORAGE_ACCOUNT_KEY="$storagePrimaryKey""
}

Nous utilisons la commande az vm run-command pour exécuter la commande docker plugin install sur le serveur de log distant. Pour configurer convenablement le plugin, il faut spécifier

  • La plateforme de cloud cible (ici Azure)
  • Le nom du compte de stockage
  • La clef d’accès au compte de stockage

Utilisation du plugin dans le fichier docker compose.

La dernière étape consiste à modifier le fichier docker-compose.yml pour qu’il utilise le plugin cloudstor.

version: '3'

services:
 elasticsearch:
   build : ./elasticsearch
   restart: always
   container_name: elasticsearch
   environment:
     - "discovery.type=single-node"
   networks:
     - net
   volumes:
     - esdata_azure:/usr/share/elasticsearch/data

 kibana:
   build : ./kibana
   restart: always
   container_name: kibana
   environment:
     SERVER_NAME : kibana
     ELASTICSEARCH_URL : http://elasticsearch:9200
   networks:
     - net

 proxy:
   build : ./nginx
   restart: always
   container_name : proxy
   ports:
     - "80:80"
   networks:
     - net

volumes:
   esdata_azure:
     driver: cloudstor:azure
     driver_opts:
      share: "logs"

networks:
   net:

Dans un premier temps, nous devons ajouter un volume nommé esdata_azure. Ce volume utilise le driver cloudstor et va être monté sur un partage de fichier nommé « logs ». (« logs » etant le nom du partage de fichier que nous créons sur Azure avec la fonction install_CloudstorePlugin).

Ensuite, au niveau du service elasticsearch, nous devons ajouter le mapping du volume : Le dossier interne du conteur /usr/share/elasticsearch/data sera monté sur le volume nommée esdata_azure.

Script final

Voici la nouvelle version du script de déploiement utilisant les deux nouvelles fonctions create_AzureStorageAndFileShare and install_CloudstorePlugin.

#!/bin/bash 

rgName=''
vmName=''
vmUser=''
vmLocation=''
vmOpenPort=80 
storageAccountName=""
storageAccountFileShareName=""
passwordHash=''

echo write the basic auth credentials in nginx file
echo $passwordHash > ./log_server/nginx/.htpasswd

create_AzureVm(){
 echo -- create the resource group
 az group create --name $rgName --location $vmLocation

 echo -- create the vm
 az vm create --resource-group $rgName --name $vmName --public-ip-address-dns-name $vmName --image UbuntuLTS --admin-username $vmUser --generate-ssh-keys

 echo -- open port $vmOpenPort on the vm
 az vm open-port --port $vmOpenPort --resource-group $rgName --name $vmName
}

install_DockerTools (){
 echo install dependencies docker, docker compose and start docker service
 #install Docker
 az vm run-command invoke -g $rgName -n $vmName --command-id RunShellScript --scripts "curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - && sudo add-apt-repository 'deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable' && sudo apt-get update && apt-cache policy docker-ce && sudo apt-get install -y docker-ce"
 #install Docker Compose
 az vm run-command invoke -g $rgName -n $vmName --command-id RunShellScript --scripts "sudo curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose && sudo chmod +x /usr/local/bin/docker-compose"
 #start Docker service
 az vm run-command invoke -g $rgName -n $vmName --command-id RunShellScript --scripts "sudo service docker start"
}

install_CloudstorePlugin (){
 echo install cloudstor plugin
 az vm run-command invoke -g $rgName -n $vmName --command-id RunShellScript --scripts "sudo docker plugin install docker4x/cloudstor:17.05.0-ce-azure2 --grant-all-permissions --alias cloudstor:azure CLOUD_PLATFORM=AZURE AZURE_STORAGE_ACCOUNT="$storageAccountName" AZURE_STORAGE_ACCOUNT_KEY="$storagePrimaryKey""
}

create_AzureStorageAndFileShare(){
 echo -- create the storage account
 az storage account create -n $storageAccountName -g $rgName -l $vmLocation --sku Standard_LRS
 storageConnexionString=$(az storage account show-connection-string -n $storageAccountName -g $rgName --query 'connectionString' -o tsv)
 storagePrimaryKey=$(az storage account keys list --resource-group $rgName --account-name $storageAccountName --query "[0].value" | tr -d '"')

 echo -- create the file share
 az storage share create --name $storageAccountFileShareName --connection-string $storageConnexionString
}

run_LogServer(){
 echo copy 'log_server' folder content in the remote vm
 scp -o StrictHostKeyChecking=no -r ./log_server $vmUser@$vmName.$vmLocation.cloudapp.azure.com:/home/$vmUser/log_server

 echo run 'docker-compose' file
 az vm run-command invoke --debug -g $rgName -n $vmName --command-id RunShellScript --scripts "cd /home/"$vmUser"/log_server && sudo docker-compose up -d"
}

create_AzureVm
install_DockerTools
create_AzureStorageAndFileShare
install_CloudstorePlugin
run_LogServer

echo log server available on $vmName.$vmLocation.cloudapp.azure.com

#clear [.htpasswd] file
echo "" > ./log_server/nginx/.htpasswd

Nous pouvons maintenant déployer un serveur de log qui stocke les données générés par elasticsearch dans un compte de stockage Azure. Il ne reste plus qu’à sécuriser l’accès à la machine virtuelle avec un certificat SSL !  

Le code source est disponible sur mon GitHub.

Happy coding :) 

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus