Azure CLI コマンドは、 Azure Cloud Shell または Azure CLI がインストールされたローカル コンピューターで実行できます。
重要
次の理由から、このチュートリアルのすべての CLI ベースの手順に Azure Cloud Shell を使用することをお勧めします。
- ログインの問題を回避するため、Azure アカウントで事前認証が行われます
- 必要なすべての Azure CLI 拡張機能をすぐに使用できます
- ローカル OS または環境に関係なく、一貫した動作を保証します
- ローカル インストールは必要ありません。管理者権限のないユーザーに最適
- ポータルから Azure サービスに直接アクセスできます。ローカルの Docker またはネットワークのセットアップは必要ありません
- ローカル ファイアウォールまたはネットワーク構成の問題を回避する
RBAC 承認を使用して Key Vault を作成する
Azure Key Vault は、シークレット、API キー、接続文字列、証明書を格納するためのセキュリティで保護されたサービスです。 このスクリプトでは、 MongoDB 接続文字列 と Web アプリの SECRET_KEY
を格納します。
Key Vault は、 ロールベースのアクセス制御 (RBAC) を使用して、従来のアクセス ポリシーではなく Azure ロールを介してアクセスを管理するように構成されています。 Web アプリは 、システム割り当てマネージド ID を 使用して、実行時にシークレットを安全に取得します。
手記
Key Vault を早期に作成すると、シークレットへのアクセスを試みる前にロールを割り当てることができます。 また、ロールの割り当ての伝達の遅延を回避するのにも役立ちます。 Key Vault は App Service に依存しないため、事前にプロビジョニングすることで信頼性とシーケンス処理が向上します。
この手順では、 az keyvault create コマンドを使用して、RBAC が有効な Azure Key Vault を作成します。
#!/bin/bash
RESOURCE_GROUP_NAME="msdocs-web-app-rg"
LOCATION="westus"
KEYVAULT_NAME="${RESOURCE_GROUP_NAME}-kv"
az keyvault create \
--name "$KEYVAULT_NAME" \
--resource-group "$RESOURCE_GROUP_NAME" \
--___location "$LOCATION" \
--enable-rbac-authorization true
# PowerShell syntax
$RESOURCE_GROUP_NAME="msdocs-web-app-rg"
$LOCATION="westus"
$KEYVAULT_NAME="${RESOURCE_GROUP_NAME}-kv"
az keyvault create `
--name "$KEYVAULT_NAME" `
--resource-group "$RESOURCE_GROUP_NAME" `
--___location "$LOCATION" `
--enable-rbac-authorization true
App Service プランと Web アプリを作成する
App Service プランでは、Web アプリのコンピューティング リソース、価格レベル、リージョンを定義します。 Web アプリはコンテナー化されたアプリケーションを実行し、システム割り当てマネージド ID を使用してプロビジョニングされます。この ID は、Azure Container Registry (ACR) と Azure Key Vault に対して安全に認証するために使用されます。
この手順では、次のタスクを実行します。
- アプリサービス プランを作成する
- マネージド ID を使用して Web アプリを作成する
- 特定のコンテナー イメージを使用してデプロイするように Web アプリを構成する
- ACR を使用した継続的デプロイの準備
手記
マネージド ID はデプロイ時にのみ作成されるため、ACR または Key Vault へのアクセスを割り当てる前に Web アプリを作成する必要があります。
また、作成時にコンテナー イメージを割り当てると、意図した構成でアプリが正しく起動します。
この手順では、 az appservice plan create コマンドを使用して、アプリのコンピューティング環境をプロビジョニングします。
#!/bin/bash
APP_SERVICE_PLAN_NAME="msdocs-web-app-plan"
az appservice plan create \
--name "$APP_SERVICE_PLAN_NAME" \
--resource-group "$RESOURCE_GROUP_NAME" \
--sku B1 \
--is-linux
# PowerShell syntax
$APP_SERVICE_PLAN_NAME="msdocs-web-app-plan"
az appservice plan create `
--name "$APP_SERVICE_PLAN_NAME" `
--resource-group "$RESOURCE_GROUP_NAME" `
--sku B1 `
--is-linux
この手順では、 az webapp create コマンドを使用して Web アプリを作成します。 このコマンドでは、 システム割り当てマネージド ID も 有効にし、アプリが実行するコンテナー イメージを設定します。
#!/bin/bash
APP_SERVICE_NAME="msdocs-website-name" #APP_SERVICE_NAME must be globally unique as it becomes the website name in the URL `https://<website-name>.azurewebsites.net`.
# Use the same registry name as in part 2 of this tutorial series.
REGISTRY_NAME="msdocscontainerregistryname" #REGISTRY_NAME is the registry name you used in part 2 of this tutorial.
CONTAINER_NAME="$REGISTRY_NAME.azurecr.io/msdocspythoncontainerwebapp:latest" #CONTAINER_NAME is of the form "yourregistryname.azurecr.io/repo_name:tag".
az webapp create \
--resource-group "$RESOURCE_GROUP_NAME" \
--plan "$APP_SERVICE_PLAN_NAME" \
--name "$APP_SERVICE_NAME" \
--assign-identity '[system]' \
--deployment-container-image-name "$CONTAINER_NAME"
# Powershell syntax
$APP_SERVICE_NAME="msdocs-website-name"
# Use the same rregistry name as in part 2 of this tutorial series.
$REGISTRY_NAME="msdocscontainerregistryname"
$CONTAINER_NAME = "$REGISTRY_NAME.azurecr.io/msdocspythoncontainerwebapp:latest"
az webapp create `
--resource-group "$RESOURCE_GROUP_NAME" `
--plan "$APP_SERVICE_PLAN_NAME" `
--name "$APP_SERVICE_NAME" `
--assign-identity '[system]' `
--deployment-container-image-name "$CONTAINER_NAME"
手記
このコマンドを実行すると、次のエラーが表示されることがあります。
No credential was provided to access Azure Container Registry. Trying to look up...
Retrieving credentials failed with an exception:'Failed to retrieve container registry credentials. Please either provide the credentials or run 'az acr update -n msdocscontainerregistryname --admin-enabled true' to enable admin first.'
このエラーは、Web アプリが管理者資格情報を使用して ACR にアクセスしようとしたために発生します。この資格情報は既定で無効になっています。 このメッセージは無視しても問題はありません。次の手順では、マネージド ID を使用して ACR で認証するように Web アプリを構成します。
ログインユーザーにシークレットオフィサーロールを付与する
Azure Key Vault にシークレットを格納するには、スクリプトを実行するユーザーに Key Vault シークレット責任者 ロールが必要です。 この役割により、ボールト内でシークレットを作成および管理できます。
この手順では、スクリプトによって、現在ログインしているユーザーにそのロールが割り当てられます。 このユーザーは、MongoDB 接続文字列やアプリの SECRET_KEY
などのアプリケーション シークレットを安全に格納できます。
このロールの割り当ては、2 つの Key Vault に関連するロールの割り当ての最初です。 その後、Web アプリのシステム割り当てマネージド ID に、ボールトからシークレットを取得するためのアクセス権が付与されます。
Azure RBAC を使用すると、ID に基づいて安全で監査可能なアクセスが保証され、ハードコーディングされた資格情報が不要になります。
手記
キー コンテナーにシークレットを格納する前に、ユーザーに Key Vault シークレットオフィサー ロールを割り当てる必要があります。
この割り当ては、Key Vault をスコープにした az role assignment create コマンドを使用して行われます。
この手順では、 az role assignment create コマンドを使用して、Key Vault スコープでロールを割り当てます。
#!/bin/bash
CALLER_ID=$(az ad signed-in-user show --query id -o tsv)
echo $CALLER_ID # Verify this value retrieved successfully. In production, poll to verify this value is retrieved successfully.
az role assignment create \
--role "Key Vault Secrets Officer" \
--assignee "$CALLER_ID" \
--scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME"
# PowerShell syntax
$CALLER_ID=$(az ad signed-in-user show --query id -o tsv)
echo $CALLER_ID # Verify this value retrieved successfully. In production, poll to verify this value is retrieved successfully.
az role assignment create `
--role "Key Vault Secrets Officer" `
--assignee "$CALLER_ID" `
--scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME"
マネージド ID を使用して ACR への Web アクセスを許可する
Azure Container Registry (ACR) からイメージを安全にプルするには、 システム割り当てマネージド ID を使用するように Web アプリを構成する必要があります。 マネージド ID を使用すると、管理者の資格情報が不要になり、セキュリティで保護された資格情報のないデプロイがサポートされます。
このプロセスには、次の 2 つの主要なアクションが含まれます。
- ACR にアクセスするときに Web アプリがマネージド ID を使用できるようにする
- ターゲット ACR のその ID に AcrPull ロールを割り当てる
この手順では、az webapp identity show コマンドを使用して、Web アプリのマネージド ID のプリンシパル ID (一意のオブジェクト ID) を取得します。 次に、acrUseManagedIdentityCreds
を使用して true
プロパティをに設定することで、ACR 認証のマネージド ID の使用を有効にします。 次に、az role assignment create コマンドを使用して、AcrPull ロールを Web アプリのマネージド ID に割り当てます。 このロールは、レジストリからイメージをプルするアクセス許可を Web アプリに付与します。
#!/bin/bash
PRINCIPAL_ID=$(az webapp identity show \
--name "$APP_SERVICE_NAME" \
--resource-group "$RESOURCE_GROUP_NAME" \
--query principalId \
-o tsv)
echo $PRINCIPAL_ID # Verify this value retrieved successfully. In production, poll for successful 'AcrPull' role assignment using `az role assignment list`.
az webapp config set \
--resource-group "$RESOURCE_GROUP_NAME" \
--name "$APP_SERVICE_NAME" \
--generic-configurations '{"acrUseManagedIdentityCreds": true}'
az role assignment create \
--role "AcrPull" \
--assignee "$PRINCIPAL_ID" \
--scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.ContainerRegistry/registries/$REGISTRY_NAME"
# PowerShell syntax
$PRINCIPAL_ID=$(az webapp identity show `
--name "$APP_SERVICE_NAME" `
--resource-group "$RESOURCE_GROUP_NAME" `
--query principalId `
-o tsv)
echo $PRINCIPAL_ID # Verify this value retrieved successfully. In production, poll for successful AcrPull role assignment using `az role assignment list`.
az webapp config set `
--resource-group "$RESOURCE_GROUP_NAME" `
--name "$APP_SERVICE_NAME" `
--generic-configurations '{ "acrUseManagedIdentityCreds": true }'
az role assignment create `
--role "AcrPull" `
--assignee "$PRINCIPAL_ID" `
--scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.ContainerRegistry/registries/$REGISTRY_NAME"
Web アプリのマネージド ID にキーボールトへのアクセス権を付与する
Web アプリには、MongoDB 接続文字列や SECRET_KEY
などのシークレットにアクセスするためのアクセス許可が必要です。 これらのアクセス許可を付与するには、 Key Vault シークレット ユーザー ロールを Web アプリの システム割り当てマネージド ID に割り当てる必要があります。
この手順では、Web アプリのシステム割り当てマネージド ID の一意識別子 (プリンシパル ID) を使用して、az role assignment create コマンドを使用して、Key Vault シークレット ユーザー ロールを持つ Key Vault へのアクセス権を Web アプリに付与します。
#!/bin/bash
az role assignment create \
--role "Key Vault Secrets User" \
--assignee "$PRINCIPAL_ID" \
--scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME"
# PowerShell syntax
az role assignment create `
--role "Key Vault Secrets User" `
--assignee "$PRINCIPAL_ID"`
--scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME"
Key Vault にシークレットを格納する
アプリケーションでのシークレットのハードコーディングを回避するために、この手順では 、MongoDB 接続文字列 と Web アプリの シークレット キー を Azure Key Vault に格納します。 これらのシークレットは、コードまたは構成に資格情報を格納する必要なく、実行時にマネージド ID を介して Web アプリによって安全にアクセスできます。
手記
このチュートリアルでは、接続文字列とシークレット キーのみをキー コンテナーに格納しますが、必要に応じて、MongoDB データベース名やコレクション名などの他のアプリケーション設定を Key Vault に格納することもできます。
この手順では、 az cosmosdb keys list コマンドを使用して MongoDB 接続文字列を取得します。 次に、 az keyvault secret set コマンドを使用して、接続文字列とランダムに生成されたシークレット キーの両方を Key Vault に格納します。
#!/bin/bash
ACCOUNT_NAME="msdocs-cosmos-db-account-name"
MONGO_CONNECTION_STRING=$(az cosmosdb keys list \
--name "$ACCOUNT_NAME" \
--resource-group "$RESOURCE_GROUP_NAME" \
--type connection-strings \
--query "connectionStrings[?description=='Primary MongoDB Connection String'].connectionString" -o tsv)
SECRET_KEY=$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9')
# This key is cryptographically secure, using OpenSSL’s strong random number generator.
az keyvault secret set \
--vault-name "$KEYVAULT_NAME" \
--name "MongoConnectionString" \
--value "$MONGO_CONNECTION_STRING"
az keyvault secret set \
--vault-name "$KEYVAULT_NAME" \
--name "MongoSecretKey" \
--value "$SECRET_KEY"
# PowerShell syntax
$ACCOUNT_NAME="msdocs-cosmos-db-account-name"
$MONGO_CONNECTION_STRING = az cosmosdb keys list `
--name $ACCOUNT_NAME `
--resource-group $RESOURCE_GROUP_NAME `
--type connection-strings `
--query "connectionStrings[?description=='Primary MongoDB Connection String'].connectionString" `
-o tsv
# Generate a 32-byte cryptographically secure random value
$bytes = New-Object 'Byte[]' 32
[System.Security.Cryptography.RandomNumberGenerator]::Create().GetBytes($bytes)
# Convert to base64 and filter to alphanumeric characters only
$base64 = [Convert]::ToBase64String($bytes)
$alphanumeric = $base64 -replace '[^a-zA-Z0-9]', ''
# Truncate to 50 characters
$SECRET_KEY = $alphanumeric.Substring(0, [Math]::Min(50, $alphanumeric.Length))
az keyvault secret set `
--vault-name "$KEYVAULT_NAME" `
--name "MongoConnectionString" `
--value "$MONGO_CONNECTION_STRING"
az keyvault secret set `
--vault-name "$KEYVAULT_NAME" `
--name "MongoSecretKey" `
--value "$SECRET_KEY"
実行時にシークレットに安全にアクセスするには、Azure Key Vault に格納されているシークレットを参照するように Web アプリを構成する必要があります。 この手順は、 Key Vault 参照を使用して行われます。これにより、 システム割り当てマネージド ID を通じてシークレット値がアプリの環境に挿入されます。
この方法では、シークレットのハードコーディングを回避し、実行中に MongoDB 接続文字列やシークレット キーなどの機密値をアプリで安全に取得できます。
この手順では、 az webapp config appsettings set コマンドを 使用して、Key Vault シークレットを参照するアプリケーション設定を追加します。 具体的には、Key Vault に格納されている対応するシークレットを参照するように、 MongoConnectionString
と MongoSecretKey
のアプリ設定を設定します。
#!/bin/bash
MONGODB_NAME="restaurants_reviews"
MONGODB_COLLECTION_NAME="restaurants_reviews"
az webapp config appsettings set \
--resource-group "$RESOURCE_GROUP_NAME" \
--name "$APP_SERVICE_NAME" \
--settings \
CONNECTION_STRING="@Microsoft.KeyVault(SecretUri=https://$KEYVAULT_NAME.vault.azure.net/secrets/MongoConnectionString)" \
SECRET_KEY="@Microsoft.KeyVault(SecretUri=https://$KEYVAULT_NAME.vault.azure.net/secrets/MongoSecretKey)" \
DB_NAME="$MONGODB_NAME" \
COLLECTION_NAME="$MONGODB_COLLECTION_NAME"
# PowerShell syntax
$MONGO_DB_NAME="restaurants_reviews"
$MONGO_COLLECTION_NAME="restaurants_reviews"
az webapp config appsettings set `
--resource-group $RESOURCE_GROUP_NAME `
--name $APP_SERVICE_NAME `
--settings `
CONNECTION_STRING="@Microsoft.KeyVault(SecretUri=https://$KEYVAULT_NAME.vault.azure.net/secrets/MongoConnectionString)" `
SECRET_KEY="@Microsoft.KeyVault(SecretUri=https://$KEYVAULT_NAME.vault.azure.net/secrets/MongoSecretKey)" `
DB_NAME=$MONGODB_NAME `
COLLECTION_NAME=$MONGODB_COLLECTION_NAME
ACR からの継続的デプロイを有効にする
継続的デプロイを有効にすると、Web アプリは、Azure Container Registry (ACR) にプッシュされるたびに、最新のコンテナー イメージを自動的にプルして実行できます。 これにより、手動デプロイの手順が減り、アプリが最新の状態に保たれるようにします。
手記
次の手順では、ACR に Webhook を登録して、新しいイメージがプッシュされたときに Web アプリに通知します。
この手順では、 az webapp deployment container config コマンドを使用して、ACR から Web アプリへの継続的デプロイを有効にします。
#!/bin/bash
az webapp deployment container config \
--name "$APP_SERVICE_NAME" \
--resource-group "$RESOURCE_GROUP_NAME" \
--enable-cd true
# PowerShell syntax
az webapp deployment container config `
--name "$APP_SERVICE_NAME" `
--resource-group "$RESOURCE_GROUP_NAME" `
--enable-cd true
継続的デプロイ用に ACR Webhook を登録する
デプロイを自動化するには、新しいコンテナー イメージがプッシュされるたびに Web アプリに通知する Webhook を Azure Container Registry (ACR) に登録します。 Webhook を使用すると、アプリは自動的に最新バージョンをプルして実行できます。
Azure Container Registry (ACR) で構成された webhook は、新しいイメージが msdocspythoncontainerwebapp リポジトリにプッシュされるたびに、Web アプリの SCM エンドポイント (SERVICE_URI) に POST 要求を送信します。 このアクションにより、Web アプリが更新されたイメージをプルしてデプロイし、ACR と Azure App Service の間の継続的デプロイ パイプラインが完了します。
手記
Webhook URI は、次の形式に従う必要があります。
https://<app-name>.scm.azurewebsites.net/api/registry/webhook
/api/registry/webhook
。 URI エラーが発生した場合は、パスが正しいことを確認します。
この手順では、 az acr webhook create コマンドを使用して webhook を登録し、 push
イベントでトリガーするように構成します。
#!/bin/bash
CREDENTIAL=$(az webapp deployment list-publishing-credentials \
--resource-group "$RESOURCE_GROUP_NAME" \
--name "$APP_SERVICE_NAME" \
--query publishingPassword --output tsv)
# Web app publishing credentials may not be available immediately. In production, poll until non-empty.
SERVICE_URI="https://$APP_SERVICE_NAME:$CREDENTIAL@$APP_SERVICE_NAME.scm.azurewebsites.net/api/registry/webhook"
az acr webhook create \
--name webhookforwebapp \
--registry "$REGISTRY_NAME" \
--scope msdocspythoncontainerwebapp:* \
--uri "$SERVICE_URI" \
--actions push
# PowerShell syntax
$CREDENTIAL=$(az webapp deployment list-publishing-credentials `
--resource-group "$RESOURCE_GROUP_NAME" `
--name "$APP_SERVICE_NAME" `
--query publishingPassword --output tsv)
# Web app publishing credentials may not be available immediately. In production, poll until non-empty.
$SERVICE_URI = "https://$APP_SERVICE_NAME`:$CREDENTIAL@$APP_SERVICE_NAME.scm.azurewebsites.net/api/registry/webhook"
az acr webhook create `
--name webhookforwebapp `
--registry "$REGISTRY_NAME" `
--scope msdocspythoncontainerwebapp:* `
--uri "$SERVICE_URI" `
--actions push
サイトを参照する
Web アプリが実行されていることを確認するには、 https://<website-name>.azurewebsites.net
を開き、 <website-name>
を App Service の名前に置き換えます。 レストラン レビュー サンプル アプリが表示されます。 初めて読み込むには少し時間がかかる場合があります。
サイトが表示されたら、レストランを追加してレビューを送信して、アプリが正しく機能していることを確認します。
手記
az webapp browse
コマンドは Cloud Shell ではサポートされていません。 Cloud Shell を使用している場合は、ブラウザーを手動で開き、サイトの URL に移動します。
Azure CLI をローカルで使用している場合は、 az webapp browse コマンドを使用して、既定のブラウザーでサイトを開くことができます。
az webapp browse --name $APP_SERVICE_NAME --resource-group $RESOURCE_GROUP_NAME
手記
az webapp browse
コマンドは Cloud Shell ではサポートされていません。 ブラウザー ウィンドウを開き、代わりに Web サイトの URL に移動します。
Visual Studio Code の Docker 拡張機能を使用して、コンテナー化された Web アプリケーションをビルドして Azure App Service にデプロイできます。 この拡張機能により、アプリをパッケージ化してクラウドにプッシュするプロセスが効率化されます。 デプロイが完了したら、Azure Tools 拡張機能を使用して、MongoDB 接続文字列やアプリケーションの秘密鍵など、Web アプリの設定を構成します。
最初に、ハードコーディングされた値を使用してアプリを構成してテストし、MongoDB データベースへの接続が正常に開始されることを確認します。 アプリが動作することを確認したら、Azure CLI (ローカルまたは Cloud Shell) を使用して Azure Key Vault を作成します。 次に、VS Code でアプリを作成するユーザーに機密情報を格納するアクセス許可を付与し、MongoDB 接続文字列とアプリのシークレット キーを Key Vault シークレットとして格納します。
最後に、Visual Studio Code で、Key Vault に格納されているシークレットを参照するように Web アプリのアプリケーション設定を更新します。 アプリは、コードに直接埋め込まずに、構成値に安全にアクセスできるようになりました。
Web アプリを作成する
これらの手順では、VS Code 用の Docker 拡張機能 をインストールする必要があります。
Docker 拡張機能の Azure Container Registry を更新して、ビルドしたコンテナーが Docker 拡張機能の REGISTRIES セクションに表示されることを確認します。 表示されない場合は、レジストリ名を右クリックし、[更新] を選択します。
F1 キーまたは Ctrl+Shift+P キーを押してコマンド パレットを開き、「Docker Registries」と入力して、[Docker レジストリ: Azure App Service にイメージをデプロイ] タスクを選択します。
イメージをデプロイするように求められたら、次の値を入力します。
- レジストリ プロバイダーの選択: Azure
- サブスクリプション: 先ほど作成した Azure Container Registry を含むサブスクリプションを選択します。
- レジストリの選択: このチュートリアルで前に作成したレジストリの名前を入力します。
- リポジトリの選択: リポジトリ名 msdocscontainerregistryname を入力します。 このリポジトリが表示されない場合は、REGISTRIES セクション Docker 拡張機能を更新します。
-
最新のタグをイメージタグとして選択してください。
- Web アプリのグローバルに一意の名前を入力します。Azure App Service にグローバルに一意の名前を入力します。 たとえば、 msdocs-website-name を使用する場合、Web アプリの URL は
http://msdocs-website-name.azurewebsites.net
。
- リソース グループを選択する: 前に作成した Azure Container Registry を含むリソース グループを使用します。
- Linux App Service プランを選択する: 既存のものを使用するか、新しいプランを作成します。
デプロイの詳細については、OUTPUT ウィンドウを表示します。 出力行の 1 つは、App Service が ACR からイメージをプルするためのアクセス許可を付与することです。これは、App Service がマネージド ID を使用してレジストリにアクセスします。
MongoDB 情報を指定する必要があるため、最終的なサイト https://<app-name>.azurewebsites.net
はまだ準備ができていません。
手記
Visual Studio Code を使用してデプロイする場合、App Service がレジストリからイメージをプルするためのマネージド ID が既に設定されています。 マネージド ID が有効になっていることを確認するには、OUTPUT ウィンドウでログを表示し、「App Service が ACR からイメージをプルするためのアクセス許可を付与しています...」というメッセージを探します。
VS Code を使用したデプロイ中に、Web アプリが Azure Container Registry から新しいイメージをプルできるようにする Webhook が作成されます。
Azure portal で Webhook の構成を確認し、 サービス URI が "/api/registry/webhook" で終わることを確認します。 サービス URI を確認するには、VS Code で Docker 拡張機能を開き、作成したレジストリを見つけます。 レジストリを右クリックし、[ポータルで開く] 選択します。 コンテナー レジストリが Azure portal で開きます。 [ サービス ] をクリックし、[ Webhook] をクリックします。 コンテキスト メニューを開き、[ 構成] をクリックします。
サービス URI が "/api/registry/webhook" で終わることを確認します。 そうでない場合は、文字列の末尾に追加し、[保存] をクリックします。
この手順では、Web アプリケーションが MongoDB に接続するために必要な環境変数を指定します。
VS Code の Azure ビュー (Azure Tools 拡張機能から):
[リソース] を展開し、サブスクリプションの下にある [App Services] を見つけます。 (リソースの種類別 グループ化でリソースを表示していることを確認してください)。
App Services を展開し、作成した Web アプリを見つけます。
Web アプリを展開し、[アプリケーション設定]右クリックします。
新しい設定の追加を選択します。
新しい設定を追加するたびに、VS Code ウィンドウの上部にダイアログ ボックスが表示され、設定名の後に値を追加できます。 次の設定を追加します。
- CONNECTION_STRING: MongoDB 接続文字列。 このチュートリアルの後半では、この値を Azure Key Vault に格納する接続文字列に設定します。
- DB_NAME: restaurants_reviews
- COLLECTION_NAME: restaurants_reviews
- WEBSITES_PORT: Django の場合 は 8000 、Flask の 場合は 5000 。 この環境変数は、コンテナーがリッスンしているポートを指定します。
- SECRET_KEY: supersecretkeythatispassedtopythonapp。 この秘密鍵は、セッション データを暗号化するために Django と Flask によって使用されるランダムな文字列です。 このチュートリアルの後半では、この値を Azure Key Vault に格納するランダムな文字列に設定します。
ハードコーディングされた値を使用してサイトを参照する
VS Code の Azure ビュー (Azure Tools 拡張機能から):
[リソース] を展開し、サブスクリプションの下にある [App Services] を見つけます。 (リソースの種類別 グループ化でリソースを表示していることを確認してください)。
Web アプリを右クリックし、[ Web サイトの参照] を選択します。 Web サイトにエラーが表示された場合は、数分待ってからやり直してください。 Web アプリが起動するまでに数分かかる場合があります。
App Service のトラブルシューティングも参照してください。
RBAC 承認を使用して Key Vault を作成する
この手順では、 MongoDB 接続文字列 と Web アプリの SECRET_KEY
を格納する Azure Key Vault を作成します。 Azure Key Vault は、シークレット、API キー、接続文字列、証明書を格納するためのセキュリティで保護されたサービスです。 Key Vault は、 ロールベースのアクセス制御 (RBAC) を使用して、従来のアクセス ポリシーではなく Azure ロールを介してアクセスを管理するように構成されています。 Web アプリは 、システム割り当てマネージド ID を 使用して、実行時にシークレットを安全に取得します。
手記
Azure CLI または PowerShell を使用するように VS Code を構成できます。 VS Code で既定のシェルを選択するには、 F1 キーまたは Ctrl + Shift + P キー を押してコマンド パレットを開きます。 次に、「 ターミナル:既定のプロファイルを選択」と入力します。 コマンド パレットで、「 ターミナル: 既定のプロファイル 」と入力して選択し、目的の既定のシェルを選択します。
次の Azure CLI コマンドを実行して、新しい Key Vault を作成します。 このコマンドでは、bash または PowerShell を使用して、RBAC 承認が有効な Key Vault を作成します。
#!/bin/bash
RESOURCE_GROUP_NAME="msdocs-web-app-rg"
LOCATION="westus"
KEYVAULT_NAME="${RESOURCE_GROUP_NAME}-kv"
az keyvault create \
--name "$KEYVAULT_NAME" \
--resource-group "$RESOURCE_GROUP_NAME" \
--___location "$LOCATION" \
--enable-rbac-authorization true
# PowerShell syntax
$RESOURCE_GROUP_NAME="msdocs-web-app-rg"
$LOCATION="westus"
$KEYVAULT_NAME="${RESOURCE_GROUP_NAME}-kv"
az keyvault create `
--name "$KEYVAULT_NAME" `
--resource-group "$RESOURCE_GROUP_NAME" `
--___location "$LOCATION" `
--enable-rbac-authorization true
ログインユーザーにシークレットオフィサーロールを付与する
Azure Key Vault にシークレットを格納するには、スクリプトを実行するユーザーに Key Vault Secrets Officer ロールが付与されている必要があります。 このロールを使用すると、ユーザーはコンテナー内でシークレットを作成および管理できます。
この手順では、スクリプトによって現在ログインしているユーザーにそのロールが割り当てられ、MongoDB 接続文字列やアプリの SECRET_KEYなどの機密性の高いアプリケーション データを安全に格納できるようになります。
Azure Role-Based アクセス制御 (RBAC) を使用することで、このアプローチにより、ID に基づいて Key Vault への安全で監査可能なアクセスが保証されます。これにより、コードまたは構成ファイルに資格情報を直接埋め込む必要がなくなります。
手記
キー コンテナーにシークレットを格納する前に、ユーザーに Key Vault Secrets Officer ロールを割り当てる必要があります。
この割り当ては、Key Vault をスコープにした az role assignment create コマンドを使用して行われます。
この手順では、 az role assignment create コマンドを使用して、Key Vault スコープでロールを割り当てます。
#!/bin/bash
CALLER_ID=$(az ad signed-in-user show --query id -o tsv)
echo $CALLER_ID # Verify this value retrieved successfully. In production, poll to verify this value is retrieved successfully.
az role assignment create \
--role "Key Vault Secrets Officer" \
--assignee "$CALLER_ID" \
--scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME"
# PowerShell syntax
$CALLER_ID=$(az ad signed-in-user show --query id -o tsv)
echo $CALLER_ID # Verify this value retrieved successfully. In production, poll to verify this value is retrieved successfully.
az role assignment create `
--role "Key Vault Secrets Officer" `
--assignee "$CALLER_ID" `
--scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME"
Key Vault にシークレットを格納する
アプリケーションでのシークレットのハードコーディングを回避するために、この手順では、 MongoDB 接続文字列を MongoDB インスタンスに格納し、Web アプリの シークレット キー を Azure Key Vault に格納します。 これらのシークレットは、コードまたは構成に資格情報を格納する必要なく、実行時にマネージド ID を介して Web アプリによって安全にアクセスできます。
手記
このチュートリアルでは、接続文字列とシークレット キーのみをキー コンテナーに格納しますが、必要に応じて、MongoDB データベース名やコレクション名などの他のアプリケーション設定を Key Vault に格納することもできます。
この手順では、 az cosmosdb keys list コマンドを使用して MongoDB 接続文字列を取得します。 次に、 az keyvault secret set コマンドを使用して、接続文字列とランダムに生成されたシークレット キーの両方を Key Vault に格納します。
#!/bin/bash
ACCOUNT_NAME="msdocs-cosmos-db-account-name"
MONGO_CONNECTION_STRING=$(az cosmosdb keys list \
--name "$ACCOUNT_NAME" \
--resource-group "$RESOURCE_GROUP_NAME" \
--type connection-strings \
--query "connectionStrings[?description=='Primary MongoDB Connection String'].connectionString" -o tsv)
SECRET_KEY=$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9')
# This key is cryptographically secure, using OpenSSL’s strong random number generator.
az keyvault secret set \
--vault-name "$KEYVAULT_NAME" \
--name "MongoConnectionString" \
--value "$MONGO_CONNECTION_STRING"
az keyvault secret set \
--vault-name "$KEYVAULT_NAME" \
--name "MongoSecretKey" \
--value "$SECRET_KEY"
# PowerShell syntax
$ACCOUNT_NAME="msdocs-cosmos-db-account-name"
$MONGO_CONNECTION_STRING = az cosmosdb keys list `
--name $ACCOUNT_NAME `
--resource-group $RESOURCE_GROUP_NAME `
--type connection-strings `
--query "connectionStrings[?description=='Primary MongoDB Connection String'].connectionString" `
-o tsv
# Generate a 32-byte cryptographically secure random value
$bytes = New-Object 'Byte[]' 32
[System.Security.Cryptography.RandomNumberGenerator]::Create().GetBytes($bytes)
# Convert to base64 and filter to alphanumeric characters only
$base64 = [Convert]::ToBase64String($bytes)
$alphanumeric = $base64 -replace '[^a-zA-Z0-9]', ''
# Truncate to 50 characters
$SECRET_KEY = $alphanumeric.Substring(0, [Math]::Min(50, $alphanumeric.Length))
az keyvault secret set `
--vault-name "$KEYVAULT_NAME" `
--name "MongoConnectionString" `
--value "$MONGO_CONNECTION_STRING"
az keyvault secret set `
--vault-name "$KEYVAULT_NAME" `
--name "MongoSecretKey" `
--value "$SECRET_KEY"
Web アプリのマネージド ID にキーボールトへのアクセス権を付与する
Web アプリには、MongoDB 接続文字列と、キー コンテナーに格納した SECRET_KEY
にアクセスするためのアクセス許可が必要です。 これらのアクセス許可を付与するには、 Key Vault シークレット ユーザー ロールを Web アプリの システム割り当てマネージド ID に割り当てます。
この手順では、Web アプリのシステム割り当てマネージド ID の一意識別子 (プリンシパル ID) を使用して、az role assignment create コマンドを使用して、Key Vault シークレット ユーザー ロールを持つ Key Vault へのアクセス権を Web アプリに付与します。
#!/bin/bash
APP_SERVICE_NAME="msdocs-website-name"
PRINCIPAL_ID=$(az webapp identity show \
--name "$APP_SERVICE_NAME" \
--resource-group "$RESOURCE_GROUP_NAME" \
--query principalId \
-o tsv)
echo $PRINCIPAL_ID # Verify this value retrieved successfully. In production, poll for successful 'AcrPull' role assignment using `az role assignment list`.
az role assignment create \
--role "Key Vault Secrets User" \
--assignee "$PRINCIPAL_ID" \
--scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME"
# PowerShell syntax
$PRINCIPAL_ID=$(az webapp identity show `
--name "$APP_SERVICE_NAME" `
--resource-group "$RESOURCE_GROUP_NAME" `
--query principalId `
-o tsv)
echo $PRINCIPAL_ID # Verify this value retrieved successfully. In production, poll for successful AcrPull role assignment using `az role assignment list`.
az role assignment create `
--role "Key Vault Secrets User" `
--assignee "$PRINCIPAL_ID"`
--scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME"
```
---
この手順では、MongoDB に接続するために必要な環境変数を更新して、キー コンテナーに格納されている値を使用します。
VS Code の Azure ビュー (Azure Tools 拡張機能から):
[リソース] を展開し、サブスクリプションの下にある [App Services] を見つけます。 (リソースの種類別 グループ化でリソースを表示していることを確認してください)。
[App Services] を展開し、Web アプリを展開して、[アプリケーションの設定] を展開します。
次の設定を変更します。
- 接続文字列: @Microsoft.KeyVault(SecretUri=https://msdocs-web-app-rg-kv.vault.azure.net/secrets/MongoConnectionString)
- SECRET_KEY: @Microsoft.KeyVault(SecretUri=https://$KEYVAULT_NAME.vault.azure.net/secrets/MongoSecretKey)
手記
アプリケーション設定が正しく設定されていることを確認するには、 az webapp config appsettings list コマンドを 使用して、Web アプリのアプリケーション設定を一覧表示します。 コマンドの形式は、 az webapp config appsettings list --/<resource-group msdocs-web-app-rg/> --name /<website-name/>
です。 このコマンドは、設定した設定を含め、Web アプリのすべてのアプリケーション設定を一覧表示します。
Key Vault シークレットを使用してサイトを参照する
VS Code の Azure ビュー (Azure Tools 拡張機能から):
[リソース] を展開し、サブスクリプションの下にある [App Services] を見つけます。 (リソースの種類別 グループ化でリソースを表示していることを確認してください)。
Web アプリを右クリックし、[ Web サイトの参照] を選択します。 Web サイトにエラーが表示された場合は、数分待ってからやり直してください。 Web アプリが起動するまでに数分かかる場合があります。
App Service のトラブルシューティングも参照してください。