チュートリアル: .NET Web アプリから Azure サービスにアクセスする

マネージド ID を使用して、Azure App Service 上で実行されている (サインイン ユーザーではない) Web アプリから Azure サービス (Azure Storage など) にアクセスする方法について説明します。 このチュートリアルでは、例として Azure Storage への接続を示します。

このチュートリアルを使用して、マネージド ID をサポートしているすべてのサービス (次の図の B) に安全にアクセスできます。

  • Azure Storage
  • Azure SQL Database
  • Azure Key Vault

Diagram that shows how to access 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 無料アカウントを作成してください。

前提条件

アプリでマネージド ID を有効にする

Visual Studio を使用して Web アプリを作成して発行すると、アプリでマネージド ID が有効になります。 App Service で、左ペインの [ID] を選択し、 [システム割り当て済み] を選択します。 [Status](状態)[オン] に設定されていることを確認します。 そうでない場合は、[オン][保存] の順に選択します。 確認ダイアログで [はい] を選択して、システム割り当てマネージド ID を有効にします。 マネージド ID が有効になると、状態が [オン] に設定され、オブジェクト ID が使用可能になります。

Screenshot that shows the System assigned identity option.

この手順により、 [認証/承認] ペインで作成されたアプリ ID とは異なる新しいオブジェクト ID が作成されます。 システム割り当てマネージド ID のオブジェクト ID をコピーしておきます。 この情報は後で必要になります。

ストレージ アカウントと Blob Storage コンテナーを作成する

これで、ストレージ アカウントと Blob Storage コンテナーを作成する準備が整いました。

すべてのストレージ アカウントは、Azure リソース グループに属している必要があります。 リソース グループは、Azure サービスをグループ化するための論理コンテナーです。 ストレージ アカウントを作成するときに、新しいリソース グループを作成するか、既存のリソース グループを使用するかを選択できます。 この記事では、新しいリソース グループを作成する方法を示します。

汎用 v2 ストレージ アカウントでは、すべての Azure Storage サービス (BLOB、ファイル、キュー、テーブル、ディスク) へのアクセスが提供されます。 ここで説明する手順では汎用 v2 ストレージ アカウントを作成しますが、作成手順はどの種類のストレージ アカウントでも似ています。

Azure Storage 内の BLOB はコンテナーにまとめられます。 このチュートリアルの後半で BLOB をアップロードする前に、まずコンテナーを作成する必要があります。

Azure portal で汎用 v2 ストレージ アカウントを作成するには、次の手順に従います。

  1. Azure portal のメニューで、[すべてのサービス] を選択します。 リソースの一覧で、「Storage Accounts」と入力します。 入力を始めると、入力内容に基づいて、一覧がフィルター処理されます。 [ストレージ アカウント] を選択します。

  2. 表示される [ストレージ アカウント] ウィンドウで、[作成] を選択します。

  3. ストレージ アカウントを作成するサブスクリプションを選択します。

  4. [リソース グループ] フィールドで、ドロップダウン メニューから、対象の Web アプリが含まれているリソース グループを選択します。

  5. 次に、ストレージ アカウントの名前を入力します。 選択する名前は Azure 全体で一意である必要があります。 また、名前の長さは 3 から 24 文字とし、数字と小文字のみを使用できます。

  6. ストレージ アカウントの場所 (リージョン) を選択するか、または既定値を使用します。

  7. 以下のフィールドは既定値に設定されたままにします。

    フィールド
    デプロイメント モデル リソース マネージャー
    パフォーマンス Standard
    アカウントの種類 StorageV2 (汎用 v2)
    レプリケーション 読み取りアクセス地理冗長ストレージ (RA-GRS)
    アクセス層 ホット
  8. [確認および作成] を選択して、ストレージ アカウントの設定を確認し、アカウントを作成します。

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

Azure Storage で Blob Storage コンテナーを作成するには、次の手順に従います。

  1. Azure portal で新しいストレージ アカウントに移動します。

  2. ストレージ アカウントの左側のメニューで、[データ ストレージ] セクションまでスクロールし、[コンテナー] を選択します。

  3. [+ コンテナー] ボタンを選択します。

  4. 新しいコンテナーの名前を入力します。 コンテナー名は小文字である必要があり、英文字または数字で始まる必要があり、英文字、数字、ダッシュ (-) 文字のみを含めることができます。

  5. コンテナーにパブリック アクセスのレベルを設定します。 既定のレベルは [ プライベート (匿名アクセスなし)] です。

  6. [OK] を選択してコンテナーを作成します。

ストレージ アカウントへのアクセスを許可する

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 データ共同作成者ロールを、サブスクリプション スコープで App Service に割り当てます。 詳細な手順については、「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 Core コマンド ライン インターフェイスまたは Visual Studio のパッケージ マネージャー コンソールを使用してインストールします。

.NET Core コマンド ライン

  1. コマンド ラインを開き、プロジェクト ファイルが含まれているディレクトリに切り替えます。

  2. インストール コマンドを実行します。

    dotnet add package Azure.Storage.Blobs
    
    dotnet add package Azure.Identity
    

パッケージ マネージャー コンソール

  1. Visual Studio でプロジェクトまたはソリューションを開き、 [ツール]>[NuGet パッケージ マネージャー]>[パッケージ マネージャー コンソール] コマンドを使用してコンソールを開きます。

  2. インストール コマンドを実行します。

    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 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 アプリや関連するリソースが不要になった場合は、作成したリソースをクリーンアップします。

リソース グループを削除します

Azure portal で、ポータル メニューから [リソース グループ] を選択し、対象のアプリ サービスとアプリ サービス プランが含まれているリソース グループを選択します。

[リソース グループの削除] を選択して、リソース グループとすべてのリソースを削除します。

Screenshot that shows deleting the resource group.

このコマンドの実行には数分かかることがあります。

次の手順

このチュートリアルでは、次の作業を行う方法を学びました。

  • システム割り当てマネージド ID を作成する。
  • ストレージ アカウントと Blob Storage コンテナーを作成する。
  • マネージド ID を使用して Web アプリからストレージにアクセスする。