App Service と Azure Functions でマネージド ID を使用する方法
[アーティクル]
12/05/2022
23 人の共同作成者
フィードバック
この記事の内容
このトピックでは、App Service と Azure Functions アプリケーションでマネージド ID を作成し、それを使用して他のリソースにアクセスする方法を説明します。
重要
ご自分のアプリがサブスクリプションやテナント間で移行されている場合、App Service と Azure Functions のマネージド ID は、予期どおりには動作しません。 アプリ用には、新規で ID を取得する必要があります。これには、この機能を無効にし てから再度有効にする必要があります。 また、ダウンストリーム リソースでも新しい ID が使用されるように、アクセス ポリシーを更新する必要があります。
ご自分のアプリで Azure Active Directory (AAD) のマネージド ID を使用すると、Azure Key Vault など、Azure AD で保護されたその他のリソースに簡単にアクセスできます。 ID は Azure プラットフォームによって管理され、ユーザーがシークレットをプロビジョニングまたはローテーションする必要はありません。 Azure AD のマネージド ID について詳しくは、「Azure リソースのマネージド ID とは 」をご覧ください。
アプリケーションには 2 種類の ID を付与できます。
システム割り当て ID はアプリケーションに関連付けられているため、アプリが削除されると削除されます。 アプリは 1 つのシステム割り当て ID しか持つことはできません。
ユーザー割り当て ID は、アプリに割り当てることができるスタンドアロン Azure リソースです。 アプリは複数のユーザー割り当て ID を持つことができます。
システム割り当て ID を追加する
アプリのページの左側のナビゲーションで、[設定] グループまで下にスクロールします。
[ID] を選択します。
[システム割り当て済み] タブで、 [状態] を [オン] に切り替えます。 [保存] をクリックします。
Note
Azure portal で Web アプリまたはスロット アプリのマネージド ID を検索するには、 [エンタープライズアプリケーション] の下にある [ユーザー設定] セクションを確認します。 通常、スロット名は <app name>/slots/<slot name>
に似ています。
az webapp identity assign
コマンドを実行して、システム割り当て ID を作成します。
az webapp identity assign --name myApp --resource-group myResourceGroup
App Service の場合
Set-AzWebApp -AssignIdentity
コマンドを実行して、App Service のシステム割り当て ID を作成します。
Set-AzWebApp -AssignIdentity $true -Name <app-name> -ResourceGroupName <group-name>
関数の場合
Update-AzFunctionApp -IdentityType
コマンドを実行して、関数アプリのシステム割り当て ID を作成します。
Update-AzFunctionApp -Name $functionAppName -ResourceGroupName $resourceGroupName -IdentityType SystemAssigned
Azure Resource Manager テンプレートを使って、Azure リソースのデプロイを自動化できます。 App Service および Functions へのデプロイについて詳しくは、「Automating resource deployment in App Service 」(App Service でのリソースのデプロイの自動化) および「Azure Functions の関数アプリのリソース デプロイを自動化 」をご覧ください。
種類が Microsoft.Web/sites
であるすべてのリソースは、リソース定義に次のプロパティを含めることにより、ID を使って作成できます。
"identity": {
"type": "SystemAssigned"
}
システム割り当てタイプを追加すると、Azure に対してアプリケーション用の ID を作成して管理するように指示されます。
たとえば、Web アプリのテンプレートは次の JSON のようになります。
{
"apiVersion": "2016-08-01",
"type": "Microsoft.Web/sites",
"name": "[variables('appName')]",
"location": "[resourceGroup().location]",
"identity": {
"type": "SystemAssigned"
},
"properties": {
"name": "[variables('appName')]",
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
"hostingEnvironment": "",
"clientAffinityEnabled": false,
"alwaysOn": true
},
"dependsOn": [
"[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]"
]
}
作成されるサイトには、次の追加プロパティが設定されます。
"identity": {
"type": "SystemAssigned",
"tenantId": "<TENANTID>",
"principalId": "<PRINCIPALID>"
}
tenantId プロパティは、その ID が属する Azure AD テナントを示します。 principalId は、アプリケーションの新しい ID の一意識別子です。 Azure AD のサービス プリンシパル名は、お使いの App Service または Azure Functions のインスタンスに指定したものと同じです。
テンプレートの後の段階でこれらのプロパティを参照する必要がある場合は、次の例のように、'Full'
フラグを指定した reference()
テンプレート関数 を使用して行うことができます。
{
"tenantId": "[reference(resourceId('Microsoft.Web/sites', variables('appName')), '2018-02-01', 'Full').identity.tenantId]",
"objectId": "[reference(resourceId('Microsoft.Web/sites', variables('appName')), '2018-02-01', 'Full').identity.principalId]",
}
ユーザー割り当て ID を追加する
ユーザー割り当て ID を持つアプリを作成するには、ID を作成してから、そのリソース ID をアプリ構成に追加する必要があります。
最初に、ユーザー割り当て ID リソースを作成する必要があります。
以下の手順 に従って、ユーザー割り当てマネージド ID リソースを作成します。
アプリのページの左側のナビゲーションで、[設定] グループまで下にスクロールします。
[ID] を選択します。
[ユーザー割り当て済み] タブで [追加] をクリックします。
先ほど作成した ID を検索して選択します。 [追加] をクリックします。
重要
追加するユーザー割り当て ID を選択した後に [追加] を選択すると、アプリケーションが再起動します。
ユーザー割り当て ID を作成します。
az identity create --resource-group <group-name> --name <identity-name>
az webapp identity assign
コマンドを実行して、ID をアプリに割り当てます。
az webapp identity assign --resource-group <group-name> --name <app-name> --identities <identity-name>
App Service の場合
App Service でユーザー割り当て ID を追加することは、現在サポートされていません。
関数の場合
ユーザー割り当て ID を作成します。
Install-Module -Name Az.ManagedServiceIdentity -AllowPrerelease
$userAssignedIdentity = New-AzUserAssignedIdentity -Name $userAssignedIdentityName -ResourceGroupName <group-name>
Update-AzFunctionApp -IdentityType UserAssigned -IdentityId
コマンドを実行して、関数で ID を割り当てます。
Update-AzFunctionApp -Name <app-name> -ResourceGroupName <group-name> -IdentityType UserAssigned -IdentityId $userAssignedIdentity.Id
Azure Resource Manager テンプレートを使って、Azure リソースのデプロイを自動化できます。 App Service および Functions へのデプロイについて詳しくは、「Automating resource deployment in App Service 」(App Service でのリソースのデプロイの自動化) および「Azure Functions の関数アプリのリソース デプロイを自動化 」をご覧ください。
種類が Microsoft.Web/sites
であるリソースは、リソース定義に次のブロックを含めて、<RESOURCEID>
を目的の ID のリソース ID と置き換えることで、ID を使って作成できます。
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"<RESOURCEID>": {}
}
}
Note
アプリケーションは、システム割り当て ID とユーザー割り当て ID の両方を同時に持つことができます。 この場合、type
プロパティは SystemAssigned,UserAssigned
になります
ユーザー割り当ての型を追加すると、アプリケーションに対して指定されたユーザー割り当て ID を使用するように Azure に指示します。
たとえば、Web アプリのテンプレートは次の JSON のようになります。
{
"apiVersion": "2016-08-01",
"type": "Microsoft.Web/sites",
"name": "[variables('appName')]",
"location": "[resourceGroup().location]",
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName'))]": {}
}
},
"properties": {
"name": "[variables('appName')]",
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
"hostingEnvironment": "",
"clientAffinityEnabled": false,
"alwaysOn": true
},
"dependsOn": [
"[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
"[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName'))]"
]
}
作成されるサイトには、次の追加プロパティが設定されます。
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"<RESOURCEID>": {
"principalId": "<PRINCIPALID>",
"clientId": "<CLIENTID>"
}
}
}
principalId は、Azure AD の管理に使用される ID の一意識別子です。 clientId は、ランタイム呼び出し中に使用する ID を指定するために使用されるアプリケーションの新しい ID の一意識別子です。
アプリまたは関数からのアクセスを許可するようにターゲット リソースを構成する必要がある場合があります。 例えば、Key Vault にアクセスするためにトークンを要求 する場合、アプリや関数のマネージド ID を含むアクセス ポリシーも追加する必要があります。 それ以外の場合は、有効なトークンを使用する場合でも、Key Vault への呼び出しは拒否されます。 同じことが Azure SQL Database にも当てはまります。 Azure Active Directory トークンをサポートしているリソースの詳細については、「Azure AD 認証をサポートしている Azure サービス 」をご覧ください。
重要
マネージド ID のバックエンド サービスは、リソース URI ごとのキャッシュを約 24 時間保持します。 特定のターゲット リソースのアクセス ポリシーを更新し、そのリソースのトークンをすぐに取得した場合、そのトークンの有効期限が切れるまで、期限切れのアクセス許可を持つキャッシュされたトークンを取得し続ける可能性があります。 現在、トークンの更新を強制する方法はありません。
アプリ コードでの Azure サービスへの接続
アプリはマネージド ID を使用して、Azure SQL Database、Azure キー コンテナー、Azure ストレージなど、Azure Azure Active Directory によって保護されている Azure リソースのトークンを取得できます。 これらのトークンは、アプリケーションの特定のユーザーではなく、リソースにアクセスしているアプリケーションを表します。
App Service と Azure Functions は、トークン取得のために、内部でアクセス可能なRES Tエンドポイント を提供します。 REST エンドポイントは、標準の HTTP GET を使用してアプリ内からアクセスでき、すべての言語で汎用 HTTP クライアントを実装できます。 NET、JavaScript、Java、Python の場合、Azure ID クライアント ライブラリは、この REST エンドポイントを抽象化し、開発環境を簡素化します。 他の Azure サービスへの接続は、サービス固有のクライアントに資格情報オブジェクトを追加するのと同じくらい簡単です。
生の HTTP GET 要求は、次の例のようになります。
GET /MSI/token?resource=https://vault.azure.net&api-version=2019-08-01 HTTP/1.1
Host: localhost:4141
X-IDENTITY-HEADER: 853b9a84-5bfa-4b22-a3f3-0b9a43d9ad8a
応答の例は次のようになります。
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": "5E29463D-71DA-4FE0-8E69-999B57DB23B0"
}
この応答は、Azure AD のサービス間アクセス トークン要求に対する応答 と同じです。 Key Vault にアクセスするには、access_token
の値をコンテナーとのクライアント接続に追加します。
次のスクリプトを使用して、Azure サービスのリソース URI を指定してローカル エンドポイントからトークンを取得します。
$resourceURI = "https://<AAD-resource-URI-for-resource-to-obtain-token>"
$tokenAuthURI = $env:IDENTITY_ENDPOINT + "?resource=$resourceURI&api-version=2019-08-01"
$tokenResponse = Invoke-RestMethod -Method Get -Headers @{"X-IDENTITY-HEADER"="$env:IDENTITY_HEADER"} -Uri $tokenAuthURI
$accessToken = $tokenResponse.access_token
REST エンドポイントの詳細については、「REST エンドポイント リファレンス 」を参照してください。
ID を削除する
システム割り当て ID を削除すると、Azure Active Directory から削除されます。 また、アプリ リソース自体を削除すると、システム割り当て ID も Azure Active Directory から自動的に削除されます。
アプリのページの左側のナビゲーションで、[設定] グループまで下にスクロールします。
[ID] を選択します。 次に、ID の種類に基づいて、次の手順に従います。
システムに割り当てられた ID : [システム割り当て済み] タブで [状態] を [オフ] に切り替えます。 [保存] をクリックします。
ユーザーに割り当てられたID : [ユーザ割り当て済み] タブをクリックし、ID のチェックボックスを選択し、[削除] をクリックします。 [はい] をクリックして操作を確定します。
システム割り当て ID を削除するには、次の手順を実行します。
az webapp identity remove --name <app-name> --resource-group <group-name>
1 つ以上のユーザー割り当て ID を削除するには、次の手順を実行します。
az webapp identity remove --name <app-name> --resource-group <group-name> --identities <identity-name1>,<identity-name2>,...
また、--identities
で[system]
を指定して、システム割り当て ID を削除することもできます。
App Service の場合
App Service のシステム割り当て ID を削除するには、Set-AzWebApp -AssignIdentity
コマンドを実行します。
Set-AzWebApp -AssignIdentity $false -Name <app-name> -ResourceGroupName <group-name>
関数の場合
Azure PowerShell のすべての ID を削除するには (Azure Functions のみ) 次のようにします。
# Update an existing function app to have IdentityType "None".
Update-AzFunctionApp -Name $functionAppName -ResourceGroupName $resourceGroupName -IdentityType None
ARM テンプレートのすべての ID を削除するには、次のようにします。
"identity": {
"type": "None"
}
Note
また、単純にローカル トークン サービスを無効にする、設定可能なアプリケーション設定 WEBSITE_DISABLE_MSI もあります。 ただし、ID はその場所に残り、ツールには引き続きマネージド ID が "オン" または "有効" と表示されます。そのため、この設定の使用はお勧めしません。
REST エンドポイントの参照
マネージド ID を持つアプリは、次の 2 つの環境変数を定義することによってこのエンドポイントを使用できます。
IDENTITY_ENDPOINT - ローカル トークン サービスに対する URL。
IDENTITY_HEADER - サーバー側のリクエスト フォージェリ (SSRF) 攻撃を回避するために使用するヘッダー。 値は、プラットフォームによってローテーションされます。
IDENTITY_ENDPOINT は、お使いのアプリがトークンを要求するローカル URL です。 リソースのトークンを取得するには、次のパラメーターを指定して、このエンドポイントに HTTP GET 要求を行います。
パラメーター名
場所
説明
resource
クエリ
トークンを取得する必要のあるリソースの Azure AD リソース URI。 これは Azure AD 認証をサポートしている 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 のトークンを取得しようとします。
次の手順