Exporter (0) Imprimer
Développer tout

Mettre à jour un compte de stockage

Mis à jour: avril 2014

L'opération Update Storage Account met à jour l'étiquette, la description, et active ou désactive l'état de géo-réplication pour un compte de stockage dans Windows Azure.

La demande Update Storage Account peut être spécifiée comme suit. Remplacez <subscription-id> par votre ID d'abonnement et <service-name> par le nom de votre compte de stockage.

 

Méthode URI de demande Version HTTP

PUT

https://management.core.windows.net/<subscription-id>/services/storageservices/<service-name>

HTTP/1.1

Le tableau suivant décrit les en-têtes de demande obligatoires ou facultatifs.

 

En-tête de demande Description

Content-Type

Obligatoire. Définissez cet en-tête sur la valeur application/xml.

x-ms-version

Obligatoire. Spécifie la version de l'opération à utiliser pour cette demande. La valeur de cet en-tête doit être la version 2011-06-01 ou une version ultérieure. La version actuelle est 2012-03-01. 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 :


<?xml version="1.0" encoding="utf-8"?>
<UpdateStorageServiceInput xmlns="http://schemas.microsoft.com/windowsazure">
  <Description>description-of-storage-account</Description>
  <Label>base64-encoded-label</Label>
  <GeoReplicationEnabled>geo-replication-indicator</GeoReplicationEnabled>
  <ExtendedProperties>
    <ExtendedProperty>
      <Name>property-name</Name>
      <Value>property-value</Value>
    </ExtendedProperty>
  </ExtendedProperties>
  <CustomDomains>
    <CustomDomain>
      <Name>name-of-custom-domain</Name>
      <UseSubDomainName>cname-validation-indicator</UseSubDomainName>
    </CustomDomain>
  </CustomDomains>
  <SecondaryReadEnabled>secondary-read-indicator</SecondaryReadEnabled>
</UpdateStorageServiceInput>

ImportantImportant
L'ordre des éléments dans le corps de la demande est très important. Si un élément est obligatoire, il doit s'afficher dans le XML dans l'ordre indiqué au-dessus.

Le corps de la demande présente le format suivant.

 

Nom de l'élément

Description

Étiquette

Ce paramètre est facultatif. Spécifie un nom codé en base 64 pour le compte de stockage. L'étiquette peut être longue de 100 caractères au maximum. L'étiquette peut être utilisée pour identifier le compte de stockage à des fins de suivi. Vous devez spécifier une valeur pour Label ou Description, ou pour les deux.

Description

Ce paramètre est facultatif. Description du compte de stockage. La description peut avoir une longueur de 1024 caractères au maximum. Vous devez spécifier une valeur pour Label ou Description, ou pour les deux.

GeoReplicationEnabled

Ce paramètre est facultatif. Active ou désactive la géo-réplication sur le stockage spécifié. Si défini sur la valeur true, les données dans le compte de stockage sont répliquées entre plusieurs emplacements géographiques pour permettre la résilience en cas de perte catastrophique de service. Si défini sur false, la géo-réplication est désactiver. Si l'élément n'est pas inclus dans le corps de la demande, la valeur actuelle reste inchangée.

ImportantImportant
Si vous avez activé la géo-réplication, vous pouvez choisir de la désactiver en affectant à cet élément la valeur false. Lorsque la géo-réplication est désactivée, vos données ne sont plus répliquées dans un centre de données secondaire, et toutes les données sont supprimées de l'emplacement secondaire.

Si vous activez la géo-réplication après l'avoir désactivée, le compte de stockage sera facturé pour la réplication de la copie actuelle des données dans le centre de données secondaire. Après que la copie existante des données a été répliquée dans le centre de données secondaire, les mises à jour sont répliquées sans coût supplémentaire.

L'élément GeoReplicationEnabled est uniquement disponible si vous utilisez la version 2012-03-01 ou une version ultérieure. Après la version 2013-11-01, si SecondaryReadEnabled est spécifié, GeoReplicationEnabled doit également être spécifié.

ExtendedProperties

Spécifie le nom et la valeur d'une propriété étendue qui a été ajoutée au compte de stockage.

CustomDomains

Spécifie les domaines personnalisés qui sont associés au compte de stockage.

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

SecondaryReadEnabled

Indique que la lecture secondaire est activée pour le compte de stockage.

Les valeurs possibles sont les suivantes :

  • true

  • false

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

Spécifie le nom et la valeur d'une propriété étendue qui a été ajoutée au compte de stockage.

 

Nom de l'élément Description

Nom

Ce paramètre est facultatif. Représente le nom d'une propriété étendue du compte de stockage. Chaque propriété étendue doit avoir un nom et une valeur définis. Il peut y avoir un maximum de 50 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. Toute tentative d'utiliser d'autres caractères, en commençant le Nom par un caractère autre qu'une lettre, ou en entrant un nom qui est identique à celui d'une autre propriété étendue détenue par le même compte de stockage, provoque une erreur de code d'état 400 (erreur de mauvaise demande).

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

Valeur

Ce paramètre est facultatif. Représente la valeur d'une propriété étendue du compte de stockage. Chaque propriété étendue doit avoir un nom et une valeur définis. Vous pouvez avoir 50 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.

Spécifie les domaines personnalisés qui sont associés au compte de stockage.

 

Nom de l'élément Description

CustomDomain

Spécifie des informations sur un domaine personnalisé qui est associé au compte de stockage.

Nom

Spécifie le nom du domaine personnalisé.

UseSubDomainName

Indique si la validation CName indirecte est activée.

Les valeurs possibles sont les suivantes :

  • true

  • false

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

Une opération ayant réussi retourne le 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.

Utilisez l'opération Update Storage Account pour modifier la description, l'étiquette, ou la valeur du paramètre de géo-réplication pour un compte de stockage. Utilisez l'opération Obtenir les propriétés du compte de stockage pour examiner ces valeurs.

L'exemple suivant appelle l'opération Obtenir les propriétés du compte de stockage pour répertorier les valeurs de propriétés initiales du compte de stockage, met à jour les propriétés Label et Description avec un appel à l'opération Update Storage Account, puis affiche les résultats mis à jour avec un autre appel à Obtenir les propriétés du compte de stockage. Modifiez la valeur de la chaîne Version avec la version souhaitée, la valeur Thumbprint avec l'empreinte numérique de votre certificat de gestion, le SubscriptionId avec votre identificateur d'abonnement, et la valeur ServiceName avec le nom de votre compte de stockage pour exécuter l'exemple.

namespace Microsoft.WindowsAzure.ServiceManagementRESTAPI.Samples
{
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Security.Cryptography.X509Certificates;
    using System.Xml;
    using System.Xml.Linq;

    public class Program
    {
        // Set these constants with your values to run the sample.
        private const string Version = "2011-12-01";
        private const string Thumbprint = "management-certificate-thumbprint";
        private const string SubscriptionId = "subscription-identifier";
        private const string ServiceName = "storage-account-name";

        // This is the common namespace for all Service Management REST API XML data.
        private static XNamespace wa = "http://schemas.microsoft.com/windowsazure";

        /// <summary>
        /// Gets or sets the certificate that matches the Thumbprint value.
        /// </summary>
        private static X509Certificate2 Certificate { get; set; }

        static void Main(string[] args)
        {
            try
            {
                Certificate = GetStoreCertificate(Thumbprint);

                // Get the initial property values for the storage account.
                // Convert the Label property to a readable value for display.
                XElement initialProperties =
                    GetStorageAccountProperties(ServiceName);
                XElement labelElement = initialProperties.Descendants(wa + "Label").First();
                labelElement.Value = labelElement.Value.FromBase64();
                Console.WriteLine(
                    "Storage Account Properties for {0}:{1}{2}",
                    ServiceName,
                    Environment.NewLine,
                    initialProperties.ToString(SaveOptions.OmitDuplicateNamespaces));

                // Update the label and description of the storage account.
                string label = String.Format("updated_{0}_label", ServiceName);
                string description = String.Format(
                    "Updated description for {0}",
                    ServiceName);
                UpdateStorageAccount(ServiceName, label, description, 
                    geoReplicationEnabled: false);

                // Get the updated property values for the storage account.
                // Convert the Label property to a readable value for display.
                XElement updatedProperties =
                    GetStorageAccountProperties(ServiceName);
                labelElement = updatedProperties.Descendants(wa + "Label").First();
                labelElement.Value = labelElement.Value.FromBase64();
                Console.WriteLine(
                    "Updated Storage Account Properties for {0}:{1}{2}",
                    ServiceName,
                    Environment.NewLine,
                    updatedProperties.ToString(SaveOptions.OmitDuplicateNamespaces));
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception caught in Main:");
                Console.WriteLine(ex.Message);
            }

            Console.Write("Press any key to continue:");
            Console.ReadKey();
        }

        /// <summary>
        /// Calls the Get Storage Account Properties operation in the Service 
        /// Management REST API for the specified subscription and storage account 
        /// name and returns the StorageService XML element from the response.
        /// </summary>
        /// <param name="serviceName">The name of the storage account.</param>
        /// <returns>The StorageService XML element from the response.</returns>
        private static XElement GetStorageAccountProperties(
            string serviceName)
        {
            string uriFormat = "https://management.core.windows.net/{0}" +
                "/services/storageservices/{1}";
            Uri uri = new Uri(String.Format(uriFormat, SubscriptionId, serviceName));
            XDocument responseBody;
            InvokeRequest(uri, "GET", HttpStatusCode.OK, null, out responseBody);
            return responseBody.Element(wa + "StorageService");
        }

        /// <summary>
        /// Calls the Update Storage Account operation in the Service Management 
        /// REST API for the specified subscription, storage account name, new 
        /// description, label, and geo-replication enabled setting.
        /// </summary>
        /// <param name="serviceName">The name of the storage account to update.</param>
        /// <param name="label">The new label for the storage account.</param>
        /// <param name="description">The new description for the storage account.</param>
        /// <param name="geoReplicationEnabled">The new geo-replication setting, if applicable. 
        /// This optional parameter defaults to null.</param>
        private static void UpdateStorageAccount(
            string serviceName,
            string label,
            string description,
            bool? geoReplicationEnabled = null)
        {
            string uriFormat = "https://management.core.windows.net/{0}" +
                "/services/storageservices/{1}";
            Uri uri = new Uri(String.Format(uriFormat, SubscriptionId, serviceName));
            XDocument requestBody = new XDocument(
                new XDeclaration("1.0", "UTF-8", "no"),
                new XElement(
                    wa + "UpdateStorageServiceInput",
                    new XElement(wa + "Description", description),
                    new XElement(wa + "Label", label.ToBase64())));

            // Add the GeoReplicationEnabled element if the version supports it.
            if ((geoReplicationEnabled != null) &&
                (String.CompareOrdinal(Version, "2011-12-01") >= 0))
            {
                requestBody.Element(wa + "UpdateStorageServiceInput").Add(
                    new XElement(
                        wa + "GeoReplicationEnabled", 
                        geoReplicationEnabled.ToString().ToLowerInvariant()));
            }

            XDocument responseBody;
            InvokeRequest(uri, "PUT", HttpStatusCode.OK, requestBody, out responseBody);
        }

        /// <summary>
        /// Gets the certificate matching the thumbprint from the local store.
        /// Throws an ArgumentException if a matching certificate is not found.
        /// </summary>
        /// <param name="thumbprint">The thumbprint of the certificate to find.</param>
        /// <returns>The certificate with the specified thumbprint.</returns>
        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));
        }

        /// <summary>
        /// A helper function to invoke a Service Management REST API operation.
        /// Throws an ApplicationException on unexpected status code results.
        /// </summary>
        /// <param name="uri">The URI of the operation to invoke using a web request.</param>
        /// <param name="method">The method of the web request, GET, PUT, POST, or DELETE.</param>
        /// <param name="expectedCode">The expected status code.</param>
        /// <param name="requestBody">The XML body to send with the web request. Use null to send no request body.</param>
        /// <param name="responseBody">The XML body returned by the request, if any.</param>
        /// <returns>The requestId returned by the operation.</returns>
        private static string InvokeRequest(
            Uri uri,
            string method,
            HttpStatusCode expectedCode,
            XDocument requestBody,
            out XDocument responseBody)
        {
            responseBody = null;
            string requestId = String.Empty;

            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);
                    }
                }
            }

            HttpWebResponse response;
            HttpStatusCode statusCode = HttpStatusCode.Unused;
            try
            {
                response = (HttpWebResponse)request.GetResponse();
            }
            catch (WebException ex)
            {
                // GetResponse throws a WebException for 4XX and 5XX status codes
                response = (HttpWebResponse)ex.Response;
            }

            try
            {
                statusCode = response.StatusCode;
                if (response.ContentLength > 0)
                {
                    using (XmlReader reader = XmlReader.Create(response.GetResponseStream()))
                    {
                        responseBody = XDocument.Load(reader);
                    }
                }

                if (response.Headers != null)
                {
                    requestId = response.Headers["x-ms-request-id"];
                }
            }
            finally
            {
                response.Close();
            }

            if (!statusCode.Equals(expectedCode))
            {
                throw new ApplicationException(string.Format(
                    "Call to {0} returned an error:{1}Status Code: {2} ({3}):{1}{4}",
                    uri.ToString(),
                    Environment.NewLine,
                    (int)statusCode,
                    statusCode,
                    responseBody.ToString(SaveOptions.OmitDuplicateNamespaces)));
            }

            return requestId;
        }
    }

    /// <summary>
    /// Helpful extension methods for converting strings to and from Base-64.
    /// </summary>
    public static class StringExtensions
    {
        /// <summary>
        /// Converts a UTF-8 string to a Base-64 version of the string.
        /// </summary>
        /// <param name="s">The string to convert to Base-64.</param>
        /// <returns>The Base-64 converted string.</returns>
        public static string ToBase64(this string s)
        {
            byte[] bytes = System.Text.Encoding.UTF8.GetBytes(s);
            return Convert.ToBase64String(bytes);
        }

        /// <summary>
        /// Converts a Base-64 encoded string to UTF-8.
        /// </summary>
        /// <param name="s">The string to convert from Base-64.</param>
        /// <returns>The converted UTF-8 string.</returns>
        public static string FromBase64(this string s)
        {
            byte[] bytes = Convert.FromBase64String(s);
            return System.Text.Encoding.UTF8.GetString(bytes);
        }
    }
}

Après l'exécution, l'exemple de programme générera une sortie similaire à ce qui suit :

Storage Account Properties for myexamplestorage1:
<StorageService xmlns="http://schemas.microsoft.com/windowsazure" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <Url>https://management.core.windows.net/01234567-89ab-cdef-0123-456789abcdef/services/storageservices/myexamplestorage1</Url>
  <ServiceName>myexamplestorage1</ServiceName>
  <StorageServiceProperties>
    <Description>myexamplestorage1 description</Description>
    <Location>North Central US</Location>
    <Label>My Example Label</Label>
    <Status>Created</Status>
    <Endpoints>
      <Endpoint>http://myexamplestorage1.blob.core.windows.net/</Endpoint>
      <Endpoint>http://myexamplestorage1.queue.core.windows.net/</Endpoint>
      <Endpoint>http://myexamplestorage1.table.core.windows.net/</Endpoint>
    </Endpoints>
    <GeoReplicationEnabled>true</GeoReplicationEnabled>
    <GeoPrimaryRegion>usnorth</GeoPrimaryRegion>
    <StatusOfPrimary>Available</StatusOfPrimary>
    <GeoSecondaryRegion>ussouth</GeoSecondaryRegion>
    <StatusOfSecondary>Available</StatusOfSecondary>
  </StorageServiceProperties>
</StorageService>
Updated Storage Account Properties for myexamplestorage1:
<StorageService xmlns="http://schemas.microsoft.com/windowsazure" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <Url>https://management.core.windows.net/01234567-89ab-cdef-0123-456789abcdef/services/storageservices/myexamplestorage1</Url>
  <ServiceName>myexamplestorage1</ServiceName>
  <StorageServiceProperties>
    <Description>Updated description for myexamplestorage1</Description>
    <Location>North Central US</Location>
    <Label>updated_myexamplestorage1_label</Label>
    <Status>Created</Status>
    <Endpoints>
      <Endpoint>http://myexamplestorage1.blob.core.windows.net/</Endpoint>
      <Endpoint>http://myexamplestorage1.queue.core.windows.net/</Endpoint>
      <Endpoint>http://myexamplestorage1.table.core.windows.net/</Endpoint>
    </Endpoints>
    <GeoReplicationEnabled>false</GeoReplicationEnabled>
  </StorageServiceProperties>
</StorageService>
Press any key to continue:

Voir aussi

Afficher:
© 2014 Microsoft