チュートリアル:マネージド ID と .NET を使用して Key Vault を Azure Web アプリに接続するTutorial: Use a managed identity to connect Key Vault to an Azure Web App with .NET

Azure Key Vault は、資格情報やその他のシークレットを安全に保管する方法を提供しますが、コードで Key Vault に対して認証を行い、それらを取得する必要があります。Azure Key Vault provides a way to securely store credentials and other secrets, but your code needs to authenticate to Key Vault to retrieve them. Azure リソースのマネージド ID の概要に関するページは、Azure AD で自動的に管理されているマネージド ID を Azure サービスに付与することで、この問題を解決するうえで役立ちます。Managed identities for Azure resources overview helps to solve this problem by giving Azure services an automatically managed identity in Azure AD. この ID を使用して、コードに資格情報が表示されていなくても、Key Vault を含む Azure AD の認証をサポートする任意のサービスに認証することができます。You can use this identity to authenticate to any service that supports Azure AD authentication, including Key Vault, without having to display credentials in your code.

このチュートリアルでは、マネージド ID と Azure Key Vault を使用して Azure Web アプリを認証します。This tutorial uses a managed identity to authenticate an Azure Web App with an Azure Key Vault. この手順では、.NET 用 Azure Key Vault v4 クライアント ライブラリAzure CLI を使用していますが、各種の開発言語や Azure PowerShell、Azure portal を使用している場合でも、基本的な原則は同じです。Although the steps use the Azure Key Vault v4 client library for .NET and the Azure CLI, the same basic principles apply when using the development language of your choice, Azure PowerShell, and/or the Azure portal.

前提条件Prerequisites

このクイック スタートを完了するには、以下が必要です。To complete this quickstart:

リソース グループを作成するCreate a resource group

リソース グループとは、Azure リソースのデプロイと管理に使用する論理コンテナーです。A resource group is a logical container into which Azure resources are deployed and managed. キー コンテナーと Web アプリの配置先となるリソース グループを az group create コマンドで作成します。Create a resource group to house both your key vault and your web app with the az group create command:

az group create --name "myResourceGroup" -l "EastUS"

キー コンテナーを設定するSet up your key vault

キー コンテナーを作成し、このチュートリアルで後から使用するシークレットをそこに格納します。You will now create a key vault and place a secret in it, for use later in this tutorial.

キー コンテナーを作成するには、az keyvault create コマンドを使用します。To create a key vault, use the az keyvault create command:

重要

各キー コンテナーには一意の名前が必要です。Each key vault must have a unique name. 次の例の は、お使いのキー コンテナーの名前に置き換えてください。Replace with the name of your key vault in the following examples.

az keyvault create --name "<your-keyvault-name>" -g "myResourceGroup"

"https://.vault.azure.net/" 形式で返される vaultUri を書き留めます。Make a note of the returned vaultUri, which will be in the format"https://.vault.azure.net/". コードを更新する」の手順で使用します。It will be used in the Update the code step.

これで az keyvault secret set コマンドを使用して、キー コンテナーにシークレットを格納できます。You can now place a secret in your key vault with the az keyvault secret set command. シークレットの名前は "MySecret" に、値は "Success!" に設定してください。Set the name of your secret to "MySecret" and the value to "Success!".

az keyvault secret set --vault-name "<your-keyvault-name>" --name "MySecret" --value "Success!"

.NET Web アプリを作成するCreate a .NET web app

ローカル アプリを作成するCreate a local app

コンピューターのターミナル ウィンドウで、akvwebapp という名前のディレクトリを作成し、現在のディレクトリをそのディレクトリに変更します。In a terminal window on your machine, create a directory named akvwebapp and change the current directory to it.

mkdir akvwebapp
cd akvwebapp

次に、dotnet new web コマンドを使用して新しい .NET Core アプリを作成します。Now create a new .NET Core app with the dotnet new web command:

dotnet new web

アプリケーションをローカルで実行すると、アプリケーションを Azure にデプロイするとどう表示されるかを把握できます。Run the application locally so that you see how it should look when you deploy it to Azure.

dotnet run

Web ブラウザーを開き、http://localhost:5000 のアプリに移動します。Open a web browser, and navigate to the app at http://localhost:5000.

ページに表示されているサンプル アプリの Hello World メッセージが表示されます。You will see the Hello World message from the sample app displayed in the page.

Git リポジトリを初期化するInitialize the Git repository

ターミナル ウィンドウで Ctrl + C キーを押して、Web サーバーを終了します。In your terminal window, press Ctrl+C to exit the web server. .NET Core プロジェクト用の Git リポジトリを初期化します。Initialize a Git repository for the .NET Core project.

git init
git add .
git commit -m "first commit"

デプロイ ユーザーを構成するConfigure a deployment user

FTP およびローカルの Git では、"デプロイ ユーザー" を使用して Azure Web アプリにデプロイできます。FTP and local Git can deploy to an Azure web app by using a deployment user. デプロイ ユーザーを構成すると、すべての Azure デプロイでこのユーザーを使用できます。Once you configure your deployment user, you can use it for all your Azure deployments. アカウントレベルのデプロイのユーザー名とパスワードは、Azure サブスクリプションの資格情報とは異なります。Your account-level deployment username and password are different from your Azure subscription credentials.

デプロイ ユーザーを構成するには、az webapp deployment user set コマンドを実行します。To configure the deployment user, run the az webapp deployment user set command. 次のガイドラインに準拠したユーザー名とパスワードを選択してください。Choose a username and password that adheres to these guidelines:

  • ユーザー名は、Azure 内で一意である必要があり、ローカル Git プッシュの場合は "@" シンボルを含めることはできません。The username must be unique within Azure, and for local Git pushes, must not contain the ‘@’ symbol.
  • パスワードは長さが 8 文字以上で、文字、数字、記号のうち 2 つを含む必要があります。The password must be at least eight characters long, with two of the following three elements: letters, numbers, and symbols.
az webapp deployment user set --user-name "<username>" --password "<password>"

JSON 出力には、パスワードが null として表示されます。The JSON output shows the password as null. 'Conflict'. Details: 409 エラーが発生した場合は、ユーザー名を変更します。If you get a 'Conflict'. Details: 409 error, change the username. 'Bad Request'. Details: 400 エラーが発生した場合は、より強力なパスワードを使用します。If you get a 'Bad Request'. Details: 400 error, use a stronger password.

Web アプリのデプロイに使用するユーザー名とパスワードを記録します。Record your username and password to use to deploy your web apps.

App Service プランを作成するCreate an app service plan

Azure CLI の az appservice plan create コマンドで、App Service プランを作成します。Create an App Service plan with the Azure CLI az appservice plan create command. 次の例では、Free 価格レベルの myAppServicePlan という名前の App Service プランを作成します。This following example creates an App Service plan named myAppServicePlan in the Free pricing tier:

az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku FREE

App Service プランが作成されると、Azure CLI によって、次の例のような情報が表示されます。When the App Service plan has been created, the Azure CLI shows information similar to the following example:

{ 
  "adminSiteName": null,
  "appServicePlanName": "myAppServicePlan",
  "geoRegion": "West Europe",
  "hostingEnvironmentProfile": null,
  "id": "/subscriptions/0000-0000/resourceGroups/myResourceGroup/providers/Microsoft.Web/serverfarms/myAppServicePlan",
  "kind": "app",
  "location": "West Europe",
  "maximumNumberOfWorkers": 1,
  "name": "myAppServicePlan",
  < JSON data removed for brevity. >
  "targetWorkerSizeId": 0,
  "type": "Microsoft.Web/serverfarms",
  "workerTierName": null
} 

リモート Web アプリを作成するCreate a remote web app

myAppServicePlan App Service プランに Azure Web アプリを作成します。Create an Azure web app in the myAppServicePlan App Service plan.

重要

Key Vault と同様、Azure Web アプリにも一意の名前を付ける必要があります。Similar to Key Vault, an Azure Web App must have a unique name. 次の例の <your-webapp-name> は、お使いの Web アプリの名前に置き換えてください。Replace <your-webapp-name> with the name of your web app the following examples.

az webapp create --resource-group "myResourceGroup" --plan "myAppServicePlan" --name "<your-webapp-name>" --deployment-local-git

Web アプリが作成されると、Azure CLI によって次の例のような出力が表示されます。When the web app has been created, the Azure CLI shows output similar to the following example:

Local git is configured with url of 'https://<username>@<your-webapp-name>.scm.azurewebsites.net/<ayour-webapp-name>.git'
{
  "availabilityState": "Normal",
  "clientAffinityEnabled": true,
  "clientCertEnabled": false,
  "clientCertExclusionPaths": null,
  "cloningInfo": null,
  "containerSize": 0,
  "dailyMemoryTimeQuota": 0,
  "defaultHostName": "<your-webapp-name>.azurewebsites.net",
  "deploymentLocalGitUrl": "https://<username>@<your-webapp-name>.scm.azurewebsites.net/<your-webapp-name>.git",
  "enabled": true,
  < JSON data removed for brevity. >
}

Git リモートの URL は deploymentLocalGitUrl プロパティに https://<username>@<your-webapp-name>.scm.azurewebsites.net/<your-webapp-name>.git 形式で出力されます。The URL of the Git remote is shown in the deploymentLocalGitUrl property, with the format https://<username>@<your-webapp-name>.scm.azurewebsites.net/<your-webapp-name>.git. この URL は後で必要になるので保存しておいてください。Save this URL, as you need it later.

新しく作成されたアプリに移動します。Browse to your newly created app. <your-webapp-name> は、お使いのアプリの名前に置き換えてください。Replace <your-webapp-name> with your app name.

https://<your-webapp-name>.azurewebsites.net

新しく作成した Azure Web アプリの既定の Web ページが表示されます。You will see the default webpage for a newly created Azure Web App.

ローカル アプリをデプロイするDeploy your local app

ローカルのターミナル ウィンドウに戻り、Azure リモートをローカル Git リポジトリに追加します。 <deploymentLocalGitUrl-from-create-step> は、「リモート Web アプリを作成する」の手順で保存した Git リモートの URL に置き換えてください。Back in the local terminal window, add an Azure remote to your local Git repository, replacing <deploymentLocalGitUrl-from-create-step> with the URL of the Git remote that you saved from Create a remote web app step.

git remote add azure <deploymentLocalGitUrl-from-create-step>

アプリをデプロイするために、次のコマンドで Azure リモートにプッシュします。Push to the Azure remote to deploy your app with the following command. Git Credential Manager によって資格情報の入力を求めるメッセージが表示されたら、「デプロイ ユーザーを構成する」の手順で作成した資格情報を使用してください。When Git Credential Manager prompts you for credentials, use the credentials you created in Configure a deployment user step.

git push azure master

このコマンドの実行には、数分かかる場合があります。This command may take a few minutes to run. 実行中、次の例のような情報が表示されます。While running, it displays information similar to the following example:

Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 285 bytes | 95.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Deploy Async
remote: Updating branch 'master'.
remote: Updating submodules.
remote: Preparing deployment for commit id 'd6b54472f7'.
remote: Repository path is /home/site/repository
remote: Running oryx build...
remote: Build orchestrated by Microsoft Oryx, https://github.com/Microsoft/Oryx
remote: You can report issues at https://github.com/Microsoft/Oryx/issues
remote:
remote: Oryx Version      : 0.2.20200114.13, Commit: 204922f30f8e8d41f5241b8c218425ef89106d1d, ReleaseTagName: 20200114.13
remote: Build Operation ID: |imoMY2y77/s=.40ca2a87_
remote: Repository Commit : d6b54472f7e8e9fd885ffafaa64522e74cf370e1
.
.
.
remote: Deployment successful.
remote: Deployment Logs : 'https://<your-webapp-name>.scm.azurewebsites.net/newui/jsonviewer?view_url=/api/deployments/d6b54472f7e8e9fd885ffafaa64522e74cf370e1/log'
To https://<your-webapp-name>.scm.azurewebsites.net:443/<your-webapp-name>.git
   d87e6ca..d6b5447  master -> master

Web ブラウザーを使用して、デプロイされたアプリケーションにアクセス (またはブラウザーを最新の情報に更新) します。Browse to (or refresh) the deployed application using your web browser.

http://<your-webapp-name>.azurewebsites.net

先ほど にアクセスしたときに表示された "Hello World!"You will see the "Hello World!" というメッセージが表示されます。message you previously saw when visiting http://localhost:5000.

マネージド ID を作成して割り当てるCreate and assign a managed identity

このアプリケーションの ID を作成するために、Azure CLI で az webapp-identity assign コマンドを実行します。In the Azure CLI, to create the identity for this application, run the az webapp-identity assign command:

az webapp identity assign --name "<your-webapp-name>" --resource-group "myResourceGroup"

この操作からは、次の JSON スニペットが返されます。The operation will return this JSON snippet:

{
  "principalId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "tenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "type": "SystemAssigned"
}

キー コンテナーに対する get 操作と list 操作のアクセス許可を Web アプリに与えるため、Azure CLI の az keyvault set-policy コマンドに principalID を渡します。To give your web app permission to do get and list operations on your key vault, pass the principalID to the Azure CLI az keyvault set-policy command:

az keyvault set-policy --name "<your-keyvault-name>" --object-id "<principalId>" --secret-permissions get list

キー コンテナーにアクセスするようアプリを変更するModify the app to access your key vault

パッケージのインストールInstall the packages

ターミナル ウィンドウから、.NET 用 Azure Key Vault クライアント ライブラリ パッケージをインストールします。From the terminal window, install the Azure Key Vault client library for .NET packages:

dotnet add package Azure.Identity
dotnet add package Azure.Security.KeyVault.Secrets

コードを更新するUpdate the code

akvwebapp プロジェクトから Startup.cs ファイルを見つけて開きます。Find and open the Startup.cs file in your akvwebapp project.

ヘッダーに次の 2 行を追加します。Add these two lines to the header:

using Azure.Identity;
using Azure.Security.KeyVault.Secrets;

app.UseEndpoints 呼び出しの前に以下の行を追加します。URI は、実際のキー コンテナーの vaultUri に合わせて更新してください。Add these lines before the app.UseEndpoints call, updating the URI to reflect the vaultUri of your key vault. 以下のコードでは、キー コンテナーに対する認証に "DefaultAzureCredential()" が使用されています。この場合、アプリケーションのマネージド ID からのトークンが認証に使用されます。Below code is using 'DefaultAzureCredential()' for authentication to key vault, which is using token from application managed identity to authenticate. また、キー コンテナーがスロットルされている場合の再試行にはエクスポネンシャル バックオフが使用されています。It is also using exponential backoff for retries in case of key vault is being throttled.

SecretClientOptions options = new SecretClientOptions()
    {
        Retry =
        {
            Delay= TimeSpan.FromSeconds(2),
            MaxDelay = TimeSpan.FromSeconds(16),
            MaxRetries = 5,
            Mode = RetryMode.Exponential
         }
    };
var client = new SecretClient(new Uri("https://<your-unique-key-vault-name>.vault.azure.net/"), new DefaultAzureCredential(),options);

KeyVaultSecret secret = client.GetSecret("mySecret");

string secretValue = secret.Value;

await context.Response.WriteAsync("Hello World!"); という行を次のように更新します。Update the line await context.Response.WriteAsync("Hello World!"); to read:

await context.Response.WriteAsync(secretValue);

次の手順に進む前に、必ず変更内容を保存してください。Be certain to save your changes before proceeding to the next step.

Web アプリを再デプロイするRedeploy your web app

コードを更新したら、次の Git コマンドを使用して、そのコードを Azure に再デプロイすることができます。Having updated your code, you can redeploy it to Azure with the following Git commands:

git add .
git commit -m "Updated web app to access my key vault"
git push azure master

完成した Web アプリにアクセスするVisit your completed web app

http://<your-webapp-name>.azurewebsites.net

Hello World が表示される前に、シークレットの値が表示されるはずです。成功ですWhere before you saw Hello World, you should now see the value of your secret displayed: Success!

次のステップNext steps