Azure SDK for JavaScript を使用して Azure リソースに対して Azure でホストされるアプリを認証する

Azure App Service、Azure Virtual Machines、Azure Container Instances などのサービスを使用してアプリが Azure でホストされている場合、Azure リソースに対してアプリを認証する方法として推奨されるのは、 マネージド ID を使用することです。

マネージド ID はアプリの ID を提供するため、アプリはシークレット (キーの接続文字列など) を使用せずに他の Azure リソースに接続できます。 内部的には、Azure でアプリの ID と、接続が許可されているリソースを把握します。 この情報により、アプリの Microsoft Entra トークンが Azure によって自動的に取得され、アプリが他の Azure リソースに接続できるようになります。認証シークレットの管理 (作成またはローテーション) は必要ありません。

マネージド ID の種類

マネージド ID には、次の 2 種類があります。

  • システム割り当てマネージド ID - 単一の Azure リソース
  • ユーザーが割り当てたマネージド ID - 複数の Azure リソース

この記事では、アプリのシステム割り当てマネージド ID を有効にして使用する手順について説明します。 ユーザー割り当てマネージド ID を使用する必要がある場合は、「ユーザー割り当てマネージド ID の管理」の記事を参照して、ユーザー割り当てマネージド ID の作成方法を確認してください。

単一リソースに対するシステム割り当てマネージド ID

システム割り当てマネージド ID は、Azure リソースによって提供され、Azure リソースに直接関連付けられます。 Azure リソースでマネージド ID を有効にすると、そのリソースのシステム割り当てマネージド ID が取得されます。 これは、Azure リソースのライフサイクルに関連付けられています。 リソースが削除されると、その ID も Azure によって自動的に削除されます。 コードをホストしている Azure リソースのマネージド ID を有効にすればよいだけなので、これが最も使いやすい種類のマネージド ID です。

複数のリソースに対するユーザー割り当てマネージド ID

概念的には、この ID はスタンドアロンの Azure リソースです。 これが最もよく使用されるのは、ソリューションに複数の Azure リソースで実行される複数のワークロードがあり、すべてが同じ ID と同じアクセス許可を共有する必要がある場合です。 たとえば、ソリューションに複数の App Service と仮想マシンのインスタンスで実行されるコンポーネントがあり、それらのすべてが同じ Azure リソース セットにアクセスする必要がある場合、それらのリソース全体でユーザー割り当てマネージド ID を作成して使用することは理にかなっています。

1 - システム割り当て: ホストされているアプリで有効にする

最初の手順では、アプリをホストしている Azure リソースでマネージド ID を有効にします。 たとえば、Azure App Service を使用して Django アプリケーションをホストしている場合は、その App Service Web アプリのマネージド ID を有効にする必要があります。 仮想マシンを使用してアプリをホストしている場合は、VM でマネージド ID を使用できるようにします。

Azure portal または Azure CLI を使用して、マネージド ID を Azure リソースに使用できるようにすることができます。

手順 Screenshot
Azure portal でアプリケーション コードをホストするリソースに移動します。

たとえば、ページの上部にある検索ボックスにリソースの名前を入力し、ダイアログ ボックスでそれを選択して移動できます。
Azure portal の上部にある検索バーを使って Azure のリソースを検索して移動する方法を示すスクリーンショット。
リソースのページで、左側のメニューから [ID] メニュー項目を選択します。

マネージド ID をサポートできるすべての Azure リソースには、メニューのレイアウトが若干異なる場合もありますが、 ID メニュー項目があります。
Azure リソースの左側のメニューにある [ID] メニュー項目の場所を示すスクリーンショット。
[ID] ページで、次の操作を行います。
  1. [状態] スライダーを [オン] に変更します。
  2. [保存] を選択します。
サービスのマネージド ID を有効にするかどうかを確認するための確認ダイアログが表示されます。 [はい] を選択して、Azure リソースに対してマネージド ID を有効にします。
リソースの [ID] ページで Azure リソースのマネージド ID を有効にする方法を示すスクリーンショット。

2 - マネージド ID にロールを割り当てる

次に、アプリに必要なロール (アクセス許可) を決定し、Azure でこれらのロールにマネージド ID を割り当てる必要があります。 マネージド ID には、リソース、リソース グループ、またはサブスクリプション スコープでロールを割り当てることができます。 次に、ほとんどのアプリケーションがすべてのAzureリソースを1つのリソースグループにグループ化するため、リソースグループスコープでロールを割り当てる例を示します。

手順 Screenshot
Azure portal の上部にある検索ボックスを使用してリソース グループ名を検索し、アプリケーションのリソース グループを見つけます。

ダイアログ ボックスの [リソース グループ] 見出しの下にあるリソース グループ名を選択して、リソース グループに移動します。
Azure portal の上部にある検索バーを使って Azure のリソース グループを検索して移動する方法を示すスクリーンショット。
リソース グループのページで、左側のメニューから [アクセス制御 (IAM)] を選択します。 Azure リソース グループの左側のメニューにある [アクセス制御 (IAM)] メニュー項目の場所を示すスクリーンショット。
[アクセス制御 (IAM)] ページで、次の操作を行います。
  1. [ロールの割り当て] タブを選択します。
  2. 上部のメニューから [+ 追加] を選択し、次に結果のドロップダウン メニューから [ロールの割り当ての追加] を選択します。
[ロールの割り当て] タブへの移動方法と、ロールの割り当てをリソース グループに追加するボタンの場所を示すスクリーンショット。
[ロールの割り当ての追加] ページには、リソース グループで割り当てることができるすべてのロールが一覧表示されます。
  1. 検索ボックスを使用して、より管理しやすいサイズにリストをフィルター処理します。 この例では、Storage BLOB ロールをフィルター処理する方法を示します。
  2. 割り当てるロールを選択します。
    [次へ] を選択して、次の画面に進みます。
リソース グループに追加するロールの割り当てを見つけるためにフィルター処理して選択する方法を示すスクリーンショット。
次の [ロールの割り当ての追加] ページでは、ロールを割り当てるユーザーを指定できます。
  1. [アクセス権の割り当て先][マネージド ID] を選択します。
  2. [メンバー][+ メンバーの選択] を選択する
Azure portal の右側でダイアログ ボックスが開きます。
ロールの割り当ての追加ページで、ロール (アクセス許可) を割り当てるユーザーの種類としてマネージド ID を選ぶ方法を示すスクリーンショット。
[マネージド ID の選択] ダイアログで、次の操作を行います。
  1. [マネージド ID] ドロップダウンと [選択] テキスト ボックスを使用して、サブスクリプション内のマネージド ID の一覧をフィルター処理できます。 この例では、 App Service を選択することで、App Service に関連付けられているマネージド ID のみが表示されています。
  2. アプリケーションをホストしている Azure リソースのマネージド ID を選択します。
ダイアログの下部にある [選択] を選んで続行します。
マネージド ID の選択ダイアログを使って、ロールを割り当てるマネージド ID をフィルター処理し、選ぶ方法を示すスクリーンショット。
マネージド ID が、 [ロールの割り当ての追加] 画面に選択済みとして表示されます。

[レビューと割り当て] を選択して最終ページに移動し、もう一度 レビューと割り当て を行ってプロセスを完了します。
[ロールの割り当ての追加] の最終画面のスクリーンショット。ユーザーはここでロールの割り当てを確定するために [確認と割り当て] ボタンを選ぶ必要があります。

3 - アプリケーションに DefaultAzureCredential を実装する

DefaultAzureCredential クラスでは、マネージド ID が使用されていることを自動的に検出し、マネージド ID を使用して他の Azure リソースに対する認証を行います。 Azure SDK for JavaScript の認証の概要 に関する記事で説明したように、 DefaultAzureCredential では複数の認証方法をサポートし、実行時に使用される認証方法を決定します。 このようにして、アプリでは環境固有のコードを実装することなく、さまざまな環境でさまざまな認証方法を使用できます。

まず、 @azure/identity パッケージをアプリケーションに追加します。

npm install @azure/identity

次に、アプリ内に Azure SDK クライアント オブジェクトを作成する JavaScript コードについて、次のことを行います。

  1. DefaultAzureCredential モジュールから @azure/identity クラスをインポートします。
  2. DefaultAzureCredential オブジェクトを作成します。
  3. Azure SDK クライアント オブジェクト コンストラクターに DefaultAzureCredential オブジェクトを渡します。

この例を次のコード セグメントに示します。

// connect-with-default-azure-credential.js
import { BlobServiceClient } from '@azure/storage-blob';
import { DefaultAzureCredential } from '@azure/identity';
import 'dotenv/config'

const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;
if (!accountName) throw Error('Azure Storage accountName not found');

const blobServiceClient = new BlobServiceClient(
  `https://${accountName}.blob.core.windows.net`,
  new DefaultAzureCredential()
);

上記のコードがローカル開発中にローカルワークステーションで実行されると、SDKメソッド DefaultAzureCredential()は、アプリケーションサービスプリンシパルを環境変数で探すか、VS Code、Azure CLI、またはAzure PowerShellで開発者資格情報のセットを探します。 このようにして、この同じコードを使用して、ローカル開発中と Azure へのデプロイ時の両方で Azure リソースに対してアプリを認証できます。