V poslední době jsem několikrát obdržel dotaz na ukázku kódu využívající Azure Management API pro správu cloud aplikací. Naposled to bylo včera na Azure Akademii II. Nelenil jsem, večer sednul za klávesnici a tady je výsledek.

Jaké máme možnosti

Stejně jaké ostatní služby platformy Windows Azure i Management má své API realizované pomocí REST API. Popis a praktické příklady jsou k nalezení na běžném místě – MSDN dokumentaci. Mám-li však být upřímný, jsem již ve svém věku trochu líný sestavovat a posléze parsovat těla dotazů a odpovědí. Lenost je hybnou silou pokroku a proto jsem pro praktický příklad použil .NET knihovnu, která je součástí nástroje csmanage. csmanage je jeden z volně šiřitelných příkladů se zdrojovými kódy a jde o command-line utilitu pro vzdálený management Azure aplikací a storage. Jak jsem již řekl, součástí je i knihovna, kterou objektově zaobaluje práci s REST API a tu s výhodou používám. Stačí tedy stáhnout zdrojové kódy, knihovnu si přeložit a následně na ni odkazovat ze své vlastní aplikace.

Přípravné kroky

Abychom mohli jakkoli používat Azure Management API, je nutné mít klientský certifikát, kterým se zabezpečuje komunikace s Azure Management službou. Tento si můžeme vygenerovat sami, jak jsem popisoval již dříve (ještě s původní verzi portálu) nebo v prvním vysílání Azure Akademie II. (již na aktuální verzi management portálu).

Dále si musíme připravit následující informace:

  • Číslo subskripce (lze najít na management portálu)
  • Thumbprint certifikátu (také lze najít na management portálu)

V mém příkladu také využívám možnost nahrát balíček (soubor *.cspkg) do Azure Blobu, odkud se použije pro nasazení. Poslední dva přípravné kroky tedy jsou:

  • Nahrát aplikační balíček do blobu
  • Získat URI k balíčku

Vývoj aplikace

Použití knihovny je celkem snadná záležitost. Vše je postaveno na instanci třídy ServiceManagementHelper. Není to ale úplně vše, protože vedle samotného kódu musíme nakonfigurovat odpovídající endpoint pro komunikaci s Management službou. Tato konfigurace se provádí v souboru app.config a v minimalistické variantě bude mít tonto obsah:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="WindowsAzureServiceManagement_WebHttpBinding" 
closeTimeout="00:01:00" openTimeout="00:01:00"
receiveTimeout="00:10:00"
sendTimeout="00:01:00"
> <readerQuotas maxStringContentLength="1048576"
maxBytesPerRead="131072"
/> <security mode="Transport"> <transport clientCredentialType="Certificate" /> </security> </binding> </webHttpBinding> </bindings> <client> <endpoint name="WindowsAzureEndPoint" address="https://management.core.windows.net" binding="webHttpBinding" bindingConfiguration="WindowsAzureServiceManagement_WebHttpBinding" contract="Microsoft.Samples.WindowsAzure.ServiceManagement
.IServiceManagement
"
/> </client> </system.serviceModel> </configuration>

Endpoint je v mém případě pojmenován WindowsAzureEndPoint a je použit při vytvoření kanálu. Následující kód v metodě Create_click nejdříve načte klientský certifikát registrovaný na počítači, ze kterého se aplikace spouští, vytvoří se kanál, nastaví parametry pro nasazení aplikace a zavolá metoda CreateOrUpdateDeployment. Tu pro zjednodušení příkladu volám synchronně, ale v reálném příkladu bych měl určitě použít asynchronní volání.

public partial class MainWindow : Window
{
  private const string subscriberID = "....";
  IServiceManagement serviceManagment;
  private const string serviceName = "dkOrchard";
  private const string CertificateThumbprint = "....";
  private const string ConfigFileLocation = @"C:\aplikace.cscfg";
  public static X509Certificate2 Certificate { get; set; }

  private void Create_Click(object sender, RoutedEventArgs e)
  {
      ValidateCertificate();
      serviceManagment = ServiceManagementHelper.
CreateServiceManagementChannel(
"WindowsAzureEndPoint", Certificate);
      CreateDeploymentInput input = new CreateDeploymentInput
      {
        Name = "APIDeploymentTest",
        Label = ServiceManagementHelper.EncodeToBase64String("Orchard 1.0"),
        Configuration = GetSettings(ConfigFileLocation),
        PackageUrl = new System.Uri(
@"https://dkorchard.blob.core.windows.net/..../aplikace.cspkg"), }; serviceManagment.CreateOrUpdateDeployment(
subscriberID, serviceName, "production", input); }

Seznam všech dostupných operací v Management API lze najít v MSDN dokumentaci.

Na co nezapomenout

Aby mohla aplikace přečíst certifikáty z lokálního úložiště, musí buď běžet v admin módu (případně musí být Visual Studion spuštěno v admin módu) nebo je nutné pomocí Windows HTTP Services Certificate Configuration Tool nastavit práva pro čtení bez elevace práv. Popis je k dispozici zde.

Celou aplikaci, včetně dvou pomocných funkcí si můžete stáhnout.