マネージド ID を使用して Azure App Service で実行されている、サインインしているユーザーではなく、Web アプリから Azure Storage などの Azure サービスにアクセスする方法について説明します。 このチュートリアルでは、例としてAzure Storageに接続する方法について説明します。
このチュートリアルを使用して、マネージド ID をサポートしているすべてのサービス (次の図の B) に安全にアクセスできます。
- Azure Storage
- Azure SQL Database
- Azure Key Vault
Web アプリから、Azure Storage、Azure SQL Database、Azure Key Vault などの Azure サービスへのセキュリティで保護されたアクセスを追加する必要があります。 共有キーを使用することもできますが、その場合、シークレットを作成、デプロイ、および管理できるユーザーの運用上のセキュリティについて配慮する必要があります。 また、ハッカーがスキャン方法を知っているGitHubにキーをチェックインすることもできます。 Web アプリにデータへのアクセスを許可するより安全な方法では、マネージド ID を使用します。
Microsoft Entra IDのマネージド ID を使用すると、App Service は、アプリの資格情報を必要とせずに、ロールベースのアクセス制御 (RBAC) を介してリソースにアクセスできます。 マネージド ID を Web アプリに割り当てると、Azure によって証明書の作成と配布が行われます。 シークレットまたはアプリの資格情報の管理について心配する必要はありません。
このチュートリアルでは、以下の内容を学習します。
- Web アプリ上でシステム割り当てマネージド ID を作成する。
- ストレージ アカウントとAzure Blob Storage コンテナーを作成します。
- マネージド ID を使用して Web アプリからストレージにアクセスする。
Azure アカウントがない場合は、開始する前に free アカウントを作成します。
前提条件
Azure App Service で実行されている Web アプリケーション:
アプリでマネージド ID を有効にする
Visual Studioを使用して Web アプリを作成して発行すると、アプリでマネージド ID が有効になりました。
アプリ サービスの左側のメニューで [ ID] を選択し、[ システム割り当て済み] を選択します。 [Status](状態) が [オン] に設定されていることを確認します。
そうでない場合は、[ オン] を選択し、[ 保存] を選択します。 システム割り当てマネージド ID を有効にするには、確認ダイアログで [ はい] を選択します。 マネージド ID が有効になると、状態が [オン] に設定され、オブジェクト ID が使用可能になります。
この手順により、 [認証/承認] ペインで作成されたアプリ ID とは異なる新しいオブジェクト ID が作成されます。 システム割り当てマネージド ID のオブジェクト ID をコピーしておきます。 この情報は後で必要になります。
ストレージ アカウントとBlob Storage コンテナーを作成する
これで、ストレージ アカウントとBlob Storageコンテナーを作成する準備ができました。
すべてのストレージ アカウントは、Azure リソース グループに属している必要があります。 リソース グループは、Azure サービスの論理コンテナーです。 ストレージ アカウントを作成するときは、新しいリソース グループを作成するか、既存のリソース グループを使用できます。 この記事では、新しいリソース グループを作成する方法を示します。
汎用 v2 ストレージ アカウントは、BLOB、ファイル、キュー、テーブル、ディスクなど、すべてのAzure Storage サービスへのアクセスを提供します。 ここで説明する手順では汎用 v2 ストレージ アカウントを作成しますが、作成手順はどの種類のストレージ アカウントでも似ています。
Azure Storage内の BLOB はコンテナーに編成されます。 このチュートリアルの後半で BLOB をアップロードする前に、まずコンテナーを作成する必要があります。
Azure ポータルで汎用 v2 ストレージ アカウントを作成するには、次の手順に従います。
Azure ポータル メニューで、「Storage Accounts」と入力>。 入力を始めると、入力内容に基づいて、一覧がフィルター処理されます。 [ストレージ アカウント] を選択します。
表示される [ストレージ アカウント] ウィンドウで、[作成] を選択します。
ストレージ アカウントを作成するサブスクリプションを選択します。
[リソース グループ] で、Web アプリを含むリソース グループを選択します。
ストレージ アカウントの名前を入力します。 選択する名前は、Azure全体で一意である必要があります。 名前の長さは 3 ~ 24 文字にする必要があり、数字と小文字のみを含めることができます。
ストレージ アカウントの場所 (リージョン) を選択するか、または既定値を使用します。
[優先ストレージの種類] で、[Azure Blob Storage] または [Azure Data Lake Storage Gen 2] を選択します。
以下のフィールドは既定値に設定されたままにします。
フィールド 値 パフォーマンス Standard 冗長性 ジオ冗長ストレージ [確認および作成] を選択して、ストレージ アカウントの設定を確認し、アカウントを作成します。
[作成] を選択します
Azure StorageでBlob Storage コンテナーを作成するには、次の手順に従います。
Azure ポータルで新しいストレージ アカウントに移動します。
ストレージ アカウントの左側のメニューの [ データ ストレージ] で、[コンテナー] を選択 します。
[ コンテナーの追加] を選択します。
新しいコンテナーの名前を入力します。 コンテナー名は小文字である必要があり、英文字または数字で始まる必要があり、英文字、数字、ダッシュ (-) 文字のみを含めることができます。
コンテナーにパブリック アクセスのレベルを設定します。 既定のレベルは [ プライベート (匿名アクセスなし)] です。
[OK] を選択してコンテナーを作成します。
ストレージ アカウントへのアクセスを許可する
BLOB の作成、読み取り、または削除を行う前に、ストレージ アカウントへのアクセスを Web アプリに許可する必要があります。 前のセクションでは、App Service で実行されている Web アプリをマネージド ID で構成しました。 Azure RBAC を使用すると、任意のセキュリティ プリンシパルと同様に、マネージド ID に別のリソースへのアクセス権を付与できます。
ストレージ BLOB データ共同作成者ロールは、システム割り当てマネージド ID で表される Web アプリに、BLOB コンテナーとデータへの読み取り、書き込み、削除のアクセス権を付与します。
注意
Azure RBAC では、BLOB の表示やアカウント間での BLOB のコピーなど、プライベート BLOB コンテナーに対する一部の操作はサポートされていません。 プライベート アクセス レベルの BLOB コンテナーでは、Azure RBAC が承認しない操作に SAS トークンが必要です。 詳細については、「Shared Access Signature を使用するタイミング」を参照してください。
- Azure ポータルで、ストレージ アカウントに移動して Web アプリへのアクセスを許可します。
- 左側のメニューで、[ アクセス制御 (IAM)] を選択し、[ ロールの割り当て] を選択します。 ストレージ アカウントにアクセスできるユーザーの一覧が表示されます。
- ストレージ アカウントにアクセスする必要があるアプリ サービスにロールの割り当てを追加する必要があります。 [追加]>[ロールの割り当ての追加] を選択して、[ロールの割り当ての追加] ページを開きます。
- ストレージ アカウント スコープで、 ストレージ BLOB データ共同作成者 ロールを App Service に割り当てます。 詳細については、Azure ポータルを使用して Azure ロールを割り当てる を参照してください。
これで、Web アプリからストレージ アカウントにアクセスできるようになりました。
BLOB ストレージにアクセス
DefaultAzureCredential クラスは、Azure Storageへの要求を承認するコードのトークン資格情報を取得するために使用されます。 DefaultAzureCredential クラスのインスタンスを作成します。これは、マネージド ID を使用し、トークンを取得してサービス クライアントにアタッチします。 次のコード例では、認証済みのトークン資格情報を取得し、それを使用して、新しい BLOB をアップロードするサービス クライアント オブジェクトを作成します。
サンプル アプリケーションの一部としてこのコードを確認するには、GitHub の
クライアント ライブラリ パッケージをインストールする
Blob Storage NuGet パッケージをインストールして、Blob Storageを操作し、Azure Identity クライアント ライブラリ for .NET NuGet パッケージをインストールしてMicrosoft Entra資格情報で認証します。 Visual Studioの .NET Core コマンド ライン インターフェイスまたは Package Manager コンソールを使用して、クライアント ライブラリをインストールします。
.NET Core コマンド ライン
コマンド ラインを開き、プロジェクト ファイルが含まれているディレクトリに切り替えます。
インストール コマンドを実行します。
dotnet add package Azure.Storage.Blobs dotnet add package Azure.Identity
Package Manager コンソール
Visual Studioでプロジェクトまたはソリューションを開き、Tools>NuGet Package Manager>Package Manager Console コマンドを使用してコンソールを開きます。
インストール コマンドを実行します。
Install-Package Azure.Storage.Blobs Install-Package Azure.Identity
.NET例
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 doesn't 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 アプリや関連リソースが不要になった場合は、作成したリソースをクリーンアップします。
リソース グループを削除します
Azure portal で、Azure portal メニューから [リソース グループ] を選択し、App Service と App Service プランを含むリソース グループを選択します。
[リソース グループの削除] を選択して、リソース グループとすべてのリソースを削除します。
確認するリソース グループの名前を入力します。
このプロセスの実行には数分かかる場合があります。
次の手順
このチュートリアルでは、次の作業を行う方法を学びました。
- システム割り当てマネージド ID を作成する。
- ストレージ アカウントとコンテナー Blob Storage作成します。
- マネージド ID を使用して Web アプリからストレージにアクセスする。