Tips : Création de différents Load Balancers via des templates ARM

FÉVR23

Voici un nouvel article sur la création de ressources Azure en ARM, ici il va s’agir du Load Balancer, tout ceux qui en ont créé un via le portail Azure, savent qu’il s’agit d’une bonne heure de clic-o-drome.

Cette fois ci, on va corser la chose, je vais vous montrer comment créer :

  • Plusieurs load balancers
  • Privé ou publique
  • Plusieurs ports ouverts

On va donc partir sur ce jeu de paramètres :

"loadBalancers": {
   "value": [
     {
       "name": "front",
       "accessType": "public",
       "dns": "wwosfdemo",
       "port": [ 80, 8080, 443 ]
     },
     {
       "name": "middle",
       "accessType": "private",
       "subnetName": "MiddleSubnet",
       "port": [ 8081 ]
     },
     {
       "name": "back",
       "accessType": "private",
       "subnetName": "BackSubnet",
       "port": [ 8082 ]
     },
     {
       "name": "admin",
       "accessType": "private",
       "subnetName": "AdminSubnet",
       "port": [ 19000, 19080 ]
     }

   ]
}

Pour ceux qui l’ont reconnu, ça ressemble beaucoup à un use case complexe d’une architecture Service Fabric.

Pour créer ces différentes ressources, j’ai donc besoin de 3 types de ressources qui sont :

  • Public IP : pour pouvoir exposer mes External Load Balancer
  • Subnet (et donc Virtual Network) : pour pouvoir conserver mes Internal Load Balancers
  • Load Balancer : pour créer mes Internal et External Load Balancer

Je sépare les uses case “privés” et “publique” pour des questions de lisibilité, sachant qu’on a déjà des boucles imbriquées dans ce template, on ne va pas complexifier la chose encore une fois.

Pour la création des Virtual Network je vous renvoie à mon précédent article qui parle de ce sujet là : http://blog.woivre.fr/blog/2017/12/tips-creation-dazure-virtual-network-via-les-templates-arm #autopromo

Pour la création des adresses IP publiques, on va utiliser cette partie de template :

{
   "apiVersion": "2017-10-01",
   "type": "Microsoft.Network/publicIPAddresses",
   "condition": "[equals(variables('loadBalancers')[copyIndex('publicIpLoop')].accessType, 'public')]",
   "name": "[concat(variables('loadBalancers')[copyIndex('publicIpLoop')].name, variables('suffix').publicIPAddress)]",
   "location": "[resourceGroup().location]",
   "tags": {
     "displayName": "Public IP"
   },
   "properties": {
     "dnsSettings": {
       "domainNameLabel": "[variables('loadBalancers')[copyIndex('publicIpLoop')].dns]"
     },
     "publicIPAllocationMethod": "Dynamic"
   },
   "copy": {
     "name": "publicIpLoop",
     "count": "[length(variables('loadBalancers'))]"
   }
}

On fait donc ici un mixte entre une boucle et une condition pour créer une adresse IP publique pour chacun de nos Load balancer qui en a besoin. Par ailleurs je vous conseille de nommer vos différentes boucles dans un template ARM pour des questions de lisibilité encore une fois.

Pour les Load Balancers, rappelons rapidement la structure d’un Load Balancer qui est au minima la suivante :

{
   "apiVersion": "2017-10-01",
   "type": "Microsoft.Network/loadBalancers",
   "name": "LoadBalancer",
   "location": "[resourceGroup().location]",
   "properties": {
     "frontendIPConfigurations": [],
     "backendAddressPools": [],
     "inboundNatPools": [],
     "probes": [],
     "loadBalancingRules": []
   }
}

Commençons donc par les Load Balancers publiques :

{
   "apiVersion": "2017-10-01",
   "type": "Microsoft.Network/loadBalancers",
   "condition": "[equals(variables('loadBalancers')[copyIndex('loadBalancersLoop')].accessType, 'public')]",
   "name": "[concat(variables('loadBalancers')[copyIndex('loadBalancersLoop')].name, variables('suffix').publicLoadBalancers)]",
   "location": "[resourceGroup().location]",
   "tags": {
     "displayName": "External Load Balancer"
   },
   "dependsOn": [
     "publicIpLoop"
   ],
   "properties": {
     "frontendIPConfigurations": [
       {
         "name": "FrontEndPublicIPConfiguration",
         "properties": {
           "publicIPAddress": {
             "id": "[resourceId('Microsoft.Network/publicIPAddresses', concat(variables('loadBalancers')[copyIndex('loadBalancersLoop')].name, variables('suffix').publicIPAddress))]"
           }
         }
       }
     ],
     "backendAddressPools": [
       {
         "name": "BackEndAddressPool"
       }
     ],
     "inboundNatPools": [
       {
         "name": "BackEndNatPool",
         "properties": {
           "backendPort": 3389,
           "frontendIPConfiguration": {
             "id": "[concat(resourceId('Microsoft.Network/loadBalancers', concat(variables('loadBalancers')[copyIndex('loadBalancersLoop')].name, variables('suffix').publicLoadBalancers)), '/frontendIPConfigurations/FrontEndPublicIPConfiguration')]"
           },
           "frontendPortRangeEnd": 4500,
           "frontendPortRangeStart": 3389,
           "protocol": "Tcp"
         }
       }
     ],
     "copy": [
       {
         "name": "probes",
         "count": "[length(variables('loadBalancers')[copyIndex('loadBalancersLoop')].port)]",
         "input": {
           "name": "[concat('probe-', variables('loadBalancers')[copyIndex('loadBalancersLoop')].port[copyIndex('probes')])]",
           "properties": {
             "intervalInSeconds": 5,
             "numberOfProbes": 2,
             "port": "[variables('loadBalancers')[copyIndex('loadBalancersLoop')].port[copyIndex('probes')]]",
             "protocol": "Tcp"
           }
         }
       },
       {
         "name": "loadBalancingRules",
         "count": "[length(variables('loadBalancers')[copyIndex('loadBalancersLoop')].port)]",
         "input": {
           "name": "[concat('rule-', variables('loadBalancers')[copyIndex('loadBalancersLoop')].port[copyIndex('loadBalancingRules')])]",
           "properties": {
             "backendAddressPool": {
               "id": "[concat(resourceId('Microsoft.Network/loadBalancers', concat(variables('loadBalancers')[copyIndex('loadBalancersLoop')].name, variables('suffix').publicLoadBalancers)), '/backendAddressPools/BackEndAddressPool')]"
             },
             "backendPort": "[variables('loadBalancers')[copyIndex('loadBalancersLoop')].port[copyIndex('loadBalancingRules')]]",
             "enableFloatingIP": false,
             "frontendIPConfiguration": {
               "id": "[concat(resourceId('Microsoft.Network/loadBalancers', concat(variables('loadBalancers')[copyIndex('loadBalancersLoop')].name, variables('suffix').publicLoadBalancers)), '/frontendIPConfigurations/FrontEndPublicIPConfiguration')]"
             },
             "frontendPort": "[variables('loadBalancers')[copyIndex('loadBalancersLoop')].port[copyIndex('loadBalancingRules')]]",
             "idleTimeoutInMinutes": 5,
             "probe": {
               "id": "[concat(resourceId('Microsoft.Network/loadBalancers', concat(variables('loadBalancers')[copyIndex('loadBalancersLoop')].name, variables('suffix').publicLoadBalancers)), '/probes/', concat('probe-', variables('loadBalancers')[copyIndex('loadBalancersLoop')].port[copyIndex('loadBalancingRules')]))]"
             },
             "protocol": "Tcp"
           }
         }
       }
     ]
   },
   "copy": {
     "name": "loadBalancersLoop",
     "count": "[length(variables('loadBalancers'))]"
   }
}

On peut voir que c’est un peu verbeux puisque j’ai une boucle sur les Load Balancer, ainsi qu’une boucle sur les différents ports de chacun. Par ailleurs étant donné le fait que la partie “rules” contient uniquement des id de ressource, c’est juste un jeu de construction de template. Le tout se construit plutôt bien si vous êtes assez concentrés lors de l’écriture de celui-ci.


Pour les Load balancers privés, on repart sur le même template sauf pour les conditions, et la gestion de la FrontEndIpConfiguration qui indique un sous réseau, plutôt qu’une adresse IP Publique, comme on peut le voir ci-dessous :

"frontendIPConfigurations": [
   {
     "name": "FrontEndPrivateIPConfiguration",
     "properties": {
       "subnet": {
         "id": "[concat(resourceId('Microsoft.Network/virtualNetworks', variables('virtualNetwork').name), '/subnets/', variables('loadBalancers')[copyIndex('loadBalancersLoop')].subnetName)]"
       }
     }
   }

Le template est présent dans cet article, je ne le mets pas de suite sur Github, je vous le mettrai avec un article prochain sur la création d’un cluster Service Fabric complexe via un template ARM.


Remonter

Trucs et astuces avec Windows Azure Table Storage

MAI10

En ce vendredi quasiment férié…. je vous donne une petite astuce pour valider vos connexion avec le Table Storage.

 

Bon je suppose que vous connaissez tous la classe CloudStorageAccount, vu que le Table Storage c’est la vie. En ce moment je travaille beaucoup sur des outils génériques autour du Table Storage pour changer. J’ai donc une problématique, je dois valider que la chaine de connexion saisie par l’utilisateur est bien valide.

 

Alors pour rappel, il est possible de créer une instance de CloudStorageAccount de deux façons :

string accountKey = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
string accountName = "azertyqsdfgh";

var csa = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
var csa2 = CloudStorageAccount.Parse(string.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}", accountKey, accountName));

 

Le problème, c’est qu’avec cette méthode il est tout à fait possible de créer un CloudStorageAccount, mais cela ne nous dit pas s’il correspond à un vrai storage derrière, ce qui peut être problématique dans de nombreux cas.

Alors tant que Microsoft ne nous fournit pas une méthode simple de validation, il faut tout simplement réaliser une requête vers notre storage afin de savoir qu’il y a bien quelque chose derrière. Je vous conseille de faire un test non intrusif, donc par exemple lister les tables, les blobs ou les queues, mais en aucun cas créer un élément de “test” afin de voir que cela répond bien.

Et vu que je suis un grand seigneur aujourd’hui (comme tous les jours) je vous fournis ma méthode d’extension qui fait cela.

 

public static bool ValidateStorageAccount(this CloudStorageAccount storageAccount)
{
    if (storageAccount == null) throw new  ArgumentNullException("storageAccount");

    var tableClient = storageAccount.CreateCloudTableClient();
    try
    {
        tableClient.ListTablesSegmented(string.Empty, 1, null);
    }
    catch(StorageException ex)
    {
        return false;
    }

    return true;
}

 

A noter, que si c’est la clé du storage qui est mauvaise, j’ai une erreur 403, et si c’est le storage qui n’existe, c’est plus long déjà lors de l’execution, et je récupère une erreur comme quoi l’url est introuvable.

Et pour finir, je vous donne un lien vers un super article qui parle du Table Storage  :  Windows Azure Table Storage 2.0 Qu’est ce qui a changé ? écrit par moi.


Remonter

Windows Azure Global Bootcamp

AVRI24

Comme vous avez pu le remarquer, je ne blog plus trop sur mon blog personnel en ce moment, mais beaucoup plus sur celui de Soat, n’hésitez pas à y faire un tour, ça parle beaucoup de Windows Azure : http://blog.soat.fr

 

De plus je ne reste pas inactif, je suis toujours avec la communauté ZeCloud pour parler d’Azure ! Et d’ailleurs, ce samedi 27 avril, nous organisons la version parisienne du Global Windows Azure Bootcamp.

 

bootcamp

 

Cela se déroulera dans les locaux de Spark de 10h à 18h30, au programme il y aura du fun, de la bonne ambiance, des sessions de qualité, et surtout beaucoup d’Azure! Bref une journée comme je les aime!

Il n’est pas encore trop tard pour vous inscrire, il reste quelques places : http://bit.ly/GWABParis


Remonter

Installer un serveur Minecraft sur Windows Azure

JANV8

Et oui Windows Azure ne sert pas qu’à travailler, il est aussi possible de s’en servir comme d’un serveur personnel !

Je vais vous montrer comment installer un serveur Minecraft sur Windows Azure avec le mode IAAS qu’il faut donc au préalable activer, mais maintenant je pense que c’est fait pour tout le monde !

Donc au cas où ce ne soit pas le cas, il vous faut vous rendre à l’url : https://account.windowsazure.com/PreviewFeatures 

Et activer la fonctionnalité des machines virtuelles :

image

Ensuite, dans le portail, vous allez installer une machine Linux via la gallerie ! Car c’est bien connu que la JVM tourne mieux sous linux ! Et puis ce n’est pas parce que l’on est sur Azure qu’il faut choisir que des solutions Microsoft !

image

Il faut ensuite la configurer, notamment définir le mot de passe administraeur, et la taille de la machine virtuelle, surtout si vous voulez inviter plein de personne pour jouer avec vous !

 

image

 

Maintenant que vous avez votre linux, vous pouvez installer votre serveur Minecraft, pour cela, il faut vous connecter en SSH à votre instance grâce à PuTTy par exemple

image

 

Premièrement il vous faut installer Java pour installer le server, pour cela il faut executer ces trois requêtes linux :

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java7-installer

Par la suite, vous pouvez installer votre serveur Minecraft d’abord en téléchargeant le fichier du jeu comme ceci :

wget https://s3.amazonaws.com/MinecraftDownload/launcher/minecraft_server.jar

Puis en créant un script RunMinecraft.sh par exemple pour lancer votre serveur, ce script contiendra les lignes suivantes :

#!/bin/sh
java -Xmx512M -Xms512M -jar ./minecraft_server.jar nogui

Vous rendez votre script executable

chmod +x RunMinecraft.sh

Et vous le démarrer !!

 

Ce n’est pas fini, dans le portail Azure il vous faut router le port utilisé pour le jeu vers l’extérieur, pour cela il faut aller dans Endpoint, et y ajouter dans votre point de terminaison comme ci-dessous :

 

image

 

Et voilà, vous pouvez lancer Minecraft, et y ajouter votre serveur Azure !!

 

image

 

Et voilà, pour conclure, c’était juste une étape amusante, et on voit bien qu’Azure peut faire tourner un peu n’importe quoi ! Même un serveur Minecraft !


Remonter

Travailler avec Windows Azure et un débit réduit

DÉCE5

Depuis que je travaille avec Windows Azure, j’ai eu l’occasion d’utiliser plusieurs types de connexion internet, que ce soit au travail, ou chez moi sur Paris, avec des connexions en fibre optique ou du 20Mo en étant très près de la borne, mais aussi bien des connexions au fin fond de la corrèze, ou en pleine Beauce ou la qualité de la connexion internet n’est pas satisfaisante et où l’upload de votre package Azure peut prendre plus de temps que la création de votre application ! Et bien entendu, c’est aussi le cas durant les divers Hackathons où il y a 100 développeurs avides d’informations que l’on ne trouve que sur Internet.  Bref, vie ma vie dans ce numéro de vie ma vie de développeurs, je vais vous donner quelques astuces pour pouvoir travailler avec Windows Azure lorsque vous avez un débit réduit !

 

Alors bien entendu tout cet article, et tous les avantages / inconvénients sont listés en vu du hackathon Windows Phone 8 qui se déroulera mi décembre !

 

Windows Azure Mobile Services

Vous voulez construire un backend sur Windows Azure pour vos applications Windows 8 ou Windows Phone 8 ou iOS, dans ce backend, vous avez besoin d’un mode CRUD très simple à mettre en place, d’un processus d’identification, ou d’un mode push, ce service est fait pour vous !

Ce service a de nombreux avantages, cependant pendant un hackathon, je vous conseille de configurer ce service avant d’y aller, et surtout de créer vos différents fournisseurs d’identité, et de les tester avant d’y aller, puisque certains d’entre eux ont des fois des sites qui ne répondent pas du premier coup ! De plus, si vous voulez sortir des cas d’utilisations simples qui ne sont pas cités sur le site Windows Azure, il y a besoin d’avoir des compétences en Node.js où de suivre certains tutoriaux spécifiques qui sont malheureusement peu nombreux  …

 

Pour résumé, les avantages sont :

  • Simple à mettre en place
  • Intègre les fonctionnalités de base que l’on veut d’un backend d’une application mobile
    • CRUD
    • Push
    • Authentification

Les inconvénients  :

  • Difficile de sortir des sentiers battus sans faire diverses recherches sur internet
    • Gestion de listes d’objets (ex : liste des commentaires associés à un message)
    • Gestion de l’identité des utilisateurs connectées.
  • Application totalement reliée à internet, et donc si vous avez une connexion soumise à des coupures réseau, il n’est pas possible de faire tourner votre application en local.

 

Windows Azure WebSites

Que ce soit en Node.js, PHP ou ASP.Net, Windows Azure Websites vous permet simplement de déployer vos applications sur Windows Azure ! Et si vous le couplez avec ASP.Net MVC Web API vous avez le duo gagnant pour créer rapidement et simplement un backend sur lequel vous avez entièrement la main, de plus la publication se fait simplement par un Web Deploy, ce qui permet de ne déployer que des différentielles de votre application.

 

Pour résumé, les avantages sont :

  • Simple à mettre en place
  • Rapide à déployer
  • Testable en local

Les inconvénients :

  • Tout doit être développé : Push, fournisseurs d’identité …

 

Windows Azure Cloud Services

Le service historique de Microsoft, vous n’avez aucune limite avec celui-ci que ce soit en terme de technologie, d’accès à la machine ! Et même de montée en charge rapidement et efficacement ! Le seul conseil que je vous donne, c’est de déployer avant votre service avec les options de remote desktop et de Web deploy

image

Alors, je vous entends d’ici, effectivement en déployant votre site avec Web Deploy sur un Cloud Services, ça ne marche pas lorsqu’on a plusieurs instances, où que l’on souhaite faire monter en charge notre application, cependant entre prendre 45mn pour déployer et tester au lieu de 5min, le choix est rapide ! Il vous suffira de redéployer quand ça sera possible et que ça ne vous empêchera pas de travailler !

 

Pour résumé, les avantages sont :

  • Tellement nombreux pour être listés ici
  • N’ayez aucune limite en mode PAAS avec ce service

Les inconvénients :

  • Plus ou moins long à déployer selon le réseau

 

Bon cet article est très orienté hackathon, mais c’est surtout pour préparer le hackathon Windows Phone 8 organisé au moulin de la forge au mois de décembre !


Remonter

© Wilfried Woivré, tous droits réservés février 2018