チュートリアル: Windows VM/VMSS を使用して Azure リソースにアクセスする

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

前提条件

Windows VM のシステム割り当てマネージド ID を使用して Azure Data Lake Store にアクセスする

このチュートリアルでは、Windows 仮想マシン (VM) のシステム割り当てマネージド ID を使用して Azure Data Lake Store にアクセスする方法について説明します。 マネージド ID は Azure によって自動的に管理されます。 これにより、コードに資格情報を埋め込まなくても、アプリケーションが Microsoft Entra 認証対応のサービスに対して認証できるようになります。

この記事では、次の方法について学習します。

  • VM に Azure Data Lake Store へのアクセスを許可する
  • VM ID を使用してアクセス トークンを取得し、それを使用して Azure Data Lake Store にアクセスする

有効にする

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

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

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

  1. Azure portal にサインインします。

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

アクセス権の付与

VM に Azure Data Lake Store のファイルとフォルダーへのアクセスを許可できます。 この手順では、既存の Data Lake Store を使用することも、新しいものを作成することもできます。

Azure portal を使用して新しい Data Lake Store を作成するには、Azure Data Lake Store のクイック スタートを参照してください。 Azure Data Lake Store のドキュメントに、Azure CLI と Azure PowerShell を使用するクイック スタートも用意されています。

Data Lake Store で新しいフォルダーを作成し、VM のシステム割り当て ID のアクセス許可を付与します。 この ID には、そのフォルダー内のファイルの読み取り、書き込み、実行を行う権限が必要です。

  1. Azure portal で、左側のナビゲーションの [Data Lake Store] を選びます。
  2. このチュートリアルで使用する Data Lake Store を選びます。
  3. コマンド バーの [データ エクスプローラー] を選びます。
  4. Data Lake Store のルート フォルダーが選択されます。 コマンド バーの [アクセス] を選びます。
  5. [追加] を選択します。 [選択] フィールドにお使いの VM の名前 (例: DevTestVM) を入力します。 検索結果からお使いの VM を選び、[選択] を選びます。
  6. [アクセス許可の選択] を選択してから、[読み取り][実行] を選びます。 [このフォルダー] に追加し、[アクセス許可のみ] を選択します。
  7. [OK] を選択し、[アクセス] ブレードを閉じます。 アクセス許可が正常に追加されます。
  8. 次に、新しいフォルダーを作成します。 コマンド バーの [新しいフォルダー] を選び、この新しいフォルダーに名前を付けます。 たとえば TestFolder とし、[OK] を選択します。
  9. 作成したフォルダーを選択し、コマンド バーの [アクセス] を選択します。
  10. [追加] を選択してから、[選択] フィールドに VM の名前を入力し、[選択] を選びます。
  11. [アクセス許可の選択] を選択し、[読み取り][書き込み][実行] を選択します。 [このフォルダー] に追加してから、[アクセス許可エントリと既定のアクセス許可エントリ] として追加します。
  12. [OK] を選択します。 アクセス許可が正常に追加されます。

この時点で VM のシステム割り当てマネージド ID は、作成したフォルダーのファイルに対してすべての操作を実行できます。 Data Lake Store のアクセス管理については、Data Lake Store のアクセス制御に関するページをご覧ください。

データにアクセスする

Azure Data Lake Store は Microsoft Entra 認証をネイティブにサポートするため、Azure リソース用マネージド ID を使用して取得されたアクセス トークンを直接受け入れることができます。 Data Lake Store のファイルシステムに認証するために、お使いの Data Lake Store ファイルシステムのエンドポイントに Microsoft Entra ID によって発行されたアクセス トークンを Authorization ヘッダーで送信します。 ヘッダーの形式は Bearer <ACCESS_TOKEN_VALUE> です。

Microsoft Entra 認証に対する Data Lake Store のサポートの詳細については、Microsoft Entra ID を使った Data Lake Store での認証に関するページを参照してください。

Note

Data Lake Store ファイルシステムのクライアント SDK では、Azure リソースのマネージド ID はまだサポートされていません。

このチュートリアルでは、PowerShell を使用して Data Lake Store ファイルシステムの REST API と認証し、REST 要求を行います。 VM のシステム割り当てマネージド ID を認証で使用するには、VM から要求を行う必要があります。

  1. ポータルで [仮想マシン] に移動し、Windows VM に移動します。 次に、[概要] セクションで、[接続] を選びます。

  2. Windows VM を作成したときに追加したユーザー名パスワードを入力します。

  3. これで、VM とのリモート デスクトップ接続が作成されました。リモート セッションで PowerShell を開きます。

  4. PowerShell の Invoke-WebRequest コマンドレットを使用して、Azure リソース エンドポイントのローカル マネージド ID に、Azure Data Lake Store のアクセス トークンを取得するよう要求します。 Data Lake Store のリソース識別子は https://datalake.azure.net/ です。 Data Lake はリソース識別子の完全一致を確認するため、末尾のスラッシュが重要です。

    $response = Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fdatalake.azure.net%2F' -Method GET -Headers @{Metadata="true"}
    

    応答を JSON オブジェクトから PowerShell オブジェクトに変換します。

    $content = $response.Content | ConvertFrom-Json
    

    応答からアクセス トークンを抽出します。

    $AccessToken = $content.access_token
    
  5. すべてが正しく構成されていることを確認します。 PowerShell の Invoke-WebRequest コマンドレットを使用して、ルート フォルダー内のフォルダーを一覧表示するよう Data Lake Store の REST エンドポイントに要求します。 Authorization ヘッダーの文字列 Bearer に、大文字の "B" があることが重要です。 Data Lake Store の [概要] セクションで、ご利用の Data Lake Store の名前を確認できます。

    Invoke-WebRequest -Uri https://<YOUR_ADLS_NAME>.azuredatalakestore.net/webhdfs/v1/?op=LISTSTATUS -Headers @{Authorization="Bearer $AccessToken"}
    

    正常な応答は次のようになります。

    StatusCode        : 200
    StatusDescription : OK
    Content           : {"FileStatuses":{"FileStatus":[{"length":0,"pathSuffix":"TestFolder","type":"DIRECTORY", "blockSize":0,"accessTime":1507934941392, "modificationTime":1507944835699,"replication":0, "permission":"770","ow..."
    RawContent        : HTTP/1.1 200 OK
                        Pragma: no-cache
                        x-ms-request-id: b4b31e16-e968-46a1-879a-3474aa7d4528
                        x-ms-webhdfs-version: 17.04.22.00
                        Status: 0x0
                        X-Content-Type-Options: nosniff
                        Strict-Transport-Security: ma...
    Forms             : {}
    Headers           : {[Pragma, no-cache], [x-ms-request-id, b4b31e16-e968-46a1-879a-3474aa7d4528],
                        [x-ms-webhdfs-version, 17.04.22.00], [Status, 0x0]...}
    Images            : {}
    InputFields       : {}
    Links             : {}
    ParsedHtml        : System.__ComObject
    RawContentLength  : 556
    
  6. ここで、Data Lake Store へのファイルのアップロードを試します。 まず、アップロードするファイルを作成します。

    echo "Test file." > Test1.txt
    
  7. PowerShell の Invoke-WebRequest コマンドレットを使用して、先ほど作成したフォルダーにファイルをアップロードするよう Data Lake Store の REST エンドポイントに要求します。 この要求では 2 つの手順が実行されます。

    1. 要求を行うと、ファイルをアップロードする場所にリダイレクトされます。
    2. ファイルをアップロードします。 このチュートリアルに示されているのとは異なる値を使用する場合は、フォルダーとファイルの名前を正しく設定するのを忘れないでください。
    $HdfsRedirectResponse = Invoke-WebRequest -Uri https://<YOUR_ADLS_NAME>.azuredatalakestore.net/webhdfs/v1/TestFolder/Test1.txt?op=CREATE -Method PUT -Headers @{Authorization="Bearer $AccessToken"} -Infile Test1.txt -MaximumRedirection 0
    

    $HdfsRedirectResponse の値を確認すると、次の応答のような値になります。

    PS C:\> $HdfsRedirectResponse
    
    StatusCode        : 307
    StatusDescription : Temporary Redirect
    Content           : {}
    RawContent        : HTTP/1.1 307 Temporary Redirect
                        Pragma: no-cache
                        x-ms-request-id: b7ab492f-b514-4483-aada-4aa0611d12b3
                        ContentLength: 0
                        x-ms-webhdfs-version: 17.04.22.00
                        Status: 0x0
                        X-Content-Type-Options: nosn...
    Headers           : {[Pragma, no-cache], [x-ms-request-id, b7ab492f-b514-4483-aada-4aa0611d12b3], 
                        [ContentLength, 0], [x-ms-webhdfs-version, 17.04.22.00]...}
    RawContentLength  : 0
    

    リダイレクト エンドポイントに要求を送信してアップロードを完了します。

    Invoke-WebRequest -Uri $HdfsRedirectResponse.Headers.Location -Method PUT -Headers @{Authorization="Bearer $AccessToken"} -Infile Test1.txt -MaximumRedirection 0
    

    正常な応答は次のようになります。

    StatusCode        : 201
    StatusDescription : Created
    Content           : {}
    RawContent        : HTTP/1.1 201 Created
                        Pragma: no-cache
                        x-ms-request-id: 1e70f36f-ead1-4566-acfa-d0c3ec1e2307
                        ContentLength: 0
                        x-ms-webhdfs-version: 17.04.22.00
                        Status: 0x0
                        X-Content-Type-Options: nosniff
                        Strict...
    Headers           : {[Pragma, no-cache], [x-ms-request-id, 1e70f36f-ead1-4566-acfa-d0c3ec1e2307],
                        [ContentLength, 0], [x-ms-webhdfs-version, 17.04.22.00]...}
    RawContentLength  : 0
    

最後に、その他の Data Lake Store ファイルシステムの API を使用して、ファイルへの追加、ファイルのダウンロードなどを行うことができます。

Disable

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

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

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

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

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

有効にする

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

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

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

  1. Azure portal にサインインします。

  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 を使用して SAS 資格情報で Azure Storage にアクセスする

このチュートリアルでは、Windows 仮想マシン (VM) のシステム割り当て ID を使用して、ストレージの Shared Access Signature (SAS) 資格情報を取得する方法について説明します。

サービス SAS は、ストレージ アカウント内のオブジェクトへの限られたアクセス許可を限られた時間にわたって特定のサービス (この例では BLOB サービス) に対してのみ提供できます。 SAS を使用すると、これがアカウント アクセス キーを公開することなく行われます。 SAS 資格情報は、ストレージ SDK を使用するときなど、ストレージ操作に通常どおりに使用できます。 このチュートリアルでは、Azure Storage PowerShell を使用して BLOB のアップロードとダウンロードを行う手順を示します。

学習内容は次のとおりです。

  • ストレージ アカウントの作成
  • Resource Manager で VM にストレージ アカウント SAS へのアクセス権を付与する
  • VM の ID を使用してアクセス トークンを取得し、それを使用して Resource Manager から SAS を取得する

注意

Azure を操作するには、Azure Az PowerShell モジュールを使用することをお勧めします。 作業を開始するには、Azure PowerShell のインストールに関する記事を参照してください。 Az PowerShell モジュールに移行する方法については、「AzureRM から Az への Azure PowerShell の移行」を参照してください。

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

まだ持っていない場合は、この時点でストレージ アカウントを作成する必要があります。 それ以外の場合は、これらの手順に従って、既存のストレージ アカウントの SAS 資格情報へのアクセスを、VM のシステム割り当てマネージド ID に許可します。

  1. [ストレージ] を選択し、次に [ストレージ アカウント] を選択します。

  2. [ストレージ アカウントの作成] パネルで、ストレージ アカウントの名前を入力します。

  3. [デプロイ モデル][アカウントの種類][Resource Manager][汎用] にそれぞれ設定されている必要があります。

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

  5. [+ 作成] を選択してストレージ アカウントを作成します。

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

ストレージ アカウントに BLOB コンテナーを作成する

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

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

  2. 左側のパネルで、[Blob service] の下の [コンテナー] リンクを選択します。

  3. ページの上部にある [+ コンテナー] を選択すると、[新しいコンテナー] パネルが表示されます。

  4. コンテナーに名前を付け、アクセス レベルを決定して、[OK] を選択します。 ここで指定した名前は、チュートリアルの後半で使用します。

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

VM のシステム割り当てマネージド ID にストレージ SAS を使用するためのアクセス権を付与する

Azure Storage では、ネイティブで Microsoft Entra 認証がサポートされていません。 ただし、マネージド ID を使用して Resource Manager からストレージ SAS を取得し、その SAS を使用してストレージにアクセスできます。 この手順では、ストレージ アカウントの SAS へのアクセス権を VM のシステム割り当てマネージド ID に付与します。

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

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

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

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

    設定
    Role ストレージ アカウント共同作業者
    アクセスの割り当て先 マネージド ID
    システム割り当て 仮想マシン
    Select <Windows 仮想マシン>

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

VM ID を使用してアクセス トークンを取得し、そのアクセス トークンを使用して Azure Resource Manager を呼び出す

チュートリアルの残りの部分では、VM から作業を行います。 ここでは、Azure Resource Manager PowerShell コマンドレットを使用する必要があります。 PowerShell をインストールしていない場合は、先に進む前に、最新バージョンをダウンロードしてください。

  1. Azure Portal で [Virtual Machines] にナビゲートして Windows 仮想マシンに移動し、[概要] ページの上部にある [接続] を選びます。

  2. Windows VM を作成したときに追加したユーザー名パスワードを入力します。

  3. 仮想マシンとのリモート デスクトップ接続を確立します。

  4. リモート セッションで PowerShell を開き、PowerShell の Invoke-WebRequest コマンドレットを使用して、Azure リソース エンドポイントのローカル マネージド ID から Azure Resource Manager トークンを取得します。

       $response = Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fmanagement.azure.com%2F' -Method GET -Headers @{Metadata="true"}
    

    Note

    resource パラメーターの値は、Microsoft Entra ID で想定されているものと完全に一致している必要があります。 Azure Resource Manager のリソース ID を使用する場合は、URI の末尾にスラッシュを含める必要があります。

    次に、$response オブジェクトに JavaScript Object Notation (JSON) 形式の文字列として格納されている content 要素を抽出します。

    $content = $response.Content | ConvertFrom-Json
    

    次に、アクセス トークンを応答から抽出します。

    $ArmToken = $content.access_token
    

ストレージ呼び出しを行うために Azure Resource Manager から SAS 資格情報を取得する

最後に、PowerShell を使用して、前のセクションで取得したアクセス トークンを使って Resource Manager を呼び出します。 このトークンを使用して、ストレージ SAS 資格情報を作成します。 SAS 資格情報を取得したら、他のストレージ操作を呼び出すことができます。

この要求のために、次の HTTP 要求のパラメーターを使用して SAS 資格情報を作成します。

{
    "canonicalizedResource":"/blob/<STORAGE ACCOUNT NAME>/<CONTAINER NAME>",
    "signedResource":"c",              // The kind of resource accessible with the SAS, in this case a container (c).
    "signedPermission":"rcw",          // Permissions for this SAS, in this case (r)ead, (c)reate, and (w)rite. Order is important.
    "signedProtocol":"https",          // Require the SAS be used on https protocol.
    "signedExpiry":"<EXPIRATION TIME>" // UTC expiration time for SAS in ISO 8601 format, for example 2017-09-22T00:06:00Z.
}

ここでは、パラメーターは SAS 資格情報に対する要求の POST 本文に含まれます。 SAS 資格情報を作成するためのパラメーターの詳細については、List Service SAS REST リファレンスに関する記事を参照してください。

  1. パラメーターを JSON に変換し、その後で SAS 資格情報を作成するストレージの listServiceSas エンドポイントを呼び出します。

    $params = @{canonicalizedResource="/blob/<STORAGE-ACCOUNT-NAME>/<CONTAINER-NAME>";signedResource="c";signedPermission="rcw";signedProtocol="https";signedExpiry="2017-09-23T00:00:00Z"}
    $jsonParams = $params | ConvertTo-Json
    
    $sasResponse = Invoke-WebRequest -Uri https://management.azure.com/subscriptions/<SUBSCRIPTION-ID>/resourceGroups/<RESOURCE-GROUP>/providers/Microsoft.Storage/storageAccounts/<STORAGE-ACCOUNT-NAME>/listServiceSas/?api-version=2017-06-01 -Method POST -Body $jsonParams -Headers @{Authorization="Bearer $ArmToken"}
    

    Note

    URL では大文字小文字が区別されるため、リソース グループの命名時に使用したものと同じ大文字小文字が使用されていること (resourceGroups の "G" が大文字であることを含む) を確認してください。

  2. 次に、応答から SAS 資格情報を抽出します。

    $sasContent = $sasResponse.Content | ConvertFrom-Json
    $sasCred = $sasContent.serviceSasToken
    
  3. SAS 資格情報を検査すると、次のような内容が表示されます。

    PS C:\> $sasCred
    sv=2015-04-05&sr=c&spr=https&se=2017-09-23T00%3A00%3A00Z&sp=rcw&sig=JVhIWG48nmxqhTIuN0uiFBppdzhwHdehdYan1W%2F4O0E%3D
    
  4. test.txt というファイルを作成します。 その後、SAS 資格情報を使用して New-AzStorageContent コマンドレットで認証を行い、ファイルを BLOB コンテナーにアップロードしてから、ファイルをダウンロードします。

    echo "This is a test text file." > test.txt
    
  5. 必ず、最初に Install-Module Azure.Storage を使用して Azure Storage コマンドレットをインストールしてください。 その後、先ほど作成した BLOB を、次のように PowerShell の Set-AzStorageBlobContent コマンドレットを使用してアップロードします。

    $ctx = New-AzStorageContext -StorageAccountName <STORAGE-ACCOUNT-NAME> -SasToken $sasCred
    Set-AzStorageBlobContent -File test.txt -Container <CONTAINER-NAME> -Blob testblob -Context $ctx
    

    応答:

    ICloudBlob        : Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob
    BlobType          : BlockBlob
    Length            : 56
    ContentType       : application/octet-stream
    LastModified      : 9/21/2017 6:14:25 PM +00:00
    SnapshotTime      :
    ContinuationToken :
    Context           : Microsoft.WindowsAzure.Commands.Storage.AzureStorageContext
    Name              : testblob
    
  6. アップロードした BLOB を、次のようにGet-AzStorageBlobContentPowerShell コマンドレットを使用してダウンロードすることもできます。

    Get-AzStorageBlobContent -Blob testblob -Container <CONTAINER-NAME> -Destination test2.txt -Context $ctx
    

    応答:

    ICloudBlob        : Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob
    BlobType          : BlockBlob
    Length            : 56
    ContentType       : application/octet-stream
    LastModified      : 9/21/2017 6:14:25 PM +00:00
    SnapshotTime      :
    ContinuationToken :
    Context           : Microsoft.WindowsAzure.Commands.Storage.AzureStorageContext
    Name              : testblob
    

Windows VM のシステム割り当てマネージド ID を使用して Azure SQL Database にアクセスする

このチュートリアルでは、Windows 仮想マシン (VM) のシステム割り当て ID を使用して Azure SQL Database にアクセスする方法について説明します。 管理対象サービス ID は Azure によって自動的に管理され、資格情報をコードに挿入しなくても、Microsoft Entra 認証をサポートするサービスへの認証を有効にします。

学習内容は次のとおりです。

  • VM に Azure SQL Database へのアクセスを許可する
  • Microsoft Entra 認証を有効にする
  • VM のシステム割り当て ID を表す包含ユーザーをデータベースに作成する
  • VM ID を使用してアクセス トークンを取得し、それを使用して Azure SQL Database にクエリを実行する

有効にする

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

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

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

  1. Azure portal にサインインします。

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

アクセス権の付与

Azure SQL Database 内のデータベースに対するアクセスを VM に許可するには、既存の論理 SQL サーバーを使用するか、新しいものを作成します。 Azure portal を使用して新しいサーバーとデータベースを作成するには、Azure SQL のクイック スタートに従います。 Azure SQL のドキュメントに、Azure CLI と Azure PowerShell を使用するクイックスタートも用意されています。

VM にデータベースへのアクセスを許可するには、次の手順に従います。

  1. サーバーに対して Microsoft Entra 認証を有効にします。
  2. VM のシステム割り当て ID を表す包含ユーザーをデータベースに作成します。

Microsoft Entra 認証を有効にする

Microsoft Entra 認証を構成するには:

  1. Azure portal で、左側のナビゲーションから [SQL サーバー] を選択します。
  2. Microsoft Entra 認証を有効にする SQL サーバーを選択します。
  3. ブレードの [設定] セクションで [Active Directory 管理者] を選択します。
  4. コマンド バーで、 [管理者の設定] を選択します。
  5. サーバーの管理者にする Microsoft Entra ユーザー アカウントを選択し、[選択] を選びます。
  6. コマンド バーの [保存] を選択します。

包含ユーザーを作成する

このセクションでは、VM のシステム割り当て ID を表す包含ユーザーをデータベースに作成する方法を説明します。 このステップのためには、Microsoft SQL Server Management Studio (SSMS) がインストールされている必要があります。 始める前に、Microsoft Entra 統合の背景について次の記事で確認しておくと有益です。

SQL データベースには、一意の Microsoft Entra ID 表示名が必要です。 このため、ユーザー、グループ、サービス プリンシパル (アプリケーション) や、マネージド ID 用に有効化された VM 名などの Microsoft Entra アカウントは、対応する表示名に固有の Microsoft Entra ID で一意に定義されている必要があります。 SQL を使用すると、このようなユーザーの T-SQL 作成時に Microsoft Entra ID の表示名が確認されます。 表示名が一意でない場合、コマンドは失敗し、指定されたアカウントごとに一意の Microsoft Entra ID 表示名を指定するように求められます。

包含ユーザーを作成するには

  1. SQL Server Management Studio を開きます。

  2. [サーバーに接続] ダイアログで、 [サーバー名] フィールドにサーバー名を入力します。

  3. [認証] フィールドで、 [Active Directory - MFA サポートで汎用] を選択します。

  4. [ユーザー名] フィールドに、サーバー管理者として設定した Microsoft Entra アカウントの名前を入力します (例: cjensen@fabrikam.com)。

  5. オプションを選択します。

  6. [データベースに接続] フィールドに、構成する非システム データベースの名前を入力します。

  7. [接続] を選択し、サインイン プロセスを完了します。

  8. オブジェクト エクスプローラーで、 [データベース] フォルダーを展開します。

  9. ユーザー データベースを右クリックし、[新しいクエリ] を選択します。

  10. クエリ ウィンドウで、次の行を入力し、ツールバーの [実行] を選択します。

    Note

    次のコマンドの VMName は、前提条件のセクションでシステム割り当て ID を有効にした VM の名前です。

    CREATE USER [VMName] FROM EXTERNAL PROVIDER
    

    VM のシステム割り当て ID の包含ユーザーが作成されて、コマンドは正常に完了します。

  11. クエリ ウィンドウをクリアし、次の行を入力して、ツール バーの [実行] を選択します。

    Note

    次のコマンドの VMName は、前提条件のセクションでシステム割り当て ID を有効にした VM の名前です。

    "プリンシパル VMName に重複した表示名があります" というエラーが発生した場合は、CREATE USER ステートメントに WITH OBJECT_ID='xxx' を追加します。

    ALTER ROLE db_datareader ADD MEMBER [VMName]
    

    包含ユーザーにデータベース全体を読み取る権限が与えられ、コマンドは正常に完了します。

これで、VM 上で実行されるコードは、システム割り当てマネージド ID を使用してトークンを取得し、そのトークンを使用してサーバーへの認証を行うようになりました。

データにアクセスする

このセクションでは、VM のシステム割り当てマネージド ID を使用してアクセス トークンを取得し、それを使用して Azure SQL を呼び出す方法を説明します。 Azure SQL は Microsoft Entra 認証をネイティブにサポートするため、Azure リソースのマネージド ID を使用して取得されたアクセス トークンを直接受け入れることができます。 このメソッドでは、接続文字列に資格情報を指定する必要はありません。

Active Directory マネージド ID 認証を使用して SQL への接続を開く .NET コードの例を次に示します。 このコードは、VM のシステム割り当てマネージド ID のエンドポイントにアクセスできる VM 上で実行する必要があります。

このメソッドを使用するには、.NET Framework 4.6.2 以降または .NET Core 3.1 以降が必要です。 それに応じて AZURE-SQL-SERVERNAME と DATABASE の値を置き換え、NuGet 参照を Microsoft.Data.SqlClient ライブラリに追加します。

using Microsoft.Data.SqlClient;

try
{
//
// Open a connection to the server using Active Directory Managed Identity authentication.
//
string connectionString = "Data Source=<AZURE-SQL-SERVERNAME>; Initial Catalog=<DATABASE>; Authentication=Active Directory Managed Identity; Encrypt=True";
SqlConnection conn = new SqlConnection(connectionString);
conn.Open();

注意

SDK とともに他のプログラミング オプションを使用しながら、マネージド ID を使用できます。

または、PowerShell を使用して、アプリを記述して VM に展開することなく、エンド ツー エンドのセットアップをテストします。

  1. ポータルで [仮想マシン] に移動し、Windows VM に移動して、[概要][接続] を選択します。

  2. Windows VM を作成したときに追加した VM 管理者の資格情報を入力します。

  3. これで、VM とのリモート デスクトップ接続が作成されました。リモート セッションで PowerShell を開きます。

  4. PowerShell の Invoke-WebRequest コマンドレットを使用して、ローカルのマネージド ID のエンドポイントに Azure SQL のアクセス トークンを取得するよう要求します。

        $response = Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fdatabase.windows.net%2F' -Method GET -Headers @{Metadata="true"}
    

    応答を JSON オブジェクトから PowerShell オブジェクトに変換します。

    $content = $response.Content | ConvertFrom-Json
    

    応答からアクセス トークンを抽出します。

    $AccessToken = $content.access_token
    
  5. サーバーへの接続を開きます。 AZURE-SQL-SERVERNAME と DATABASE の値を置き換えることを忘れないでください。

    $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
    $SqlConnection.ConnectionString = "Data Source = <AZURE-SQL-SERVERNAME>; Initial Catalog = <DATABASE>; Encrypt=True;"
    $SqlConnection.AccessToken = $AccessToken
    $SqlConnection.Open()
    

    次に、クエリを作成してサーバーに送信します。 TABLE の値を必ず置き換えてください。

    $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
    $SqlCmd.CommandText = "SELECT * from <TABLE>;"
    $SqlCmd.Connection = $SqlConnection
    $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
    $SqlAdapter.SelectCommand = $SqlCmd
    $DataSet = New-Object System.Data.DataSet
    $SqlAdapter.Fill($DataSet)
    

最後に、$DataSet.Tables[0] の値を調べて、クエリの結果を確認します。

Disable

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

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

Windows VM のシステム割り当てマネージド ID を使用して Azure Key Vault にアクセスする

このチュートリアルでは、Windows 仮想マシン (VM) でシステム割り当てマネージド ID を使用して Azure Key Vault にアクセスする方法について説明します。 Key Vault により、クライアント アプリケーションは、Microsoft Entra ID で保護されていないリソースにシークレットを使ってアクセスできます。 マネージド ID は Azure によって自動的に管理されます。 これらを使うと、コードに認証情報を含めることなく、Microsoft Entra 認証をサポートするサービスに対して認証を行うことができます。

学習内容は次のとおりです。

  • Key Vault に格納されているシークレットへ VM のアクセスを許可する
  • VM ID を使用してアクセス トークンを取得して、Key Vault からシークレットを取得する

Key Vault の作成

ヒント

この記事の手順は、開始するポータルによって若干異なる場合があります。

このセクションでは、Key Vault に格納されているシークレットへのアクセスを VM に許可する方法を説明します。 Azure リソース用マネージド ID を使うとき、Microsoft Entra 認証をサポートするリソースに対して認証するためのアクセス トークンをコードで取得できます。 

ただし、すべての Azure サービスで Microsoft Entra 認証がサポートされているわけではありません。 Azure リソースのマネージド ID をこれらのサービスと共に使用するには、Azure Key Vault にサービス資格情報を保存し、VM のマネージド ID を使用して Key Vault にアクセスして、資格情報を取得します。

まず、Key Vault を作成し、VM のシステム割り当てマネージド ID に Key Vault へのアクセスを許可する必要があります。

  1. Azure portal にサインインします。

  2. 左側のナビゲーション バーの上部で、[リソースの作成] を選びます。

  3. [Marketplace を検索] ボックスに「Key Vault」と入力し、Enter キーを押します。

  4. 結果から [Key Vault] を選択し、[作成] を選択します。

  5. 新しいキー コンテナーの [名前] を入力します。

    [キー コンテナーの作成] 画面のスクリーンショット。

  6. 必須情報を全部入力します このチュートリアルで使用しているサブスクリプションとリソース グループを選択していることを確認してください。

  7. [確認および作成] を選択します。

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

シークレットを作成します

次に、Key Vault にシークレットを追加し、VM で実行されているコードを使用して後で取得できるようにする必要があります。 このセクションでは PowerShell を使用しますが、VM で実行するどのコードにも同じ概念が適用されます。

  1. 新しく作成した Key Vault に移動します。

  2. [シークレット] を選択してから、[追加] を選択します。

  3. [Generate/Import](生成/インポート) を選択します。

  4. [シークレットの作成] 画面の [アップロード オプション] で、[手動] を選択したままにします。

  5. シークレットの名前と値を指定します。 値は任意のものを指定できます。 

  6. アクティブ化した日付と有効期限の日付をクリアのままにし、[有効][はい] のままにします。 

  7. [作成] を選択して、シークレットを作成します。

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

アクセス権の付与

VM で使用されるマネージド ID には、Key Vault に格納するシークレットを読み取るためのアクセスを許可する必要があります。

  1. 新しく作成した Key Vault に移動します。

  2. 左側のメニューで、 [アクセス ポリシー] を選択します。

  3. [アクセス ポリシーの追加] を選択します。

    Key Vault アクセス ポリシー画面が表示されたスクリーンショット。

  4. [アクセス ポリシーの追加] セクションで、[テンプレートからの構成 (省略可能)] のドロップダウン メニューから [シークレットの管理] を選択します。

  5. [プリンシパルの選択] を選択し、以前に作成した VM の名前を検索フィールドに入力します。 

  6. 結果一覧で VM を選択し、[選択] を選びます。

  7. [追加] を選択します。

  8. [保存] を選択します。

データにアクセスする

このセクションでは、VM ID を使用してアクセス トークンを取得し、それを使用して Key Vault からシークレットを取得する方法を説明します。 PowerShell 4.3.1 以上がインストールされていない場合、最新バージョンをダウンロードしてインストールする必要があります。

Note

PowerShell を使用してシークレットを認証および取得する方法は、マネージド ID が特に必要なシナリオや、アプリケーションのコード内にプロセスを埋め込む場合に推奨されます。

最初に、VM のシステム割り当てマネージド ID を使用して、Key Vault に対して認証するためのアクセス トークンを取得します。

  1. ポータルで [仮想マシン] に移動し、Windows VM に移動して、[概要][接続] を選択します。
  2. Windows VM を作成したときに追加したユーザー名パスワードを入力します。
  3. これで、VM とのリモート デスクトップ接続が作成されました。リモート セッションで PowerShell を開きます。
  4. PowerShell では、テナント上で Web 要求を呼び出し、VM の特定のポートでローカル ホストのトークンを取得します。

Note

GCC-H などのソブリン クラウドを使用する場合、PowerShell コマンドレットでは、エンドポイント vault.azure.net ではなく vault.usgovcloudapi.net を使用します。

PowerShell 要求の例:

$Response = Invoke-RestMethod -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.azure.net' -Method GET -Headers @{Metadata="true"} 

Note

ソブリン クラウドを使用する場合は、コマンドレットの最後で指定されるエンドポイントを調整する必要があります。

たとえば、Azure Government クラウドを使用するときは vault.usgovcloudapi.net を使用する必要があります。最終的な結果は次のようになります。

$Response = Invoke-RestMethod -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.usgovcloudapi.net' -Method GET -Headers @{Metadata="true"

サフィックスが環境と一致することを確認するには、Azure Key Vault のセキュリティの概要に関する記事を参照してください。

応答は次のようになります。

トークン応答を含む要求を示すスクリーンショット。

次に、アクセス トークンを応答から抽出します。

   $KeyVaultToken = $Response.access_token

最後に、PowerShell の Invoke-WebRequest コマンドを使用して、Key Vault で以前に作成したシークレットを取得し、Authorization ヘッダーにアクセス トークンを渡します。 Key Vault の [概要] ページの [要点] セクションにある Key Vault の URL が必要です。

Invoke-RestMethod -Uri https://<your-key-vault-URL>/secrets/<secret-name>?api-version=2016-10-01 -Method GET -Headers @{Authorization="Bearer $KeyVaultToken"}

応答は次のようになります。

  value       id                                                                                    attributes
  -----       --                                                                                    ----------
  'My Secret' https://mi-lab-vault.vault.azure.net/secrets/mi-test/50644e90b13249b584c44b9f712f2e51 @{enabled=True; created=16…

Key Vault からシークレットを取得した後は、名前とパスワードを必要とするサービスへの認証にそのシークレットを使用できます。

リソースをクリーンアップする

最後に、リソースをクリーンアップする場合は、Azure portal にサインインし、[リソース グループ] を選択し、このチュートリアルのプロセスで作成されたリソース グループ (mi-test など) を見つけて選択します。 その後、[リソース グループの削除] コマンドを使用します。

あるいは、PowerShell または CLI を使用してリソースをクリーンアップすることもできます。

Windows VM のシステム割り当てマネージド ID を使用して Resource Manager にアクセスする

ヒント

この記事の手順は、開始するポータルに応じて若干異なる場合があります。

このチュートリアルでは、システム割り当て ID を作成し、それを Windows 仮想マシン (VM) に割り当ててから、その ID を使って Azure Resource Manager API にアクセスする方法について説明します。 管理対象サービス ID は Azure によって自動的に管理されます。 管理対象サービス ID を使用すると、コード内に資格情報を埋め込む必要なく、Microsoft Entra の認証をサポートするサービスに認証することができます。

学習内容は次のとおりです。

  • VM に Azure Resource Manager へのアクセスを許可します。
  • VM のシステム割り当てマネージド ID を使って、Resource Manager にアクセスするためのアクセス トークンを取得します。
  1. 管理者アカウントで Azure Portal にサインインします。

  2. [リソース グループ] タブに移動します。

  3. VM のマネージド ID にアクセスを許可するリソース グループを選びます。

  4. 左側のパネルで [アクセス制御 (IAM)] を選択します。

  5. [追加] を選択し、 [ロールの割り当ての追加] を選択します。

  6. [ロール] タブで、[閲覧者] を選択します。 このロールでは、すべてのリソースを表示できますが、変更を加えることはできません

  7. [メンバー] タブの [アクセスの割り当て先] オプションで [マネージド ID] を選んでから、[+ メンバーの選択] を選びます。

  8. [サブスクリプション] ドロップダウンに適切なサブスクリプションが表示されていることを確認します。 [リソース グループ][すべてのリソース グループ] を選びます。

  9. [Manage identity] (ID の管理) ボックスの一覧で [仮想マシン] を選択します。

  10. [選択] のドロップダウンで VM を選んでから、[保存] を選びます。

    マネージド ID への閲覧者ロールの追加を示すスクリーンショット。

アクセス トークンを取得する

VM のシステム割り当てマネージド ID を使って Resource Manager を呼び出し、アクセス トークンを取得します。

これらの手順を完了するには、SSH クライアントが必要です。 Windows を使用している場合は、Linux 用 Windows サブシステムで SSH クライアントを使用することができます。 SSH クライアント キーの構成について支援が必要な場合は、「Azure 上の Windows で SSH キーを使用する方法」または「Azure に Linux VM 用の SSH 公開キーと秘密キーのペアを作成して使用する方法」をご覧ください。

  1. ポータルで Linux VM に移動し、[概要][接続] を選択します。
  2. 任意の SSH クライアントを使用して、VM に接続します。
  3. ターミナル ウィンドウで、curl を使用して、Azure リソース エンドポイントのローカル マネージド ID に、Azure Resource Manager のアクセス トークンを取得するよう要求します。   アクセス トークンの curl 要求を次に示します。
curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/' -H Metadata:true

Note

resource パラメーターの値は、Microsoft Entra ID で想定されているものと完全に一致している必要があります。 Resource Manager のリソース ID の場合は、URI の末尾にスラッシュを含める必要があります。

応答には、Azure Resource Manager へのアクセスに必要なアクセス トークンが含まれています。

応答:

{
  "access_token":"eyJ0eXAiOi...",
  "refresh_token":"",
  "expires_in":"3599",
  "expires_on":"1504130527",
  "not_before":"1504126627",
  "resource":"https://management.azure.com",
  "token_type":"Bearer"
}

このアクセス トークンを使って Azure Resource Manager にアクセスし、たとえば、以前にこの VM にアクセスを許可したリソース グループの詳細を読み取ります。 <SUBSCRIPTION-ID><RESOURCE-GROUP>、および <ACCESS-TOKEN> の値を先ほど作成したものと置き換えます。

Note

URL は大文字と小文字が区別されるため、前にリソース グループ名の指定で使ったものと同じ大文字と小文字の使い分けになっていること、および "resourceGroup" の "G" が大文字になっていることを確認します。

curl https://management.azure.com/subscriptions/<SUBSCRIPTION-ID>/resourceGroups/<RESOURCE-GROUP>?api-version=2016-09-01 -H "Authorization: Bearer <ACCESS-TOKEN>" 

特定のリソース グループの情報を含む応答が返されます。

{
"id":"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/DevTest",
"name":"DevTest",
"location":"westus",
"properties":
{
  "provisioningState":"Succeeded"
  }
} 

Windows VM 上でユーザー割り当てマネージド ID を使用して Azure Resource Manager にアクセスする

このチュートリアルでは、ユーザー割り当て ID を作成して Windows 仮想マシン (VM) に割り当て、その ID を使用して Azure Resource Manager API にアクセスする方法について説明します。 管理対象サービス ID は Azure によって自動的に管理されます。 管理対象サービス ID を使用すると、コード内に資格情報を埋め込む必要なく、Microsoft Entra の認証をサポートするサービスに認証することができます。

学習内容は次のとおりです。

  • ユーザー割り当てマネージド ID を作成する
  • ユーザー割り当て ID を Windows VM に割り当てる
  • Azure Resource Manager でユーザー割り当て ID にリソース グループへのアクセスを許可する
  • ユーザー割り当て ID を使用してアクセス トークンを取得し、そのアクセス トークンを使用して Azure Resource Manager を呼び出す
  • リソース グループのプロパティを読み取る

注意

Azure を操作するには、Azure Az PowerShell モジュールを使用することをお勧めします。 作業を開始するには、Azure PowerShell のインストールに関する記事を参照してください。 Az PowerShell モジュールに移行する方法については、「AzureRM から Az への Azure PowerShell の移行」を参照してください。

ローカルで Azure PowerShell を構成する

この例のスクリプトを実行するには、次の 2 つのオプションがあります。

  • Azure Cloud Shell を使用します。これは、コード ブロックの右上隅にある [試してみる] ボタンを使用して開くことができます。
  • Azure PowerShell を使用して、スクリプトをローカルで実行します。次のセクションの説明を参照してください。

このチュートリアルで、(Cloud Shell を使用するのではなく) ローカルで Azure PowerShell を使用するには、次の手順を実行します。

  1. 最新バージョンの Azure PowerShell をインストールします (まだそうしていない場合)。

  2. Azure にサインインします。

    Connect-AzAccount
    
  3. PowerShellGet の最新バージョンをインストールします。

    Install-Module -Name PowerShellGet -AllowPrerelease
    

    次の手順に備えて、このコマンドを実行した後に現在の PowerShell セッションから Exit する必要がある場合があります。

  4. リリースされたバージョンの Az.ManagedServiceIdentity モジュールをインストールします。 これは、このチュートリアルのユーザー割り当てマネージド ID 操作を実行するために必要です。

    Install-Module -Name Az.ManagedServiceIdentity -AllowPrerelease
    

有効にする

ユーザー割り当て ID に基づくシナリオの場合は、このセクションの次の手順を実行する必要があります。

  1. ID を作成する。
  2. 新しく作成した ID を割り当てる。

ID の作成

このセクションでは、ユーザー割り当て ID を作成する方法について説明します。これはスタンドアロンの Azure リソースとして作成されます。 New-AzUserAssignedIdentity コマンドレットを使用すると、Azure の Microsoft Entra テナント内に、1 つ以上の Azure サービス インスタンスに割り当てることができる ID が作成されます。

重要

ユーザー割り当てマネージド ID を作成する場合、名前は文字または数字で始まる必要があり、英数字、ハイフン (-) とアンダースコア (_) の組み合わせを含めることができます。 仮想マシンまたは仮想マシン スケール セットへの割り当てが適切に動作するように、名前は 24 文字に制限されています。 詳細については、FAQ と既知の問題に関するページを参照してください。

New-AzUserAssignedIdentity -ResourceGroupName myResourceGroupVM -Name ID1

応答には、次の例のように、作成されたユーザー割り当て ID の詳細が含まれています。 後続の手順で使用するため、ユーザー割り当て ID の IdClientId の値を定義します。

{
Id: /subscriptions/<SUBSCRIPTIONID>/resourcegroups/myResourceGroupVM/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1
ResourceGroupName : myResourceGroupVM
Name: ID1
Location: westus
TenantId: aaaabbbb-0000-cccc-1111-dddd2222eeee
PrincipalId: aaaaaaaa-bbbb-cccc-1111-222222222222
ClientId: 00001111-aaaa-2222-bbbb-3333cccc4444
ClientSecretUrl: https://control-westus.identity.azure.net/subscriptions/<SUBSCRIPTIONID>/resourcegroups/myResourceGroupVM/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1/credentials?tid=aaaabbbb-0000-cccc-1111-dddd2222eeee&oid=aaaaaaaa-bbbb-cccc-1111-222222222222&aid=00001111-aaaa-2222-bbbb-3333cccc4444
Type: Microsoft.ManagedIdentity/userAssignedIdentities
}

ID の割り当て

このセクションでは、ユーザー割り当て ID を Windows VM に割り当てる方法を説明します。 ユーザー割り当て ID は、複数の Azure リソース上のクライアントで使用できます。 単一の VM にユーザー割り当て ID を割り当てるには、次のコマンドを使用します。 -IdentityID パラメーターには、前の手順で返された Id プロパティを使用します。

$vm = Get-AzVM -ResourceGroupName myResourceGroup -Name myVM
Update-AzVM -ResourceGroupName TestRG -VM $vm -IdentityType "UserAssigned" -IdentityID "/subscriptions/<SUBSCRIPTIONID>/resourcegroups/myResourceGroupVM/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1"

アクセス権の付与

このセクションでは、Azure Resource Manager のリソース グループへのアクセスをユーザー割り当て ID に許可する方法を説明します。 Microsoft Entra 認証をサポートするリソース API に認証するアクセス トークンを要求するためにコードで使用する ID が、Azure リソースのマネージド ID により提供されます。 このチュートリアルでは、コードは Azure Resource Manager API にアクセスします。

コードで API にアクセスできるようにするには、事前に ID に Azure Resource Manager のリソースへのアクセスを許可する必要があります。 この例では、VM が含まれているリソース グループにアクセスします。 使用する環境に合わせて、<SUBSCRIPTIONID> の値を更新します。

$spID = (Get-AzUserAssignedIdentity -ResourceGroupName myResourceGroupVM -Name ID1).principalid
New-AzRoleAssignment -ObjectId $spID -RoleDefinitionName "Reader" -Scope "/subscriptions/<SUBSCRIPTIONID>/resourcegroups/myResourceGroupVM/"

応答には、次の例のように、作成されたロールの割り当ての詳細が含まれています。

RoleAssignmentId: /subscriptions/<SUBSCRIPTIONID>/resourcegroups/myResourceGroupVM/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000000
Scope: /subscriptions/<SUBSCRIPTIONID>/resourcegroups/myResourceGroupVM
DisplayName: ID1
SignInName:
RoleDefinitionName: Reader
RoleDefinitionId: 00000000-0000-0000-0000-000000000000
ObjectId: aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb
ObjectType: ServicePrincipal
CanDelegate: False

データにアクセスする

ヒント

この記事の手順は、開始するポータルに応じて若干異なる場合があります。

アクセス トークンを取得する

チュートリアルの残りの部分では、以前に作成した VM から作業を行います。

  1. Azure portal にサインインします。

  2. ポータルで [仮想マシン] に移動し、Windows VM に移動します。 [概要][接続] を選びます。

  3. Windows VM を作成したときに使用したユーザー名パスワードを入力します。

  4. これで、VM とのリモート デスクトップ接続が作成されました。リモート セッションで PowerShell を開きます。

  5. PowerShell の Invoke-WebRequest コマンドレットを使用して、Azure リソース エンドポイントのローカル マネージド ID に、Azure Resource Manager のアクセス トークンを取得するよう要求します。 client_id 値は、ユーザー割り当てマネージド ID を作成したときに返された値です。

    $response = Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&client_id=00001111-aaaa-2222-bbbb-3333cccc4444&resource=https://management.azure.com/' -Method GET -Headers @{Metadata="true"}
    $content = $response.Content | ConvertFrom-Json
    $ArmToken = $content.access_token
    

プロパティの読み取り

最後に、前の手順で取得したアクセス トークンを使用して Azure Resource Manager にアクセスし、ユーザー割り当て ID にアクセスを許可したリソース グループのプロパティを読み取ります。 <SUBSCRIPTION ID> は使用している環境内のサブスクリプション ID に置き換えます。

(Invoke-WebRequest -Uri https://management.azure.com/subscriptions/80c696ff-5efa-4909-a64d-f1b616f423ca/resourceGroups/myResourceGroupVM?api-version=2016-06-01 -Method GET -ContentType "application/json" -Headers @{Authorization ="Bearer $ArmToken"}).content

応答には、次の例のように、特定のリソース グループの情報が含まれています。

{"id":"/subscriptions/<SUBSCRIPTIONID>/resourceGroups/myResourceGroupVM","name":"myResourceGroupVM","location":"eastus","properties":{"provisioningState":"Succeeded"}}

詳細情報