Windows Azure dispose d’un jeu d’APIs vous permettant d’automatiser la gestion des tâches les plus courantes, et même si certaines opérations doivent être faites par le portail, pouvoir automatiser les autres est indispensable.

 

L’API permettant tout ça est assez simple d’utilisation, d’autant plus qu’elle est déjà encapsulée dans une API .net. Voici les étapes nécessaires pour l’utiliser, à travers un petit exemple qui va automatiquement monitorer une application Azure et vous avertir de ses changements d’état.

 

Préparation de l’environnement Azureimage

La première chose à faire est de fournir la clé publique d’un certificat à l’infrastructure windows azure. Dans Visual Studio, quand vous sélectionnez Publier sur un projet Cloud, l’IHM vous permet de créer un certificat. Ensuite, vous pouvez l’exporter depuis la MMC des certificats à sous différents formats, notamment CER (clé publique uniquement) et PFX (avec clé privée et mot de passe). Le but : permettre à Azure de vérifier votre identité avant d’accepter de faire pour votre compte des opérations de reconfiguration des environnements :

 

 

C’est là que vous allez uploader le fichier CER qui représente la clé publique de votre certificat. Notez le thumbprint, il vous servira peut-être plus tard:

image 

Mise à disposition du certificat pour le code qui va manipuler les APIs Azure

Deux cas de figure se présentent à vous :

 

Vous comptez manipuler les APIs depuis votre machine

Il suffit de disposer du certificat sur votre machine, ce que vous devriez déjà avoir sinon vous n’auriez pas pu générer le CER..

 

Vous comptez manipuler les APIs depuis un environnement Azure

imagePar exemple parce que vous voulez pouvoir dynamiquement changer le nombre d’instances.. Dans ce cas, vous devez mettre le certificat complet à disposition de l’application qui l’utilisera. Vous allez donc exporter votre certificat complet (avec sa clé privée) dans un fichier .PFX et déployer ce certificat sur l’environnement Azure qui contrôlera les autres. Ca se fait depuis le portail, mais plus spécifiquement depuis un environnement d’hébergement (nommé pico dans mon exemple) :

 

A partir de maintenant, les rôles tournant dans pico auront la possibilité d’accéder au certificat que je viens d’uploader. Il faut quand même le leur indiquer, et ça se fait directement dans les fichier de config de votre projet Cloud :

 

image

 

 

Utilisation des APIs

Bon, la partie publique certificat est dans Azure, et l’autre près du code qui doit manipuler; comment continuer ? Il me manque un paramètre, qui est “mais quel environnement Azure ?”. C’est le SubscriptionID qu’on trouve dans le portail :

image

Voilà un bout de code qui va récupérer l’état de mon déploiement sur Azure :

 

// Mon certificat et mon ID Azure
string MonThumnbrint = "";
string MonSubscriptionID = "";
            
// Choper le certificat à partir de son thumbprint
X509Store certificateStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
certificateStore.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certs = certificateStore.Certificates.Find(X509FindType.FindByThumbprint, MonThumnbrint, false);
if (certs.Count != 1)
{
    // Ah, pas trouvé. S'il a été installé dans IIS il est dans LocalMachine, si dans Azure il est dans CurrentUser
    throw new Exception("Impossible de trouver le certificat, essayez StoreLocation.LocalMachine ?");
}
var monCertificat = certs[0];

// Je me connecte
var serviceManagement = ServiceManagementHelper.CreateServiceManagementChannel("WindowsAzureEndPoint", monCertificat);
// Je cherche le premier service hosté
var x = serviceManagement.ListHostedServices(MonSubscriptionID);
string s = x.First().ServiceName;
// Je regarde l'état du déploiement
var details = serviceManagement.GetHostedServiceWithDetails(MonSubscriptionID, s ,true);
if (details.Deployments.Count > 0)
{
    Console.WriteLine ("etat du déploiement : " + details.Deployments.First().Status);
}
else
{
    Console.WriteLine("Rien de déployé !");
}

Bon, le code mériterait d’être un peu plus joli, mais vous voyez l’idée.

Ah, les using pour pouvoir reprendre tout ça sans trop de peine :

 

using Microsoft.Samples.WindowsAzure.ServiceManagement;
using System.Security.Cryptography.X509Certificates;
using Microsoft.WindowsAzure.ServiceRuntime;