チュートリアル: Windows VM のシステム割り当てマネージド ID を使用して Azure Storage にアクセスする
Azure リソースのマネージドID は、Azure Active Directory の機能です。 Azure リソースのマネージド ID をサポートする各 Azure サービスは、それぞれ固有のタイムラインの下で提供されます。 ご利用のリソースに対するマネージド ID の提供状態と既知の問題をあらかじめ確認しておいてください。
このチュートリアルでは、Windows 仮想マシン (VM) のシステム割り当てマネージド ID を使用して Azure Storage にアクセスする方法について説明します。 学習内容は次のとおりです。
- ストレージ アカウントに BLOB コンテナーを作成する
- Windows VM のシステム割り当てマネージド ID にストレージ アカウントへのアクセスを許可する
- アクセス権を取得し、それを使用して Azure Storage を呼び出す
注意
Azure Storage の Azure Active Directory 認証は、パブリック プレビューの段階です。
前提条件
- Azure リソースのマネージド ID 機能に慣れていない場合は、こちらの概要を参照してください。
- Azure アカウントをお持ちでない場合は、無料のアカウントにサインアップしてから先に進んでください。
- 必要なリソース作成およびロール管理を実行するために、お使いのアカウントには、適切な範囲 (サブスクリプションまたはリソース グループ) を対象とする "所有者" アクセス許可が必要となります。 ロールの割り当てに関するサポートが必要な場合は、Azure ロールの割り当てによる Azure サブスクリプション リソースへのアクセスの管理に関するページをご覧ください。
有効にする
システム割り当てマネージド ID の有効化は、1 クリックで行うことができます。 VM の作成中に有効にするか、既存の VM のプロパティで有効にすることができます。
新しい VM 上でシステム割り当てマネージド ID を有効にするには:
アクセス権の付与
ストレージ アカウントの作成
このセクションでは、ストレージ アカウントを作成します。
Azure portal の左上隅にある [リソースの作成] ボタンを選択します。
[ストレージ]、[ストレージ アカウント - Blob、File、Table、Queue] の順に選択します。
[名前] で、ストレージ アカウントの名前を入力します。
[デプロイ モデル] と [アカウントの種類] がそれぞれ [Resource manager] と [ストレージ (汎用 v1)] に設定されている必要があります。
[サブスクリプション] と [リソース グループ] が、前の手順で VM を作成したときに指定したものと一致していることを確認します。
[作成] を選択します
BLOB コンテナーを作成し、ファイルをストレージ アカウントにアップロードする
ファイルには Blob Storage が必要であるため、ファイルを格納する BLOB コンテナーを作成する必要があります。 次に、新しいストレージ アカウントで、BLOB コンテナーにファイルをアップロードします。
新たに作成したストレージ アカウントに戻ります。
[Blob service] で [コンテナー] を選択します。
ページの上部にある [+ コンテナー] を選択します。
[新しいコンテナー] で、コンテナーの名前を入力し、[パブリック アクセス レベル] で既定値を保持します。
任意のエディターを使用して、ローカル コンピューターに hello world.txt という名前のファイルを作成します。 ファイルを開き、"Hello world! :)" というテキストを (引用符なしで) 追加し、保存します。
新しく作成したコンテナーにファイルをアップロードします。コンテナー名をクリックしてから [アップロード] をクリックします。
[BLOB のアップロード] ウィンドウの [ファイル] で、フォルダー アイコンを選択し、ローカル コンピューターの hello_world.txt を参照してファイルを選択して、[アップロード] を選択します。
アクセス権の付与
このセクションでは、Azure Storage コンテナーへのアクセスを VM に許可する方法を説明します。 VM のシステム割り当てマネージド ID を使用して、Azure Storage Blob のデータを取得できます。
新たに作成したストレージ アカウントに戻ります。
[アクセス制御 (IAM)] を選択します。
[追加]>[ロールの割り当ての追加] を選択して、[ロールの割り当ての追加] ページを開きます。
次のロールを割り当てます。 詳細な手順については、「Azure portal を使用して Azure ロールを割り当てる」を参照してください。
設定 値 Role ストレージ BLOB データ閲覧者 アクセスの割り当て先 マネージド ID システム割り当て 仮想マシン Select <お使いの仮想マシン>
データにアクセスする
Azure Storage は Azure AD 認証をネイティブにサポートするため、マネージド ID を使用して取得したアクセス トークンを直接受け入れることができます。 この手法では Azure Storage の Azure AD との統合が利用され、接続文字列に資格情報を提供することとは異なります。
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 の詳細については、以下を参照してください。