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

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

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

Service SAS は、アカウント アクセス キーを公開することなく、ストレージ アカウント内のオブジェクトへの限られたアクセス許可を限られた時間にわたって特定のサービス (ここでは BLOB サービス) に対してのみ提供できます。 ストレージ SDK の使用時など、ストレージ操作を実行するときに、SAS 資格情報を通常どおりに使用できます。 このチュートリアルでは、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. Azure portal の左上隅にある [+/新しいサービスの作成] ボタンを選択します。

  2. [ストレージ][ストレージ アカウント] の順に選択すると、新しい [ストレージ アカウントの作成] パネルが表示されます。

  3. このチュートリアルで使っているストレージ アカウントの名前を入力します。

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

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

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

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

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

後で、新しいストレージ アカウントにファイルをアップロードおよびダウンロードします。 ファイルには Blob Storage が必要であるため、ファイルを格納する 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 Storage Account Contributor
    アクセスの割り当て先 マネージド ID
    システム割り当て 仮想マシン
    Select <Windows 仮想マシン>

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

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

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

ここでは、Azure Resource Manager PowerShell コマンドレットを使用する必要があります。 インストールしていない場合は、先に進む前に、最新バージョンをダウンロードしてください。

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

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

  3. これで、仮想マシンとのリモート デスクトップ接続が作成されました。

  4. リモート セッションで 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 リファレンスに関する記事を参照してください。

最初にパラメーターを 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"}

注意

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

これで、応答から SAS 資格情報を抽出できます。

$sasContent = $sasResponse.Content | ConvertFrom-Json
$sasCred = $sasContent.serviceSasToken

SAS 資格情報を調べると、次のように表示されます。

PS C:\> $sasCred
sv=2015-04-05&sr=c&spr=https&se=2017-09-23T00%3A00%3A00Z&sp=rcw&sig=JVhIWG48nmxqhTIuN0uiFBppdzhwHdehdYan1W%2F4O0E%3D

次に、"test.txt" というファイルを作成します。 その後、SAS 資格情報を使用して New-AzStorageContent コマンドレットで認証を行い、ファイルを BLOB コンテナーにアップロードしてから、ファイルをダウンロードします。

echo "This is a test text file." > test.txt

必ず、最初に Install-Module Azure.Storage を使用して Azure Storage コマンドレットをインストールしてください。 その後、作成した BLOB を、次のように Set-AzStorageBlobContent PowerShell コマンドレットを使用してアップロードします。

$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

アップロードした 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 を使用して SAS 資格情報で Azure Storage にアクセスする方法について説明しました。 Azure Storage SAS の詳細については、以下を参照してください。