チュートリアル: Windows VM のシステム割り当てマネージド ID を使用して Azure Storage にアクセスする

Azure リソース用マネージド ID は、Microsoft Entra ID の機能です。 Azure リソースのマネージド ID をサポートする各 Azure サービスは、それぞれ固有のタイムラインの下で提供されます。 ご利用のリソースに対するマネージド ID の提供状態と既知の問題をあらかじめ確認しておいてください。

このチュートリアルでは、Windows 仮想マシン (VM) のシステム割り当てマネージド ID を使用して Azure Storage にアクセスする方法について説明します。 学習内容は次のとおりです。

  • ストレージ アカウントに BLOB コンテナーを作成する
  • Windows VM のシステム割り当てマネージド ID にストレージ アカウントへのアクセスを許可する
  • アクセス権を取得し、それを使用して Azure Storage を呼び出す

Note

Azure Storage の Microsoft Entra 認証は、パブリック プレビューの段階です。

前提条件

有効にする

システム割り当てマネージド ID の有効化は、1 クリックで行うことができます。 VM の作成中に有効にするか、既存の VM のプロパティで有効にすることができます。

仮想マシンの [システム割り当て済み] タブを示すスクリーンショット。ここで、システム割り当て済みの状態を有効にできます。

新しい VM 上でシステム割り当てマネージド ID を有効にするには:

  1. Azure ポータル

  2. システム割り当て ID を有効にして仮想マシンを作成する

アクセス権の付与

ストレージ アカウントの作成

このセクションでは、ストレージ アカウントを作成します。

  1. Azure portal の左上隅にある [リソースの作成] ボタンを選択します。

  2. [ストレージ][ストレージ アカウント - Blob、File、Table、Queue] の順に選択します。

  3. [名前] で、ストレージ アカウントの名前を入力します。

  4. [デプロイ モデル][アカウントの種類] がそれぞれ [Resource manager][ストレージ (汎用 v1)] に設定されている必要があります。

  5. [サブスクリプション][リソース グループ] が、前の手順で VM を作成したときに指定したものと一致していることを確認します。

  6. [作成] を選択します

    新しいストレージ アカウントを作成する方法を示すスクリーンショット。

BLOB コンテナーを作成し、ファイルをストレージ アカウントにアップロードする

ファイルには Blob Storage が必要であるため、ファイルを格納する BLOB コンテナーを作成する必要があります。 次に、新しいストレージ アカウントで、BLOB コンテナーにファイルをアップロードします。

  1. 新たに作成したストレージ アカウントに戻ります。

  2. [Blob service][コンテナー] を選択します。

  3. ページの上部にある [+ コンテナー] を選択します。

  4. [新しいコンテナー] で、コンテナーの名前を入力し、[パブリック アクセス レベル] で既定値を保持します。

    ストレージ コンテナーの作成方法を示すスクリーンショット。

  5. 任意のエディターを使用して、ローカル コンピューターに hello world.txt という名前のファイルを作成します。 ファイルを開き、"Hello world! :)" というテキストを (引用符なしで) 追加し、保存します。

  6. 新しく作成したコンテナーにファイルをアップロードします。コンテナー名をクリックしてから [アップロード] をクリックします。

  7. [BLOB のアップロード] ウィンドウの [ファイル] で、フォルダー アイコンを選択し、ローカル コンピューターの hello_world.txt を参照してファイルを選択して、[アップロード] を選択します。 テキスト ファイルのアップロード画面を示すスクリーンショット。

アクセス権の付与

このセクションでは、Azure Storage コンテナーへのアクセスを VM に許可する方法を説明します。 VM のシステム割り当てマネージド ID を使用して、Azure Storage Blob のデータを取得できます。

  1. 新たに作成したストレージ アカウントに戻ります。

  2. [アクセス制御 (IAM)] を選択します。

  3. [追加]>[ロールの割り当ての追加] を選択して、[ロールの割り当ての追加] ページを開きます。

  4. 次のロールを割り当てます。 詳細な手順については、「Azure portal を使用して Azure ロールを割り当てる」を参照してください。

    設定
    Role ストレージ BLOB データ閲覧者
    アクセスの割り当て先 マネージド ID
    システム割り当て 仮想マシン
    Select <お使いの仮想マシン>

    ロールの割り当てを追加するためのページを示すスクリーンショット。

データにアクセスする

Azure Storage は Microsoft Entra 認証をネイティブにサポートするため、マネージド ID を使用して取得したアクセス トークンを直接受け入れることができます。 この手法では Azure Storage の Microsoft Entra ID との統合が使用され、接続文字列に資格情報を提供することとは異なります。

Azure Storage への接続を開く .NET コード例を次に示します。 この例ではアクセス トークンを使用し、前に作成したファイルの内容を読み取ります。 このコードは、VM のマネージド ID のエンドポイントにアクセスできる VM 上で実行する必要があります。 アクセス トークン メソッドを使用するには、.NET Framework 4.6 以降が必要です。 適宜、<URI to blob file> の値を置き換えます。 この値は、以前に作成して Blob Storage にアップロードしたファイルに移動し、[概要] ページの [プロパティ]URL をコピーすることで取得できます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Net;
using System.Web.Script.Serialization;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;

namespace StorageOAuthToken
{
    class Program
    {
        static void Main(string[] args)
        {
            //get token
            string accessToken = GetMSIToken("https://storage.azure.com/");

            //create token credential
            TokenCredential tokenCredential = new TokenCredential(accessToken);

            //create storage credentials
            StorageCredentials storageCredentials = new StorageCredentials(tokenCredential);

            Uri blobAddress = new Uri("<URI to blob file>");

            //create block blob using storage credentials
            CloudBlockBlob blob = new CloudBlockBlob(blobAddress, storageCredentials);

            //retrieve blob contents
            Console.WriteLine(blob.DownloadText());
            Console.ReadLine();
        }

        static string GetMSIToken(string resourceID)
        {
            string accessToken = string.Empty;
            // Build request to acquire MSI token
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=" + resourceID);
            request.Headers["Metadata"] = "true";
            request.Method = "GET";

            try
            {
                // Call /token endpoint
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                // Pipe response Stream to a StreamReader, and extract access token
                StreamReader streamResponse = new StreamReader(response.GetResponseStream());
                string stringResponse = streamResponse.ReadToEnd();
                JavaScriptSerializer j = new JavaScriptSerializer();
                Dictionary<string, string> list = (Dictionary<string, string>)j.Deserialize(stringResponse, typeof(Dictionary<string, string>));
                accessToken = list["access_token"];
                return accessToken;
            }
            catch (Exception e)
            {
                string errorText = String.Format("{0} \n\n{1}", e.Message, e.InnerException != null ? e.InnerException.Message : "Acquire token failed");
                return accessToken;
            }
        }
    }
}

応答には、次のようなファイルの内容が含まれています。

Hello world! :)

Disable

VM 上でシステム割り当て ID を無効にするには、システム割り当て ID の状態を Off に設定します。

仮想マシンの [システム割り当て済み] タブを示すスクリーンショット。ここで、システム割り当て済みの状態を無効にできます。

次のステップ

このチュートリアルでは、Windows VM のシステム割り当て ID を使用して Azure Storage にアクセスする方法を説明しました。 Azure Storage の詳細については、以下を参照してください。