エクスポート (0) 印刷
すべて展開

Update Storage Account

更新日: 2014年10月

Update Storage Account 非同期操作は、指定されたストレージ アカウントのラベルと説明を更新し、ジオレプリケーションの状態を有効または無効にします。

Update Storage Account要求は、次のように指定できます。<subscription-id> をサブスクリプション ID で、<service-name> をストレージ アカウントの名前でそれぞれ置き換えます。

 

メソッド 要求 URI

PUT

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

管理サービスに対して行われる要求をセキュリティで保護する必要があります。詳細については、「サービス管理要求の認証」を参照してください。

ありません。

要求ヘッダーの説明を次の表に示します。

 

要求ヘッダー 説明

Content-Type

必須。このヘッダーには、application/xml を設定します。

x-ms-version

必須。この要求に使用する操作のバージョンを指定します。このヘッダーには、2011/06/01 以降の値を設定する必要があります。geo レプリケーション機能を使用するには、バージョンが "2012-03-01" 以上である必要があります。

カスタム ドメイン機能を使用するには、バージョンが "2013-06-01" 以上である必要があります。

SecondaryReadEnabled 機能を使用するには、バージョンが "2013-11-01" 以上である必要があります。

AccountType フィールドを使用するには、バージョンが "2014-06-01" 以上である必要があります。GeoReplicationEnabled および SecondaryReadEnabled は今後サポートされないことに注意してください。これらの機能は AccountType に含まれます。

バージョン管理ヘッダーの詳細については、「サービス管理のバージョン管理」を参照してください。

要求本文の形式は次のとおりです。


<?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>
  <AccountType>type-of-storage-account</AccountType>
</UpdateStorageServiceInput>

要求本文の要素を次の表に示します。

 

要素名

説明

Label

省略可能。ストレージ アカウントの Base 64 でエンコードされた名前を指定します。ラベルの最大長は 100 文字です。ラベルは、ストレージ アカウントを追跡する場合に、アカウントを識別するために使用できます。Label または Description の値、あるいはその両方を指定する必要があります。

説明

省略可能。ストレージ アカウントの説明。説明の最大長は 1,024 文字です。Label または Description の値、あるいはその両方を指定する必要があります。

GeoReplicationEnabled

省略可能。指定されたストレージのジオレプリケーションを有効または無効にします。true に設定すると、サービスが壊滅的に失われた場合に回復できるように、ストレージ アカウント内のデータが複数の地理的な場所にレプリケートされます。false に設定すると、ジオレプリケーションが無効になります。この要素が要求本文に含まれていない場合は、現在の値がそのまま使用されます。

Important重要
ジオレプリケーションを有効にしている場合、この要素を false に設定することで無効にすることができます。無効にした場合、データはセカンダリ データ センターにレプリケートされなくなり、そのデータ センターのすべてのデータが削除されます。

無効になっているジオレプリケーションを有効にすると、データの現在のコピーをセカンダリ データ センターにレプリケートするため、ストレージ アカウントに課金されます。データの既存のコピーをセカンダリ データ センターにレプリケートした後は、追加料金なしで更新のジオレプリケーションが実行されます。

GeoReplicationEnabled 要素は、バージョン 01.03.12 以上を使用している場合のみ使用でき、バージョン 2014-06-01 以上を使用すると AccountType 要素によって置き換えられます。

ExtendedProperties

ストレージ アカウントに追加された拡張プロパティの名前と値を指定します。

CustomDomains

ストレージ アカウントに関連付けられたカスタム ドメインを指定します。

CustomDomains 要素を使用できるのは、バージョン 2013-06-01 以降を使用している場合だけです。

SecondaryReadEnabled

ストレージ アカウントでセカンダリ読み取りが有効になっていることを示します。

次の値をとります。

  • true

  • false

SecondaryReadEnabled 要素は、バージョン 2013/11/01 以上を使用している場合のみ使用でき、バージョン 2014-06-01 以上を使用すると AccountType 要素によって置き換えられます。

AccountType

アカウントが、ローカル冗長ストレージ、地理冗長ストレージ、読み取りアクセス地理冗長ストレージのいずれをサポートするかを指定します。ゾーン冗長ストレージは、ストレージ アカウントを更新する際のオプションではありません。

次の値をとります。

  • Standard_LRS

  • Standard_GRS

  • Standard_RAGRS

AccountType 要素は、バージョン 2014-06-01 以上を使用している場合にのみ使用できます。SecondaryReadEnabled 要素および GeoReplicationEnabled 要素に替わる要素です。

noteメモ
Standard_ZRS アカウントを他のアカウントに変更することはできず、他のアカウント タイプを Standard_ZRS に変更することはできないので、Standard_ZRS アカウント タイプはオプションではありません。

ストレージ アカウントに追加された拡張プロパティの名前と値を指定します。

 

要素名 説明

名前

省略可能。ストレージ アカウントの拡張プロパティの名前を表します。各拡張プロパティには、定義済みの名前と値の両方が必要です。拡張プロパティの名前と値のペアは最大 50 組使用できます。

Name 要素の最大長は 64 文字です。Name では英数字とアンダースコアのみが有効であり、名前の先頭にはアルファベットを使用する必要があります。他の文字を使用しようとした場合、Name の先頭がアルファベット以外の文字の場合、または同じストレージ アカウントが所有する別の拡張プロパティの名前と同一の名前を入力した場合は、ステータス コード 400 (Bad Request) のエラーが発生します。

Name 要素は、バージョン 01.03.12 以上を使用している場合のみ使用できます。

省略可能。ストレージ アカウントの拡張プロパティの値を表します。各拡張プロパティには、定義済みの名前と値の両方が必要です。拡張プロパティの名前と値のペアは最大 50 組使用できます。各拡張プロパティ値の最大長は 255 文字です。

Value 要素は、バージョン 01.03.12 以上を使用している場合のみ使用できます。

ストレージ アカウントに関連付けられたカスタム ドメインを指定します。

 

要素名 説明

CustomDomain

ストレージ アカウントに関連付けられたカスタム ドメインに関する情報を指定します。

名前

カスタム ドメインの名前を指定します。

UseSubDomainName

間接 CName 検証が有効かどうかを示します。

次の値をとります。

  • true

  • false

応答には、HTTP 状態コード、一連の応答ヘッダー、および応答本文が含まれています。

操作が正常に終了すると、ステータス コード 200 (OK) が返されます。ステータス コードの詳細については、「サービス管理のステータス コードとエラー コード」を参照してください。

この操作の応答には、次のヘッダーが含まれています。応答に追加の標準 HTTP ヘッダーが含まれる場合もあります。標準ヘッダーはすべて、HTTP/1.1 プロトコル仕様に準拠しています。

 

応答ヘッダー 説明

x-ms-request-id

管理サービスに対して行われた要求を一意に識別する値。非同期操作の場合は、ヘッダーの値を指定して Get Operation Status を呼び出して、操作が正常に終了したか、失敗したか、または処理中かを確認できます。

ありません。

Update Storage Account 操作を使用して、ストレージ アカウントの説明、ラベル、またはジオレプリケーションの設定値を変更します。これらの値は、Get Storage Account Properties 操作を使用して確認できます。

次の例では、Get Storage Account Properties 操作を呼び出してストレージ アカウントの初期プロパティ値を表示し、Update Storage Account 操作を呼び出して Label プロパティと Description プロパティを更新した後に、Get Storage Account Properties をもう一度呼び出して更新された結果を表示します。Version 文字列の値を目的のバージョンに、Thumbprint 値を管理証明書のサムプリントに、SubscriptionId をサブスクリプション ID に、ServiceName 値をこのサンプルを実行するストレージ アカウントの名前にそれぞれ変更します。

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

このサンプル プログラムを実行すると、次のような出力が生成されます。

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:

関連項目

表示:
© 2014 Microsoft