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
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 :)
Commentaires