App Service と Azure Functions でマネージド ID を使用する方法
Note
2024 年 6 月 1 日より、新しく作成されたすべての App Service アプリには、名前付け規則 <app-name>-<random-hash>.<region>.azurewebsites.net
を使用して一意の既定のホスト名を生成するオプションが備わります。 既存のアプリ名は変更されません。
例: myapp-ds27dh7271aah175.westus-01.azurewebsites.net
詳細については、App Service リソースの一意の既定のホスト名に関するページを参照してください。
このトピックでは、App Service と Azure Functions アプリケーションでマネージド ID を作成し、それを使用して他のリソースにアクセスする方法を説明します。
重要
マネージド ID はディレクトリ間のシナリオをサポートしていないため、アプリがサブスクリプション間またはテナント間で移行された場合、想定どおりには動作しません。 そのような移行後にマネージド ID をもう一度作成するには、「サブスクリプションを別のディレクトリに移動する場合、マネージド ID は自動的に再作成されますか?」をご覧ください。 また、ダウンストリーム リソースでも新しい ID が使用されるように、アクセス ポリシーを更新する必要があります。
Note
マネージド ID は、Azure Arc にデプロイされているアプリでは使用できません。
アプリで Microsoft Entra ID のマネージド ID を使用すると、他の Microsoft Entra で保護されたリソース (Azure Key Vault など) に簡単にアクセスできます。 ID は Azure プラットフォームによって管理され、ユーザーがシークレットをプロビジョニングまたはローテーションする必要はありません。 Microsoft Entra ID のマネージド ID の詳細については、「Azure リソースのマネージド ID」を参照してください。
アプリケーションには 2 種類の ID を付与できます。
- システム割り当て ID はアプリに関連付けられ、そのアプリが削除されると削除されます。 アプリは 1 つのシステム割り当て ID しか持つことはできません。
- ユーザー割り当て ID は、アプリに割り当てることができるスタンドアロン Azure リソースです。 アプリは複数のユーザー割り当て ID を持つことができ、1 つのユーザー割り当て ID を複数の Azure リソース (2 つの App Service アプリなど) に割り当てることができます。
マネージド ID の構成はスロットに固有です。 ポータルでデプロイ スロットのマネージド ID を構成するには、まずスロットに移動します。 Azure portal で Microsoft Entra テナント内の Web アプリまたはデプロイ スロットのマネージド ID を検索するには、テナントの [概要] ページで直接検索します。 通常、スロット名は <app-name>/slots/<slot-name>
に似ています。
このビデオは、App Service に対しマネージド ID を使用する方法を示しています。
ビデオの手順については、次のセクションでも説明します。
システム割り当て ID を追加する
左側のナビゲーション ウィンドウの [設定] グループで、Azure portal でアプリの設定にアクセスします。
[ID] を選択します。
[システム割り当て済み] タブで、 [状態] を [オン] に切り替えます。 [保存] をクリックします。
ユーザー割り当て ID を追加する
ユーザー割り当て ID を持つアプリを作成するには、ID を作成してから、そのリソース ID をアプリ構成に追加する必要があります。
最初に、ユーザー割り当て ID リソースを作成する必要があります。
以下の手順に従って、ユーザー割り当てマネージド ID リソースを作成します。
アプリのページの左側のナビゲーションで、[設定] グループまで下にスクロールします。
[ID] を選択します。
[ユーザー割り当て済み]>[追加] を選びます。
先ほど作成した ID を検索して選び、[追加] を選びます。
[追加] を選ぶと、アプリが再起動します。
ターゲット リソースを構成する
アプリまたは関数からのアクセスを許可するようにターゲット リソースを構成する必要がある場合があります。 例えば、Key Vault にアクセスするためにトークンを要求する場合、アプリや関数のマネージド ID を含むアクセス ポリシーも追加する必要があります。 それ以外の場合は、有効なトークンを使用する場合でも、Key Vault への呼び出しは拒否されます。 同じことが Azure SQL Database にも当てはまります。 Microsoft Entra トークンをサポートしているリソースの詳細については、「Microsoft Entra 認証をサポートしている Azure サービス」をご覧ください。
重要
マネージド ID のバックエンド サービスは、リソース URI ごとのキャッシュを約 24 時間保持します。 これは、マネージド ID のグループまたはロール メンバーシップの変更が有効になるまでに数時間かかる可能性があることを意味します。 現時点では、マネージド ID のトークンの有効期限が切れる前にトークンを強制的に更新することはできません。 そのため、マネージド ID のグループまたはロールのメンバーシップを変更してアクセス許可を追加または削除する場合には、ID を使用する Azure リソースに適切なアクセス権が付与されるまでに、数時間の待ち時間が発生することがあります。 グループまたはロール メンバーシップの代替については、「認可にマネージド ID を使用する場合の制限」を参照してください。
アプリ コードでの Azure サービスへの接続
アプリはマネージド ID を使用して、Azure SQL Database、Azure キー コンテナー、Azure ストレージなど、Microsoft Entra ID によって保護されている Azure リソースのトークンを取得できます。 これらのトークンは、アプリケーションの特定のユーザーではなく、リソースにアクセスしているアプリケーションを表します。
App Service と Azure Functions は、トークン取得のために、内部でアクセス可能なRES Tエンドポイントを提供します。 REST エンドポイントは、標準の HTTP GET を使用してアプリ内からアクセスでき、すべての言語で汎用 HTTP クライアントを実装できます。 NET、JavaScript、Java、Python の場合、Azure ID クライアント ライブラリは、この REST エンドポイントを抽象化し、開発環境を簡素化します。 他の Azure サービスへの接続は、サービス固有のクライアントに資格情報オブジェクトを追加するのと同じくらい簡単です。
生の HTTP GET 要求では、指定された 2 つの環境変数が使用され、次の例のようになります。
GET /MSI/token?resource=https://vault.azure.net&api-version=2019-08-01 HTTP/1.1
Host: <ip-address-:-port-in-IDENTITY_ENDPOINT>
X-IDENTITY-HEADER: <value-of-IDENTITY_HEADER>
応答の例は次のようになります。
HTTP/1.1 200 OK
Content-Type: application/json
{
"access_token": "eyJ0eXAi…",
"expires_on": "1586984735",
"resource": "https://vault.azure.net",
"token_type": "Bearer",
"client_id": "00001111-aaaa-2222-bbbb-3333cccc4444"
}
この応答は、Microsoft Entra のサービス間アクセス トークン要求に対する応答と同じです。 Key Vault にアクセスするには、access_token
の値をコンテナーとのクライアント接続に追加します。
REST エンドポイントの詳細については、「REST エンドポイント リファレンス」を参照してください。
ID を削除する
システム割り当て ID を削除すると、Microsoft Entra ID から削除されます。 また、アプリ リソース自体を削除すると、システム割り当て ID も Microsoft Entra ID から自動的に削除されます。
アプリのページの左側のナビゲーションで、[設定] グループまで下にスクロールします。
[ID] を選択します。 次に、ID の種類に基づいて、次の手順に従います。
- システムに割り当てられた ID: [システム割り当て済み] タブで [状態] を [オフ] に切り替えます。 [保存] をクリックします。
- ユーザーに割り当てられたID: [ユーザ割り当て済み] タブを選択し、ID のチェックボックスを選択し、[削除] を選択します。 [はい] を選択して確定します。
Note
また、単純にローカル トークン サービスを無効にする、設定可能なアプリケーション設定 WEBSITE_DISABLE_MSI もあります。 ただし、ID はその場所に残り、ツールには引き続きマネージド ID が "オン" または "有効" と表示されます。そのため、この設定の使用はお勧めしません。
REST エンドポイントの参照
マネージド ID を持つアプリは、次の 2 つの環境変数を定義することによってこのエンドポイントを使用できます。
- IDENTITY_ENDPOINT - ローカル トークン サービスに対する URL。
- IDENTITY_HEADER - サーバー側のリクエスト フォージェリ (SSRF) 攻撃を回避するために使用するヘッダー。 値は、プラットフォームによってローテーションされます。
IDENTITY_ENDPOINT は、お使いのアプリがトークンを要求するローカル URL です。 リソースのトークンを取得するには、次のパラメーターを指定して、このエンドポイントに HTTP GET 要求を行います。
パラメーター名 場所 説明 resource クエリ トークンを取得する必要のあるリソースの Microsoft Entra リソース URI。 これは Microsoft Entra 認証をサポートしている Azure サービスの 1 つか、その他のリソース URI になります。 api-version クエリ 使うトークン API のバージョン。 2019-08-01
を使用してください。X-IDENTITY-HEADER ヘッダー IDENTITY_HEADER 環境変数の値。 このヘッダーは、サーバー側のリクエスト フォージェリ (SSRF) 攻撃を回避するために使用されます。 client_id クエリ (省略可能) 使用するユーザー割り当て ID のクライアント ID。 principal_id
、mi_res_id
、またはobject_id
を含む要求では使用できません。 すべての ID パラメーター (client_id
、principal_id
、object_id
、およびmi_res_id
) を省略した場合、システム割り当て ID が使用されます。principal_id クエリ (省略可能) 使用するユーザー割り当て ID のプリンシパル ID。 object_id
は代わりに使用する別名です。 client_id、mi_res_id、または object_id を含む要求では使用できません。 すべての ID パラメーター (client_id
、principal_id
、object_id
、およびmi_res_id
) を省略した場合、システム割り当て ID が使用されます。mi_res_id クエリ (省略可能) 使用するユーザー割り当て ID の Azure リソース ID。 principal_id
、client_id
、またはobject_id
を含む要求では使用できません。 すべての ID パラメーター (client_id
、principal_id
、object_id
、およびmi_res_id
) を省略した場合、システム割り当て ID が使用されます。
重要
ユーザー割り当て ID のトークンを取得する場合は、省略可能なプロパティの 1 つを含める必要があります。 このようにしないと、トークン サービスは存在する場合と存在しない場合があるシステムが割り当てた ID のトークンを取得しようとします。