チュートリアル: 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 を取得する
前提条件
- マネージド ID の知識。 Azure リソースのマネージド ID 機能に慣れていない場合は、こちらの概要を参照してください。
- Azure アカウント。無料アカウントにサインアップしてください。
- 必要なリソース作成とロール管理の手順を実行するための、適切なスコープ (サブスクリプションまたはリソース グループ) の "所有者" アクセス許可。 ロールの割り当てに関するサポートが必要な場合は、Azure ロールの割り当てによる Azure サブスクリプション リソースへのアクセスの管理に関するページをご覧ください。
- システム割り当てマネージド ID が有効になっている Windows 仮想マシンも必要です。
- このチュートリアル用に仮想マシンを作成する必要がある場合は、システム割り当てマネージド ID を有効にした仮想マシンの作成に関する記事に従ってください
注意
Azure を操作するには、Azure Az PowerShell モジュールを使用することをお勧めします。 作業を開始するには、Azure PowerShell のインストールに関する記事を参照してください。 Az PowerShell モジュールに移行する方法については、「AzureRM から Az への Azure PowerShell の移行」を参照してください。
ストレージ アカウントの作成
まだお持ちでない場合は、この時点でストレージ アカウントを作成します。 この手順をスキップし、既存のストレージ アカウントの SAS 資格情報へのアクセス権を、VM のシステム割り当てマネージド ID に付与することもできます。
Azure portal の左上隅にある [+/新しいサービスの作成] ボタンを選択します。
[ストレージ]、[ストレージ アカウント] の順に選択すると、新しい [ストレージ アカウントの作成] パネルが表示されます。
このチュートリアルで使っているストレージ アカウントの名前を入力します。
[デプロイ モデル] と [アカウントの種類] が "Resource Manager" と "汎用" にそれぞれ設定されている必要があります。
[サブスクリプション] と [リソース グループ] が、前の手順で VM を作成したときに指定したものと一致していることを確認します。
[作成] を選択します
ストレージ アカウントに BLOB コンテナーを作成する
後で、新しいストレージ アカウントにファイルをアップロードおよびダウンロードします。 ファイルには Blob Storage が必要であるため、ファイルを格納する BLOB コンテナーを作成する必要があります。
新たに作成したストレージ アカウントに戻ります。
左側のパネルで、[Blob service] の下の [コンテナー] リンクを選択します。
ページの上部にある [+ コンテナー] を選択すると、[新しいコンテナー] パネルがスライドして現れます。
コンテナーに名前を付け、アクセス レベルを選んで、[OK] を選びます。 指定した名前は、後ほどチュートリアルで使用されます。
VM のシステム割り当てマネージド ID にストレージ SAS を使用するためのアクセス権を付与する
Azure Storage では、ネイティブで Microsoft Entra 認証がサポートされていません。 ただし、マネージド ID を使用して Resource Manager からストレージ SAS を取得し、その SAS を使用してストレージにアクセスできます。 この手順では、ストレージ アカウントの SAS へのアクセス権を VM のシステム割り当てマネージド ID に付与します。
新たに作成したストレージ アカウントに戻ります。
[アクセス制御 (IAM)] を選択します。
[追加]>[ロールの割り当ての追加] を選択して、[ロールの割り当ての追加] ページを開きます。
次のロールを割り当てます。 詳細な手順については、「Azure portal を使用して Azure ロールを割り当てる」を参照してください。
設定 値 Role Storage Account Contributor アクセスの割り当て先 マネージド ID システム割り当て 仮想マシン Select <Windows 仮想マシン>
VM ID を使用してアクセス トークンを取得し、そのアクセス トークンを使用して Azure Resource Manager を呼び出す
チュートリアルの残りの部分では、VM から作業を行います。
ここでは、Azure Resource Manager PowerShell コマンドレットを使用する必要があります。 インストールしていない場合は、先に進む前に、最新バージョンをダウンロードしてください。
Azure Portal で [Virtual Machines] にナビゲートして Windows 仮想マシンに移動し、[概要] ページの上部にある [接続] を選びます。
Windows VM を作成したときに追加したユーザー名とパスワードを入力します。
これで、仮想マシンとのリモート デスクトップ接続が作成されました。
リモート セッションで 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-AzStorageBlobContent
PowerShell コマンドレットを使用してダウンロードすることもできます。
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 の詳細については、以下を参照してください。