Mise à jour d'un compte de stockage
Le Update Storage Account
opération asynchrone met à jour l'étiquette, la description et Active ou désactive l'état de géo-réplication du compte de stockage spécifié.
Demande
Le Update Storage Account
demande 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 |
---|---|
PUT | https://management.core.windows.net/<subscription-id>/services/storageservices/<service-name> |
Vous devez vous assurer que la demande adressée au service de gestion est sécurisée. Pour plus d'informations, consultez authentification des demandes de Service de gestion.
Paramètres URI
Aucun.
En-têtes de demande
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 sur 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 définie 2011-06-01 ou une version ultérieure. Pour utiliser la fonctionnalité de géo-réplication, la version doit être au moins « 2012-03-01 ».Pour utiliser la fonctionnalité de domaine personnalisé, la version doit être au moins « 2013-06-01 ». Pour utiliser la fonctionnalité SecondaryReadEnabled, la version doit être au moins « 2013-11-01 ». La version doit être au moins « 2014-06-01 » pour utiliser le AccountType champ. Notez que GeoReplicationEnabled et SecondaryReadEnabled sont plus pris en charge passer – leur fonctionnalité est incluse dans AccountType .Pour plus d'informations sur les en-têtes de contrôle de version, consultez Versioning de gestion de Service. |
Corps de la demande
Le corps de la demande présente le format suivant :
<?xml version="1.0" encoding="utf-8"?> <UpdateStorageServiceInput xmlns="https://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> <AccountType>type-of-storage-account</AccountType> </UpdateStorageServiceInput>
Le tableau suivant décrit les éléments du corps de la demande.
Nom de l'élément | Description |
Étiquette | 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 les deux. |
Description | 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 les deux. |
GeoReplicationEnabled | Facultatif. Active ou désactive la géo-réplication sur le stockage spécifié. Si la valeur true , les données du 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 la valeur false , géo-réplication est désactivée. Si l'élément n'est pas inclus dans le corps de la demande, la valeur actuelle reste inchangée. Important: 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.Le GeoReplicationEnabled élément est uniquement disponible si vous utilisez la version 2012-03-01 ou une version ultérieure et est remplacé par l'élément AccountType de version 2014-06-01 ou une version ultérieure. |
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. Le CustomDomains élément 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 Le SecondaryReadEnabled élément est uniquement disponible si vous utilisez la version 2013-11-01 ou une version ultérieure et est remplacé par l'élément AccountType de version 2014-06-01 ou une version ultérieure. |
AccountType | Indique si le compte prend en charge le stockage localement redondant, le stockage géo-redondant ou le stockage géo-redondant avec accès en lecture. L'option de stockage à redondance de zone n'est pas disponible dans le cadre de la mise à jour d'un compte de stockage. Les valeurs possibles sont les suivantes : - Standard_LRS - Standard_GRS - Standard_RAGRS Le AccountType élément est uniquement disponible si vous utilisez la version 2014-06-01 ou une version ultérieure, et il remplace les éléments SecondaryReadEnabled et GeoReplicationEnabled. Note: Le Standard_ZRS et Premium_LRS les types de compte ne sont pas possible car ces comptes ne peut pas être modifiées à n'importe quel autre type de compte. Également, tous les autres types de compte ne peut pas être modifiés pour Standard_ZRS ou Premium_LRS . |
ExtendedProperties
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 | 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. Vous pouvez avoir un maximum de 50 propriétés étendues de paires nom/valeur. 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). Le Name élément est uniquement disponible si vous utilisez la version 2012-03-01 ou une version ultérieure. |
Valeur | 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. Le Value élément est uniquement disponible si vous utilisez la version 2012-03-01 ou une version ultérieure. |
CustomDomains
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 |
Réponse
La réponse inclut un code d'état HTTP, un ensemble d'en-têtes de réponse et un corps de réponse.
Code d'état
Une opération réussie envoie le code d'état 200 (OK). Pour plus d'informations sur les codes d'état, consultez état de gestion de Service et les Codes d'erreur.
En-têtes de réponse
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 appeler Obtenir l'état de l'opération avec la valeur de l'en-tête pour déterminer si l'opération est terminée, a échoué ou est toujours en cours. |
Corps de la réponse
Aucun.
Remarques
Utilisez le Update Storage Account
opération pour modifier la valeur de paramètre de description, une étiquette ou géo-réplication pour un compte de stockage. Vous pouvez utiliser la Obtenir les propriétés du compte de stockage opération pour examiner ces valeurs.
Exemple
L'exemple suivant appelle la Obtenir les propriétés du compte de stockage opération pour répertorier les valeurs initiales des propriétés pour le compte de stockage, met à jour le Label
et Description
propriétés avec un appel à la Update Storage Account
opération, puis affiche les résultats mis à jour avec un autre appel à Obtenir les propriétés du compte de stockage. Modifier la valeur de la Version
chaîne vers la nouvelle version, le Thumbprint
valeur à l'empreinte numérique de votre certificat de gestion le SubscriptionId
à votre identificateur d'abonnement et la ServiceName
valeur sur 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 = "https://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="https://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="https://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: