Atualizar conta de armazenamento
O Update Storage Account
operação assíncrona atualiza o rótulo e a descrição e habilita ou desabilita o status de replicação geográfica da conta de armazenamento especificado.
Solicitação
O Update Storage Account
solicitação pode ser especificada da seguinte maneira. Substitua <subscription-id>
pela sua ID de assinatura e <service-name>
com o nome da sua conta de armazenamento.
Método | URI de solicitação |
---|---|
PUT | https://management.core.windows.net/<subscription-id>/services/storageservices/<service-name> |
Verifique se a solicitação feita ao serviço de gerenciamento é segura. Para obter mais detalhes, consulte solicitações de gerenciamento de serviço de autenticação.
Parâmetros URI
Nenhuma.
Cabeçalhos de solicitação
A tabela a seguir descreve os cabeçalhos da solicitação.
Cabeçalho de solicitação | Descrição |
---|---|
Content-Type |
Obrigatório. Defina este cabeçalho como application/xml . |
x-ms-version |
Obrigatório. Especifica a versão da operação a ser usada para esta solicitação. O valor deste cabeçalho deve ser definido como 2011-06-01 ou superior. A versão deve ser pelo menos “2012-03-01” para usar a funcionalidade de replicação geográfica.A versão deve ser pelo menos “2013-06-01” para usar a funcionalidade de domínio personalizado. A versão deve ser pelo menos “2013-11-01” usar o recurso de SecondaryReadEnabled. A versão deve ser pelo menos "2014-06-01" usar o AccountType campo. Observe que GeoReplicationEnabled e SecondaryReadEnabled não são suportadas futuras – sua funcionalidade está incluída no AccountType .Para obter mais informações sobre cabeçalhos de controle de versão, consulte o controle de versão do serviço de gerenciamento. |
Corpo da solicitação
Formato do corpo da solicitação:
<?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>
A tabela a seguir descreve os elementos do corpo da solicitação.
Nome do elemento | Descrição |
Rótulo | Opcional. Especifica um nome codificado na base 64 para a conta de armazenamento. O rótulo pode ter até 100 caracteres. O rótulo pode ser usado para identificar a conta de armazenamento para suas finalidades de acompanhamento. Você deve especificar um valor para Label ou Description , ou ambas. |
Descrição | Opcional. Uma descrição para a conta de armazenamento. A descrição pode ter até 1024 caracteres. Você deve especificar um valor para Label ou Description , ou ambas. |
GeoReplicationEnabled | Opcional. Habilita ou desabilita a replicação geográfica no armazenamento especificado. Se definido como true , os dados na conta de armazenamento são replicados em mais de um local geográfico para habilitar a resiliência caso ocorra uma perda catastrófica do serviço. Se definido como false , a replicação geográfica está desabilitada. Se o elemento não estiver incluído no corpo da solicitação, o valor atual ficará inalterado. Important: Se você habilitou a replicação geográfica, poderá optar por desabilitá-la definindo esse elemento como falso. Quando desabilitados, os dados não serão replicados para um data center secundário e todos os dados no local secundário serão removidos. Habilitar a replicação geográfica depois de ter sido desabilitada resultará na conta de armazenamento ser faturada para replicar a cópia atual dos dados no data center secundário. Depois que a cópia de dados existente for replicada no data center secundário, as atualizações são replicadas geograficamente sem custo adicional.O GeoReplicationEnabled elemento só está disponível com a versão 2012-03-01 ou superior e é substituído pelo elemento AccountType com a versão 2014-06-01 ou superior. |
ExtendedProperties | Especifica o nome e o valor de uma propriedade estendida que foi adicionada à conta de armazenamento. |
CustomDomains | Especifica os domínios personalizados que são associados à conta de armazenamento. O CustomDomains elemento só está disponível com a versão 2013-06-01 ou superior. |
SecondaryReadEnabled | Indica que a leitura secundária está habilitada para a conta de armazenamento. Os possíveis valores são: - true - false O SecondaryReadEnabled elemento só está disponível com a versão 2013-11-01 ou superior e é substituído pelo elemento AccountType com a versão 2014-06-01 ou superior. |
AccountType | Especifica se a conta comporta armazenamento com redundância local, armazenamento com redundância geográfica ou armazenamento com redundância geográfica com acesso de leitura. O armazenamento com redundância de zona não será uma opção quando você estiver atualizando uma conta de armazenamento. Os possíveis valores são: - Standard_LRS - Standard_GRS - Standard_RAGRS O AccountType elemento só está disponível com a versão 2014-06-01 ou superior e substitui os elementos SecondaryReadEnabled e GeoReplicationEnabled. Note: O Standard_ZRS e Premium_LRS tipos de conta não são uma opção porque essas contas não podem ser alteradas para qualquer outro tipo de conta. Além disso, todos os outros tipos de conta não podem ser alterados para Standard_ZRS ou Premium_LRS . |
ExtendedProperties
Especifica o nome e o valor de uma propriedade estendida que foi adicionada à conta de armazenamento.
Nome do elemento | Descrição |
---|---|
Nome | Opcional. Representa o nome de uma propriedade estendida da conta de armazenamento. Cada propriedade estendida deve ter um nome e um valor definido. Você pode ter um máximo de 50 propriedades estendidas como pares de nome/valor. O comprimento máximo do elemento Nome é de 64 caracteres, somente os caracteres alfanuméricos e sublinhados são válidos no Nome, e o nome deve começar com uma letra. Tentar usar outros caracteres, começar o Nome com um caractere diferente de letra ou inserir um nome que seja idêntico ao de outra propriedade estendida de propriedade da mesma conta de armazenamento resultará em um erro de código de status 400 (Solicitação Incorreta). O Name elemento só está disponível com a versão 2012-03-01 ou superior. |
Valor | Opcional. Representa o valor de uma propriedade estendida da conta de armazenamento. Cada propriedade estendida deve ter um nome e um valor definido. Você pode ter até 50 pares de nome/valor da propriedade estendida, e cada valor de propriedade estendida terá um comprimento máximo de 255 caracteres. O Value elemento só está disponível com a versão 2012-03-01 ou superior. |
CustomDomains
Especifica os domínios personalizados que são associados à conta de armazenamento.
Nome do elemento | Descrição |
---|---|
CustomDomain | Especifica informações sobre um domínio personalizado que é associado à conta de armazenamento. |
Nome | Especifica o nome do domínio personalizado. |
UseSubDomainName | Indica se a validação indireta de CName está habilitada. Os possíveis valores são: - true - false |
Resposta
A resposta inclui um código de status HTTP, um conjunto de cabeçalhos de resposta e um corpo de resposta.
Código de status
Uma operação bem-sucedida retorna o código de status 200 (OK). Para obter informações sobre códigos de status, consulte Status do gerenciamento de serviço e códigos de erro.
Cabeçalhos de resposta
A resposta para esta operação inclui os cabeçalhos a seguir. A resposta também pode incluir cabeçalhos padrão HTTP adicionais. Todos os cabeçalhos padrão obedecem a especificação de protocolo HTTP/1.1.
Cabeçalho de resposta | Descrição |
---|---|
x-ms-request-id |
Um valor que identifica exclusivamente uma solicitação feita no serviço de gerenciamento. Para uma operação assíncrona, você pode chamar Obter Status da operação com o valor do cabeçalho para determinar se a operação for concluída, falhou ou ainda está em andamento. |
Corpo da resposta
Nenhuma.
Comentários
Use o Update Storage Account
operação para alterar o valor da configuração de descrição, o rótulo ou a replicação geográfica para uma conta de armazenamento. Você pode usar o Obter propriedades da conta de armazenamento operação para revisar esses valores.
Exemplo
A exemplo a seguir chama o Obter propriedades da conta de armazenamento operação para listar os valores de propriedade inicial para a conta de armazenamento, atualiza o Label
e Description
propriedades com uma chamada para o Update Storage Account
operação, em seguida, exibe os resultados atualizados com outra chamada para Obter propriedades da conta de armazenamento. Altere o valor da Version
cadeia de caracteres para a versão desejada, o Thumbprint
valor para a impressão digital para seu certificado de gerenciamento, o SubscriptionId
para o identificador de assinatura e o ServiceName
valor com o nome da sua conta de armazenamento para executar o exemplo.
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); } } }
Quando executado, um programa de exemplo gerará uma saída parecida com o seguinte:
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: