マネージド ID を使用して Web アプリから Azure Storage にアクセスする
マネージド ID を使用して、Azure App Service で実行されている Web アプリ (サインインしているユーザーではありません) に代わって Azure Storage にアクセスする方法について説明します。
Web アプリから Azure データ プレーン (Azure Storage、Azure SQL Database、Azure Key Vault、またはその他のサービス) へのアクセスを追加するとします。 共有キーを使用することもできますが、その場合、シークレットを作成、デプロイ、および管理できるユーザーの運用上のセキュリティについて配慮する必要があります。 また、キーが GitHub にチェックインされる可能性もあります。ハッカーはそのスキャン方法を知っています。 Web アプリにデータへのアクセスを許可するより安全な方法では、マネージド ID を使用します。
Microsoft Entra ID のマネージド ID を使用すると、App Service は、アプリの資格情報を必要とせずに、ロールベースのアクセス制御 (RBAC) を使用してリソースにアクセスできます。 マネージド ID を対象の Web アプリに割り当てると、Azure では証明書の作成と配布が行われます。 シークレットまたはアプリの資格情報の管理について心配する必要はありません。
このチュートリアルでは、以下の内容を学習します。
- Web アプリ上でシステム割り当てマネージド ID を作成する。
- ストレージ アカウントと Azure Blob Storage コンテナーを作成する。
- マネージド ID を使用して Web アプリからストレージにアクセスする。
Azure サブスクリプションをお持ちでない場合は、開始する前に Azure 無料アカウントを作成してください。
前提条件
- App Service の認証および承認モジュールが有効になっている Azure App Service で実行されている Web アプリケーション。
アプリでマネージド ID を有効にする
Visual Studio を使用して Web アプリを作成して発行すると、アプリでマネージド ID が有効になります。 App Service で、左ペインの [ID] を選択し、 [システム割り当て済み] を選択します。 [Status](状態) が [オン] に設定されていることを確認します。 そうでない場合は、 [保存] を選択し、 [はい] を選択して、システム割り当てマネージド ID を有効にします。 マネージド ID が有効になると、状態が [オン] に設定され、オブジェクト ID が使用可能になります。
この手順により、 [認証/承認] ペインで作成されたアプリ ID とは異なる新しいオブジェクト ID が作成されます。 システム割り当てマネージド ID のオブジェクト ID をコピーしておきます。 この情報は後で必要になります。
ストレージ アカウントと Blob Storage コンテナーを作成する
これで、ストレージ アカウントと Blob Storage コンテナーを作成する準備が整いました。
すべてのストレージ アカウントは、Azure リソース グループに属している必要があります。 リソース グループは、Azure サービスをグループ化するための論理コンテナーです。 ストレージ アカウントを作成するときに、新しいリソース グループを作成するか、既存のリソース グループを使用するかを選択できます。 この記事では、新しいリソース グループを作成する方法を示します。
汎用 v2 ストレージ アカウントでは、すべての Azure Storage サービス (BLOB、ファイル、キュー、テーブル、ディスク) へのアクセスが提供されます。 ここで説明する手順では汎用 v2 ストレージ アカウントを作成しますが、作成手順はどの種類のストレージ アカウントでも似ています。
Azure Storage 内の BLOB はコンテナーにまとめられます。 このチュートリアルの後半で BLOB をアップロードする前に、まずコンテナーを作成する必要があります。
Azure portal で汎用 v2 ストレージ アカウントを作成するには、次の手順に従います。
Azure portal のメニューで、[すべてのサービス] を選択します。 リソースの一覧で、「Storage Accounts」と入力します。 入力を始めると、入力内容に基づいて、一覧がフィルター処理されます。 [ストレージ アカウント] を選択します。
表示される [ストレージ アカウント] ウィンドウで、[作成] を選択します。
ストレージ アカウントを作成するサブスクリプションを選択します。
[リソース グループ] フィールドで、ドロップダウン メニューから、対象の Web アプリが含まれているリソース グループを選択します。
次に、ストレージ アカウントの名前を入力します。 選択する名前は Azure 全体で一意である必要があります。 また、名前の長さは 3 から 24 文字とし、数字と小文字のみを使用できます。
ストレージ アカウントの場所を選択するか、または既定の場所を使います。
[パフォーマンス] には、[Standard] オプションを選択します。
[冗長性] には、ドロップダウンから [ローカル冗長ストレージ (LRS)] オプションを選択します。
[確認] を選択して、ストレージ アカウントの設定を確認し、アカウントを作成します。
[作成] を選択します
Azure Storage で Blob Storage コンテナーを作成するには、次の手順に従います。
Azure portal で新しいストレージ アカウントに移動します。
ストレージ アカウントの左側のメニューで、[データ ストレージ] セクションまでスクロールし、[コンテナー] を選択します。
[+ コンテナー] ボタンを選択します。
新しいコンテナーの名前を入力します。 コンテナー名は小文字である必要があり、英文字または数字で始まる必要があり、英文字、数字、ダッシュ (-) 文字のみを含めることができます。
コンテナーにパブリック アクセスのレベルを設定します。 既定のレベルは [ プライベート (匿名アクセスなし)] です。
[作成] を選択して、コンテナーを作成します。
ストレージ アカウントへのアクセスを許可する
BLOB の作成、読み取り、または削除を行う前に、ストレージ アカウントへのアクセスを Web アプリに許可する必要があります。 前の手順では、App Service で実行されている Web アプリをマネージド ID を使用して構成しました。 Azure RBAC を使用すると、セキュリティ プリンシパルと同様に、別のリソースへのアクセス権をマネージド ID に付与できます。 ストレージ BLOB データ共同作成者ロールにより、(システム割り当てマネージド ID で表される) Web アプリに、BLOB コンテナーとデータへの読み取り、書き込み、削除アクセス権が付与されます。
注意
プライベート BLOB コンテナーに対する一部の操作 (BLOB の表示やアカウント間での BLOB のコピーなど) は、Azure RBAC ではサポートされていません。 プライベート アクセス レベルの BLOB コンテナーでは、Azure RBAC によって認可されていないすべての操作に SAS トークンが必要です。 詳細については、「Shared Access Signature を使用するタイミング」を参照してください。
Azure portal で、Web アプリにアクセスを許可するストレージ アカウントに移動します。 左ペインで [アクセス制御 (IAM)] を選択し、 [ロールの割り当て] を選択します。 ストレージ アカウントへのアクセス権を持つユーザーのリストが表示されます。 ここで、ストレージ アカウントへのアクセスを必要とするアプリ サービスであるロボットに、ロールの割り当てを追加します。 [追加]>[ロールの割り当ての追加] を選択して、[ロールの割り当ての追加] ページを開きます。
[割り当ての種類] タブで、[ジョブ関数の種類] を選択し、[次へ] を選択します。
[ロール] タブで、ドロップダウンから [ストレージ BLOB データ共同作成者] ロールを選択し、[次へ] を選択します。
[メンバー] タブで [アクセスの割り当て先] ->[マネージド ID] を選択してから、[メンバー] ->[メンバーの選択] を選びます。 [マネージド ID の選択] ウィンドウの [マネージド ID] ドロップダウンで、お使いの App Service 用に作成されたマネージド ID を見つけて選択します。 [選択] ボタンを選択します。
[確認と割り当て] を選択し、もう一度 [確認と割り当て] を選択します。
詳細な手順については、「Azure portal を使用して Azure ロールを割り当てる」を参照してください。
これで、Web アプリからストレージ アカウントにアクセスできるようになりました。
Blob Storage にアクセスする
DefaultAzureCredential クラスは、Azure Storage に対する要求をコードで承認するためにトークン資格情報を取得する際に使用されます。 DefaultAzureCredential クラスのインスタンスを作成します。これは、マネージド ID を使用し、トークンを取得してサービス クライアントにアタッチします。 次のコード例では、認証済みのトークン資格情報を取得し、それを使用して、新しい BLOB をアップロードするサービス クライアント オブジェクトを作成します。
このコードをサンプル アプリケーションの一部として見る場合は、GitHub 上のサンプルを参照してください。
クライアント ライブラリ パッケージをインストールする
Blob Storage を使用するための Blob Storage NuGet パッケージと、Microsoft Entra の資格情報で認証するための .NET 用 Azure Identity クライアント ライブラリ NuGet パッケージをインストールします。 クライアント ライブラリは、.NET コマンドライン インターフェイス (CLI) または Visual Studio のパッケージ マネージャー コンソールを使用してインストールします。
.NET CLI
コマンド ラインを開き、プロジェクト ファイルが含まれているディレクトリに切り替えます。
インストール コマンドを実行します。
dotnet add package Azure.Storage.Blobs
dotnet add package Azure.Identity
パッケージ マネージャー コンソール
Visual Studio でプロジェクトまたはソリューションを開き、 [ツール]>[NuGet パッケージ マネージャー]>[パッケージ マネージャー コンソール] コマンドを使用してコンソールを開きます。
インストール コマンドを実行します。
Install-Package Azure.Storage.Blobs
Install-Package Azure.Identity
例
using System;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Text;
using System.IO;
using Azure.Identity;
// Some code omitted for brevity.
static public async Task UploadBlob(string accountName, string containerName, string blobName, string blobContents)
{
// Construct the blob container endpoint from the arguments.
string containerEndpoint = string.Format("https://{0}.blob.core.windows.net/{1}",
accountName,
containerName);
// Get a credential and create a client object for the blob container.
BlobContainerClient containerClient = new BlobContainerClient(new Uri(containerEndpoint),
new DefaultAzureCredential());
try
{
// Create the container if it does not exist.
await containerClient.CreateIfNotExistsAsync();
// Upload text to a new block blob.
byte[] byteArray = Encoding.ASCII.GetBytes(blobContents);
using (MemoryStream stream = new MemoryStream(byteArray))
{
await containerClient.UploadBlobAsync(blobName, stream);
}
}
catch (Exception e)
{
throw e;
}
}
リソースをクリーンアップする
このチュートリアルを完了し、Web アプリや関連するリソースが不要になった場合は、作成したリソースをクリーンアップします。