Compartilhar via


Criar Conta de Armazenamento

 

O Create Storage Account operação assíncrona cria uma nova conta de armazenamento no Microsoft Azure.

Solicitação

O Create Storage Account solicitação pode ser especificada da seguinte maneira. Substitua <subscription-id> pela sua ID de assinatura.

Método URI de solicitação
POST https://management.core.windows.net/<subscription-id>/services/storageservices

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 aplicativo/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. 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 para o corpo da solicitação:

<?xml version="1.0" encoding="utf-8"?> <CreateStorageServiceInput xmlns="https://schemas.microsoft.com/windowsazure"> <ServiceName>name-of-storage-account</ServiceName> <Description>description-of-storage-account</Description> <Label>base64-encoded-label</Label> <AffinityGroup>name-of-affinity-group</AffinityGroup> <Location>location-of-storage-account</Location> <GeoReplicationEnabled>geo-replication-indicator</GeoReplicationEnabled> <ExtendedProperties> <ExtendedProperty> <Name>property-name</Name> <Value>property-value</Value> </ExtendedProperty> </ExtendedProperties> <SecondaryReadEnabled>secondary-read-indicator</SecondaryReadEnabled> <AccountType>type-of-storage-account</AccountType> </CreateStorageServiceInput>  
  

A tabela a seguir descreve os elementos do corpo da solicitação.

Nome do elemento Descrição
Nome do Serviço Obrigatório. Um nome para a conta de armazenamento que é exclusiva dentro do Azure. Nomes de conta de armazenamento devem ter entre 3 e 24 caracteres de comprimento e devem usar números e letras minúsculas apenas.

Esse nome é o nome do prefixo DNS e pode ser usado para acessar blobs, filas e tabelas na conta de armazenamento.

Por exemplo: http://ServiceName.blob.core.windows.net/mycontainer/
Rótulo Obrigatório. Um rótulo para a conta de armazenamento especificada como uma cadeia de caracteres codificada na base 64. 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.
Descrição Opcional. Uma descrição para a conta de armazenamento. A descrição pode ter até 1024 caracteres.
Local Necessário se AffinityGroup não for especificado. O local em que a conta de armazenamento é criada.

Você pode incluir um local ou AffinityGroup elemento no corpo da solicitação, mas não ambos. Para listar os locais disponíveis, use o Listar locais operação.
AffinityGroup Necessário se local não for especificado. O nome de um grupo de afinidade existente na assinatura especificada.

Você pode incluir um local ou AffinityGroup elemento no corpo da solicitação, mas não ambos. Para listar grupos de afinidade disponíveis, use o Listar grupos de afinidade operação.
GeoReplicationEnabled Opcional. Especifica se a conta de armazenamento é criada com a replicação geográfica habilitada. Se o elemento não estiver incluído no corpo da solicitação, o valor padrão é true. 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.

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.
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 nome 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 valor elemento só está disponível com a versão 2012-03-01 ou superior.
SecondaryReadEnabled Opcional. 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, armazenamento com redundância de zona ou armazenamento com redundância geográfica com acesso de leitura.

Os possíveis valores são:

- Standard_LRS
- Standard_ZRS
- Standard_GRS
- Standard_RAGRS
- Premium_LRS

O AccountType elemento só está disponível com a versão 2014-06-01 ou superior e substitui os elementos SecondaryReadEnabled e GeoReplicationEnabled.

O Premium_LRS elemento só está disponível com a versão 2014-10-01 ou superior. Note: Um Standard_ZRS conta não pode ser alterada posteriormente para outro tipo de conta e outros tipos de conta não podem ser alterados para Standard_ZRS. O mesmo vale para Premium_LRS contas.

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

Você pode criar contas de armazenamento programaticamente com a Criar conta de armazenamento operação, até os limites disponíveis em sua assinatura. Para obter informações sobre os limites relacionados a contas de armazenamento, consulte assinatura do Azure e limites de serviço, cotas e restrições.

A operação retornará imediatamente com uma ID de solicitação, enquanto a criação da conta de armazenamento é executada de forma assíncrona pelo Azure, porque provisionar uma nova conta de armazenamento pode levar vários minutos. Para saber quando a operação de criação de conta de armazenamento for concluída, você poderá sondar o Obter Status da operação operação com o ID da solicitação. Isso retorna um corpo XML com um operação elemento que contém um Status elemento que tem um valor de InProgress, Failed, ou Succeeded, dependendo do status da criação da conta de armazenamento. Se você sondar até o status é Failed ou Succeeded, o operação elemento conterá um código de status no StatusCode elemento e operações com falha conterão informações de erro adicionais no erro elemento.

As informações metas de desempenho e escalabilidade do armazenamento do Azure podem também ajudá-lo ao planejar suas necessidades de armazenamento.

Exemplo

Esse programa de console de exemplo cria uma nova conta de armazenamento, definindo a descrição, label, local e estado de replicação geográfica usando o Criar conta de armazenamento operação, então sonda a Obter Status da operação com a ID da solicitação retornada da operação do Criar conta de armazenamento operação até que a chamada obteve êxito, falha, ou sondagem seja excedido. Por fim, ele chama Obter propriedades da conta de armazenamento para exibir as propriedades para a nova conta de armazenamento. Defina o valor para o x-ms-version cabeçalho no Version de cadeia de caracteres, o identificador de assinatura no SubscriptionId, sua impressão digital certificado de gerenciamento em Thumbprint, e defina ServiceName como um nome de conta de armazenamento exclusivo 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.Threading; 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 = "unique-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> /// The operation status values from PollGetOperationStatus. /// </summary> private enum OperationStatus { InProgress, Failed, Succeeded, TimedOut } /// <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); // Create the new storage account with the following values: string description = "Description for my example storage account"; string label = "My example storage account label"; string location = "North Central US"; bool? enableGeoReplication = true; string requestId = CreateStorageAccount( ServiceName, description, label, null, location, enableGeoReplication); Console.WriteLine( "Called Create Storage Account operation: requestId {0}", requestId); // Loop on Get Operation Status for result of storage creation OperationResult result = PollGetOperationStatus( requestId, pollIntervalSeconds: 20, timeoutSeconds: 180); switch (result.Status) { case OperationStatus.TimedOut: Console.WriteLine( "Poll of Get Operation Status timed out: " + "Operation {0} is still in progress after {1} seconds.", requestId, (int)result.RunningTime.TotalSeconds); break; case OperationStatus.Failed: Console.WriteLine( "Failed: Operation {0} failed after " + "{1} seconds with status {2} ({3}) - {4}: {5}", requestId, (int)result.RunningTime.TotalSeconds, (int)result.StatusCode, result.StatusCode, result.Code, result.Message); break; case OperationStatus.Succeeded: Console.WriteLine( "Succeeded: Operation {0} completed " + "after {1} seconds with status {2} ({3})", requestId, (int)result.RunningTime.TotalSeconds, (int)result.StatusCode, result.StatusCode); break; } // Display the property values for the new storage account. // Convert the Label property to a readable value for display. XElement updatedProperties = GetStorageAccountProperties(ServiceName); XElement labelElement = updatedProperties.Descendants(wa + "Label").First(); labelElement.Value = labelElement.Value.FromBase64(); Console.WriteLine( "New 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 Create Storage Account operation in the Service Management /// REST API for the specified subscription, storage account name, /// description, label, location or affinity group, and geo-replication /// enabled setting. /// </summary> /// <param name="serviceName">The name of the storage account to update.</param> /// <param name="description">The new description for the storage account.</param> /// <param name="label">The new label for the storage account.</param> /// <param name="affinityGroup">The affinity group name, or null to use a location.</param> /// <param name="location">The location name, or null to use an affinity group.</param> /// <param name="geoReplicationEnabled">The new geo-replication setting, if applicable. /// This optional parameter defaults to null.</param> /// <returns>The requestId for the operation.</returns> private static string CreateStorageAccount( string serviceName, string description, string label, string affinityGroup, string location, bool? geoReplicationEnabled = null) { string uriFormat = "https://management.core.windows.net/{0}" + "/services/storageservices"; Uri uri = new Uri(String.Format(uriFormat, SubscriptionId)); // Location and Affinity Group are mutually exclusive. // Use the location if it isn't null or empty. XElement locationOrAffinityGroup = String.IsNullOrEmpty(location) ? new XElement(wa + "AffinityGroup", affinityGroup) : new XElement(wa + "Location", location); // Create the request XML document XDocument requestBody = new XDocument( new XDeclaration("1.0", "UTF-8", "no"), new XElement( wa + "CreateStorageServiceInput", new XElement(wa + "ServiceName", serviceName), new XElement(wa + "Description", description), new XElement(wa + "Label", label.ToBase64()), locationOrAffinityGroup)); // Add the GeoReplicationEnabled element if the version supports it. if ((geoReplicationEnabled != null) && (String.CompareOrdinal(Version, "2011-12-01") >= 0)) { requestBody.Element( wa + "CreateStorageServiceInput").Add( new XElement( wa + "GeoReplicationEnabled", geoReplicationEnabled.ToString().ToLowerInvariant())); } XDocument responseBody; return InvokeRequest( uri, "POST", HttpStatusCode.Accepted, requestBody, out responseBody); } /// <summary> /// Calls the Get Operation Status operation in the Service /// Management REST API for the specified subscription and requestId /// and returns the Operation XML element from the response. /// </summary> /// <param name="requestId">The requestId of the operation to track.</param> /// <returns>The Operation XML element from the response.</returns> private static XElement GetOperationStatus( string requestId) { string uriFormat = "https://management.core.windows.net/{0}" + "/operations/{1}"; Uri uri = new Uri(String.Format(uriFormat, SubscriptionId, requestId)); XDocument responseBody; InvokeRequest(uri, "GET", HttpStatusCode.OK, null, out responseBody); return responseBody.Element(wa + "Operation"); } /// <summary> /// The results from PollGetOperationStatus are passed in this struct. /// </summary> private struct OperationResult { // The status: InProgress, Failed, Succeeded, or TimedOut. public OperationStatus Status { get; set; } // The http status code of the requestId operation, if any. public HttpStatusCode StatusCode { get; set; } // The approximate running time for PollGetOperationStatus. public TimeSpan RunningTime { get; set; } // The error code for the failed operation. public string Code { get; set; } // The message for the failed operation. public string Message { get; set; } } /// <summary> /// Polls Get Operation Status for the operation specified by requestId /// every pollIntervalSeconds until timeoutSeconds have passed or the /// operation has returned a Failed or Succeeded status. /// </summary> /// <param name="requestId">The requestId of the operation to get status for.</param> /// <param name="pollIntervalSeconds">The interval between calls to Get Operation Status.</param> /// <param name="timeoutSeconds">The maximum number of seconds to poll.</param> /// <returns>An OperationResult structure with status or error information.</returns> private static OperationResult PollGetOperationStatus( string requestId, int pollIntervalSeconds, int timeoutSeconds) { OperationResult result = new OperationResult(); DateTime beginPollTime = DateTime.UtcNow; TimeSpan pollInterval = new TimeSpan(0, 0, pollIntervalSeconds); DateTime endPollTime = beginPollTime + new TimeSpan(0, 0, timeoutSeconds); bool done = false; while (!done) { XElement operation = GetOperationStatus(requestId); result.RunningTime = DateTime.UtcNow - beginPollTime; try { // Turn the Status string into an OperationStatus value result.Status = (OperationStatus)Enum.Parse( typeof(OperationStatus), operation.Element(wa + "Status").Value); } catch (Exception) { throw new ApplicationException(string.Format( "Get Operation Status {0} returned unexpected status: {1}{2}", requestId, Environment.NewLine, operation.ToString(SaveOptions.OmitDuplicateNamespaces))); } switch (result.Status) { case OperationStatus.InProgress: Console.WriteLine( "In progress for {0} seconds", (int)result.RunningTime.TotalSeconds); Thread.Sleep((int)pollInterval.TotalMilliseconds); break; case OperationStatus.Failed: result.StatusCode = (HttpStatusCode)Convert.ToInt32( operation.Element(wa + "HttpStatusCode").Value); XElement error = operation.Element(wa + "Error"); result.Code = error.Element(wa + "Code").Value; result.Message = error.Element(wa + "Message").Value; done = true; break; case OperationStatus.Succeeded: result.StatusCode = (HttpStatusCode)Convert.ToInt32( operation.Element(wa + "HttpStatusCode").Value); done = true; break; } if (!done && DateTime.UtcNow > endPollTime) { result.Status = OperationStatus.TimedOut; done = true; } } return result; } /// <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); } } }  
  

Este programa de exemplo produz saída de console semelhante a esta ao ser executado:

Called Create Storage Account operation: requestId 8ba8bd9cdc50472892a0b3cd3659b297 In progress for 0 seconds In progress for 20 seconds In progress for 41 seconds In progress for 61 seconds In progress for 82 seconds In progress for 103 seconds Succeeded: Operation 8ba8bd9cdc50472892a0b3cd3659b297 completed after 123 seconds with status 200 (OK) New 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>Description for my example storage account</Description> <Location>North Central US</Location> <Label>My example storage account 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> Press any key to continue: