VENTES: 1-800-867-1389

Créer un déploiement

Mis à jour: avril 2014

L'opération Create Deployment télécharge un nouveau package de service et crée un nouveau déploiement dans l'environnement intermédiaire ou de production.

Avant de pouvoir exécuter cette opération, vous devez effectuer les tâches suivantes :

L'opération Create Deployment est une opération asynchrone. Pour déterminer si le service de gestion a terminé de traiter la demande, appelez Obtenir l'état de l'opération. Pour plus d'informations sur les opérations asynchrones, consultez Suivre les demandes de gestion des services asynchrones.

La demande Create Deployment est spécifiée comme suit. Remplacez <subscription-id> par votre ID d'abonnement, <cloudservice-name> par le nom du service cloud, et <deployment-slot> par staging ou production. Cette opération utilise HTTP version 1.1.

 

Méthode URI de demande

POST

https://management.core.windows.net/<subscription-id>/services/hostedservices/<cloudservice-name>/deploymentslots/<deployment-slot>

Le tableau suivant décrit les en-têtes de la demande.

 

En-tête de demande Description

Content-Type

Obligatoire. Définissez cet en-tête avec application/xml.

x-ms-version

Obligatoire. Spécifie la version de l'opération à utiliser pour cette demande. Cet en-tête devrait être défini sur 2009-10-01 ou une version ultérieure. Pour plus d'informations sur les en-têtes du suivi de version, consultez Contrôle de version du service de gestion.

Le corps de la demande présente le format suivant. Notez que les éléments XML doivent être spécifiés dans l'ordre indiqué :


<?xml version="1.0" encoding="utf-8"?>
<CreateDeployment xmlns="http://schemas.microsoft.com/windowsazure">
  <Name>deployment-name</Name>
  <PackageUrl>package-url-in-blob-storage</PackageUrl>
  <Label>base64-encoded-deployment-label</Label>
  <Configuration>base64-encoded-configuration-file</Configuration>
  <StartDeployment>start-deployment</StartDeployment>
  <TreatWarningsAsError>prioritize-warnings</TreatWarningsAsError>
  <ExtendedProperties>
    <ExtendedProperty>
      <Name>property-name</Name>
      <Value>property-value</Value>
    </ExtendedProperty>
  </ExtendedProperties>
  <ExtensionConfiguration>
    <AllRoles>
      <Extension>
        <Id>identifier-of-extension</Id>
      </Extension>
    </AllRoles>
    <NamedRoles>
      <Role>
        <RoleName>role_name1</RoleName>
        <Extensions>
          <Extension>
            <Id>identifier-of-extension</Id>
          </Extension>
        </Extensions>
      </Role>
    </NamedRoles>
  </ExtensionConfiguration>
</CreateDeployment>

Le tableau suivant décrit les éléments clés dans le corps de la demande :

 

Nom de l'élément Description

Nom

Obligatoire. Spécifie le nom du déploiement.

PackageUrl

Obligatoire. Spécifie une URL qui fait référence à l'emplacement du package de service dans le service BLOB. Le package de service peut se trouver dans un compte de stockage sous le même abonnement ou dans un URI de signature d'accès partagé (SAS) d'un compte de stockage. Pour plus d'informations sur les signatures d'accès partagé, consultez Délégation de l'accès avec une signature d'accès partagé (API REST).

Configuration

Obligatoire. Spécifie le fichier de configuration du service codé en base 64 pour le déploiement.

Étiquette

Obligatoire. Spécifie un identificateur encodé en base 64 du déploiement. L'identificateur peut avoir une longueur de 100 caractères au maximum. Il est recommandé que l'étiquette soit unique au sein de l'abonnement. L'étiquette peut être utilisée pour le suivi.

StartDeployment

Ce paramètre est facultatif. Indique si démarrer le déploiement dès qu'il est créé. La valeur par défaut est false.

Si false, le modèle de service est toujours déployé, mais le code n'est pas exécuté immédiatement. Au lieu de cela, le service est Suspended jusqu'à ce que vous appeliez Mettre à jour l'état du déploiement et définissiez l'état à Running, lorsque le service est démarré. Un service déployé occasionne toujours des frais, même s'il est suspendu.

L'élément StartDeployment est uniquement disponible si vous utilisez la version 2010-04-01 ou une version ultérieure.

TreatWarningsAsError

Ce paramètre est facultatif. Indique si traiter les avertissements de validation de package comme des erreurs. La valeur par défaut est false. Si défini sur true, l'opération Created Deployment échoue s'il y a des avertissements de validation sur le package de service.

L'élément TreatWarningsAsError est uniquement disponible si vous utilisez la version 2011-04-01 ou une version ultérieure.

Nom

Ce paramètre est facultatif. Spécifie le nom d'une propriété de déploiement étendue. Chaque propriété étendue doit avoir un nom et une valeur définis. Il peut y avoir un maximum de 25 paires nom/valeur de propriété étendue.

La longueur maximale de l'élément Nom est de 64 caractères, seuls les caractères alphanumériques et les traits de soulignement sont valides dans Nom, et le nom doit commencer par une lettre.

L'élément Name est uniquement disponible si vous utilisez la version 2012-03-01 ou une version ultérieure.

Valeur

Facultatif. Spécifie la valeur d'une propriété étendue du service cloud. Chaque propriété étendue doit avoir un nom et une valeur définis. Vous pouvez avoir 25 paires nom/valeur de propriété étendue au maximum, et chaque valeur de propriété étendue doit avoir une taille maximale de 255 caractères.

L'élément Value est uniquement disponible si vous utilisez la version 2012-03-01 ou une version ultérieure.

ExtensionConfiguration

Ce paramètre est facultatif. Spécifie une extension qui est ajoutée au service cloud. Dans Windows Azure, un processus peut fonctionner comme une extension d'un service cloud. Par exemple, l'accès au Bureau à distance ou l'agent de Diagnostics de Windows Azure peut fonctionner comme une extension du service cloud. Vous devez ajouter une extension au service cloud en utilisant Ajouter une extension avant qu'il puisse être ajouté au déploiement.

L'élément ExtensionConfiguration est uniquement disponible si vous utilisez la version 2013-03-01 ou une version ultérieure.

Spécifie une extension qui est ajoutée au service cloud.

 

Nom de l'élément Description

AllRoles

Ce paramètre est facultatif. Spécifie une liste d'extensions qui sont appliquées à tous les rôles dans un déploiement.

Extension

Obligatoire. Spécifie une extension qui doit être déployée dans un rôle dans un service cloud.

NamedRoles

Ce paramètre est facultatif. Spécifie une liste d'extensions qui sont appliquées aux rôles spécifiques dans un déploiement.

Spécifie une extension qui doit être déployée dans un rôle dans un service cloud.

 

Nom de l'élément Description

Id

Obligatoire. Spécifie l'identificateur de l'extension. L'identificateur est créé lorsque l'extension est ajoutée au service cloud. Vous trouverez l'identificateur d'une extension ajoutée à un service cloud à l'aide de List Extensions.

Spécifie une liste d'extensions qui sont appliquées aux rôles spécifiques dans un déploiement.

 

Nom de l'élément Description

Rôle

Obligatoire. Spécifie un rôle spécifique auquel l'extension est ajoutée.

RoleName

Obligatoire. Spécifie le nom du rôle.

Extension

Obligatoire. Spécifie une extension qui doit être déployée dans un rôle dans un service cloud.

La réponse inclut un code d'état HTTP et un ensemble d'en-têtes de réponse.

Étant donné que Create Deployment est une opération asynchrone, vous devez appeler Obtenir l'état de l'opération pour déterminer si l'opération est terminée, a échoué, ou est encore en cours.

Un Create Deployment est une opération asynchrone qui retourne toujours un code d'état 202 (Accepter). Pour déterminer le code d'état de l'opération une fois qu'elle est terminée, appelez Obtenir l'état de l'opération. Le code d'état est incorporé dans la réponse pour cette opération ; si l'opération réussit, il s'agit du code d'état 200 (OK). Pour plus d'informations sur les codes d'état, consultez Codes d'état et d'erreur de la gestion des services.

La réponse de l'opération inclut les en-têtes suivants. La réponse peut aussi inclure des en-têtes HTTP standard supplémentaires. Tous les en-têtes standard sont conformes à la spécification du protocole HTTP/1.1.

 

En-tête de réponse Description

x-ms-request-id

Valeur qui identifie de façon unique une demande effectuée au service de gestion. Pour une opération asynchrone, vous pouvez interroger l'état de l'opération Get avec la valeur de l'en-tête pour déterminer si l'opération est terminée, a échoué, ou est encore en cours. Pour plus d'informations, consultez Suivre les demandes de gestion des services asynchrones.

Tout certificat de gestion associé à l'abonnement spécifié par <subscription-id> peut être utilisé pour authentifier cette opération. Pour plus de détails, consultez la rubrique Authentification des demandes de gestion des services.

L'exemple d'application console suivant montre comment déployer une application. Remplacez les valeurs de variable suivantes :

  • Empreinte numérique : par l'empreinte numérique du certificat de gestion dans votre abonnement

  • SubscriptionId : par l'identificateur d'abonnement que vous avez obtenu du portail de gestion

  • ServiceName : par le nom du service cloud que vous avez créé

  • DeploymentName : par le nom que vous voulez utiliser pour le déploiement



    noteRemarque
    Utilisez Liste des emplacements pour obtenir l'emplacement approprié.

  • PackageName : par le chemin d'accès dans le stockage d'objets blob au fichier de package

  • ConfigFile : par le nom du fichier de configuration de service


using System;
using System.Collections.Generic;
using System.Xml.Linq;
using System.Text;
using System.Security.Cryptography.X509Certificates;
using System.Net;
using System.IO;
using System.Xml;

namespace CreateDeployment
{
  class Program
  {
    private static XNamespace wa = "http://schemas.microsoft.com/windowsazure";
    private const string Thumbprint = "certificate-thumbprint";
    private const string SubscriptionId = "identifier-of-subscription";
    private const string ServiceName = "name-of-cloud-service";
    private const string DeploymentName = "name-of-deployment-name";
    private const string PackageName = "location-of-package";
    private const string ConfigFile = "name-of-configuration-file";
    private const string Version = "2013-08-01";

    static void Main(string[] args)
    {
      // Set the certificate that matches the Thumbprint value.
      X509Certificate2 certificate = GetStoreCertificate(Thumbprint);
      
       // Create the URI for the request
      string uriFormat = "https://management.core.windows.net/{0}/" +
        "services/hostedservices/{1}/deploymentslots/production";
      Uri uri = new Uri(String.Format(uriFormat, SubscriptionId, ServiceName));
      
      // Base-64 encode the label of the deployment   
      byte[] bytes = System.Text.Encoding.UTF8.GetBytes(ServiceName);
      string base64Label = Convert.ToBase64String(bytes);

       // Create the request body
      XDocument requestBody = new XDocument(
      new XDeclaration("1.0", "UTF-8", "no"),
        new XElement(wa + "CreateDeployment",
          new XElement(wa + "Name", DeploymentName),
          new XElement(wa + "PackageUrl", PackageName),
          new XElement(wa + "Label", base64Label),
          new XElement(wa + "Configuration", ConvertFile(ConfigFile)),
          new XElement(wa + "StartDeployment", true)));

       // Submit the request and get the response
      XDocument responseBody;
      HttpWebResponse response = InvokeRequest(uri, "POST", certificate, requestBody, out responseBody);
      string requestId = String.Empty;
      if (response.Headers != null)
      {
        requestId = response.Headers["x-ms-request-id"];
      }

      if (responseBody != null)
      {
        Console.WriteLine(responseBody.ToString(SaveOptions.OmitDuplicateNamespaces));
      }
      
      XDocument statusResponse = GetStatus(requestId);
      if (statusResponse != null)
      {
        Console.WriteLine(statusResponse.ToString(SaveOptions.OmitDuplicateNamespaces));
      }
      Console.Write("Press any key to continue:");
      Console.ReadKey();
    }

    //Get the status of the request    
    private static XDocument GetStatus(string requestId)
    {
      // Set the certificate that matches the Thumbprint value.
      X509Certificate2 certificate = GetStoreCertificate(Thumbprint);
      
       // Create the URI for the request
      string uriFormat = "https://management.core.windows.net/{0}/" + "operations/" + requestId;
      Uri uri = new Uri(String.Format(uriFormat, SubscriptionId));
      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
      request.Method = "GET";
      request.Headers.Add("x-ms-version", Version);
      request.ClientCertificates.Add(certificate);
      request.ContentType = "application/xml";

       // Submit the request and get the response
      XDocument responseBody = null;
      HttpWebResponse response;
      try
      {
        response = (HttpWebResponse)request.GetResponse();
      }
      catch (WebException ex)
      {
        response = (HttpWebResponse)ex.Response;
      }

      if (response.ContentLength > 0)
      {
        using (XmlReader reader = XmlReader.Create(response.GetResponseStream()))
        {
          responseBody = XDocument.Load(reader);
        }
      }
      response.Close();
      return responseBody;
    }
        
    // Add the request headers and get the response from the request
    private static HttpWebResponse InvokeRequest(
      Uri uri,
      string method,
      X509Certificate2 certificate,
      XDocument requestBody,
      out XDocument responseBody)
    {
      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
      request.Method = method;
      request.Headers.Add("x-ms-version", Version);
      request.ClientCertificates.Add(certificate);
      request.ContentType = "application/xml";

      if (requestBody != null)
      {
        using (Stream requestStream = request.GetRequestStream())
        {
          using (StreamWriter streamWriter = new StreamWriter(
            requestStream, System.Text.UTF8Encoding.UTF8))
          {
            requestBody.Save(streamWriter, SaveOptions.DisableFormatting);
          }
        }
      }

      responseBody = null;
      HttpWebResponse response;
      try
      {
        response = (HttpWebResponse)request.GetResponse();
      }
      catch (WebException ex)
      {
        response = (HttpWebResponse)ex.Response;
      }

      XmlReaderSettings settings = new XmlReaderSettings();
      settings.DtdProcessing = DtdProcessing.Ignore;
      if (response.ContentLength > 0)
      {
        using (XmlReader reader = XmlReader.Create(response.GetResponseStream(), settings))
        {
          try
          {
            responseBody = XDocument.Load(reader);
          }
          catch
          {
            responseBody = null;
          }
        }
      }
      response.Close();
      return response;
    }
    
    // Base-64 encode the contents of the service configuration file.
    private static string ConvertFile(string configFileName)
    {
      string fileContents;
      string base64String = "";
      try
      {
        using (StreamReader reader = new StreamReader(
          File.Open(configFileName, System.IO.FileMode.Open, System.IO.FileAccess.Read)))
        {
          fileContents = reader.ReadToEnd();
        }
      }
      catch (System.Exception exp)
      {
        Console.WriteLine(exp.Message);
        return base64String;
      }

      // Convert the binary input into base-64 encoded output. 
      try
      {
        base64String = Convert.ToBase64String(Encoding.UTF8.GetBytes(fileContents));
        return base64String;
      }
      catch (System.ArgumentNullException)
      {
        Console.WriteLine("Binary data array is null.");
        return base64String;
      }
    }

    // Gets the certificate matching the thumbprint from the local store.
    // Throws an ArgumentException if a matching certificate is not found.
    private static X509Certificate2 GetStoreCertificate(string thumbprint)
    {
      List<StoreLocation> locations = new List<StoreLocation>
      { 
        StoreLocation.CurrentUser, 
        StoreLocation.LocalMachine
      };

      foreach (var location in locations)
      {
        X509Store store = new X509Store("My", location);
        try
        {
          store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
          X509Certificate2Collection certificates = store.Certificates.Find(
            X509FindType.FindByThumbprint, thumbprint, false);
          if (certificates.Count == 1)
          {
            return certificates[0];
          }
        }
        finally
        {
          store.Close();
        }
      }
      throw new ArgumentException(string.Format(
        "A Certificate with Thumbprint '{0}' could not be located.",
        thumbprint));
    }
  }
}

Cela vous a-t-il été utile ?
(1500 caractères restants)
Merci pour vos suggestions.
Afficher:
© 2014 Microsoft