次の方法で共有


チュートリアル: Key Vaultを使用して Python App Service からの Cognitive Service 接続をセキュリティで保護する

Azure App Serviceでは、管理された ID を使用して、接続文字列なしでバックエンド サービスに接続できます。これにより、バックエンド接続を管理する接続シークレットがなくなり、運用環境でセキュリティで保護されます。 マネージド ID をサポートせず、接続シークレットを必要とするバックエンド サービスの場合は、Key Vaultを使用して接続シークレットを管理できます。 このチュートリアルでは、Foundry Tools を例として使用して、実際にどのように実行されるかを示します。 完了すると、App Service 内に接続シークレットを格納せずに、Foundry Tools をプログラムで呼び出すアプリが作成されます。

ヒント

Foundry Tools では認証はマネージド アイデンティティをサポートしますが、このチュートリアルでは< c1>サブスクリプションキー認証を使用して、App Services でマネージド アイデンティティをサポートしていない Azure サービスに接続する方法を説明します。

チュートリアルのシナリオを表すアーキテクチャ図。

このアーキテクチャでは、次のことが行われます。

  • Key Vaultへの接続はマネージド ID によって保護されます
  • App Service は、アプリ設定として Key Vault 参照 を使用してシークレットにアクセスします。
  • キー コンテナーへのアクセスはこのアプリに制限される。 管理者などのアプリ共同作成者は、App Service リソースを完全に制御でき、同時にKey Vaultシークレットにアクセスできない場合があります。
  • アプリケーション コードが既にアプリ設定を使用して接続シークレットにアクセスしている場合、変更は必要ありません。

学習内容

  • マネージド ID を有効にする
  • マネージド ID を使用してKey Vaultに接続する
  • Key Vault参照を使用する
  • Foundry ツールへのアクセス

前提条件

Azure CLI用に環境を準備します。

  • Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Get started with Azure Cloud Shell」を参照してください。

  • CLI 参照コマンドをローカルで実行する場合は、Azure CLIinstallします。 Windowsまたは macOS で実行している場合は、Docker コンテナーでAzure CLIを実行することを検討してください。 詳細については、「 Docker コンテナーでAzure CLIを実行する方法を参照してください。

    • ローカル インストールを使用している場合は、az login コマンドを使用してAzure CLIにサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、「Azure CLI を使用して Azure に認証する」を参照してください。

    • メッセージが表示されたら、最初に使用するときにAzure CLI拡張機能をインストールします。 拡張機能の詳細については、「Azure CLIを参照してください。

    • az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。

Foundry Tools への接続を使用してアプリを作成する

  1. すべてのリソースを含むリソース グループを作成します。

    # Save resource group name as variable for convenience
    groupName=myKVResourceGroup
    region=westeurope
    
    az group create --name $groupName --location $region
    
  2. Azure AI サービス リソースを作成します。 cs-resource-name を任意の一意の名前で置き換えます。

    # Save resource name as variable for convenience. 
    csResourceName=<cs-resource-name>
    
    az cognitiveservices account create --resource-group $groupName --name $csResourceName --location $region --kind TextAnalytics --sku F0 --custom-domain $csResourceName
    

    注記

    --sku F0 は、Azure AI サービスの無料レベルのリソースを作成します。 サブスクリプションごとに、1 つの Free レベル リソースというクォータに制限されています。 既にクォータを超えている場合は、代わりに を使用します。

Pythonアプリを設定する

サンプル リポジトリをローカルにクローンし、サンプル アプリケーションを App Service にデプロイします。 app-name を一意の名前で置き換えます。

# Clone and prepare sample application
git clone https://github.com/Azure-Samples/app-service-language-detector.git
cd app-service-language-detector/python
zip -r default.zip .

# Save app name as variable for convenience
appName=<app-name>

az appservice plan create --resource-group $groupName --name $appName --sku FREE --location $region --is-linux
az webapp create --resource-group $groupName --plan $appName --name $appName --runtime "python:3.14"
az webapp config appsettings set --resource-group $groupName --name $appName --settings SCM_DO_BUILD_DURING_DEPLOYMENT=true
az webapp deploy --resource-group $groupName --name $appName --src-path ./default.zip

前のコマンド:

  • Linux App Service プランを作成する
  • Python 3.14 用の Web アプリを作成する
  • その Web アプリを構成して、デプロイ時に python パッケージをインストールするようにします
  • ZIP ファイルをアップロードし、python パッケージをインストールします

シークレットをアプリ設定として構成する

  1. Foundry Tools シークレットをアプリ設定 および として構成します。

    # Get subscription key for Cognitive Services resource
    csKey1=$(az cognitiveservices account keys list --resource-group $groupName --name $csResourceName --query key1 --output tsv)
    
    az webapp config appsettings set --resource-group $groupName --name $appName --settings CS_ACCOUNT_NAME="$csResourceName" CS_ACCOUNT_KEY="$csKey1"
    
  2. ブラウザーで、 のデプロイ アプリに移動し、さまざまな言語の文字列で言語検出アプリを試します。

    App Service にデプロイされた言語検出アプリを示すスクリーンショット。

    アプリケーション コードを見ていると、検出結果のデバッグ出力が背景色と同じフォント色で表示される場合があります。 これは、結果の直下の空白を強調表示することで表示できます。

バックエンド接続をセキュリティで保護する

現時点では、接続シークレットはアプリ設定として App Service アプリに格納されています。 この方法では、接続シークレットは既にアプリケーションコードベースから保護されています。 ただし、アプリを管理できる共同作成者はアプリの設定を表示することもできます。 この手順では、自分だけがこれを管理でき、App Service アプリだけがマネージド ID を使用して読み取ることができるように、接続シークレットをキー コンテナーに移動し、アクセスをロックダウンします。

  1. Key Vault を作成します。 vault-name を一意の名前で置き換えます。

    # Save app name as variable for convenience
    vaultName=<vault-name>
    
    az keyvault create --resource-group $groupName --name $vaultName --location $region --sku standard --enable-rbac-authorization
    

    --enable-rbac-authorization パラメーター Azure のロールベースのアクセス制御 (RBAC) をアクセス許可モデルとして設定します。 この設定では、既定ですべてのアクセス ポリシーのアクセス許可が無効になります。

  2. 自分に、コンテナーに対する Key Vault Secrets Officer RBAC ロールを付与します。

    vaultResourceId=$(az keyvault show --name $vaultName --query id --output tsv)
    myId=$(az ad signed-in-user show --query id --output tsv)
    az role assignment create --role "Key Vault Secrets Officer" --assignee-object-id $myId --assignee-principal-type User --scope $vaultResourceId
    
  3. アプリのシステム割り当てマネージド ID を有効にし、ボールトに Key Vault Secrets User RBAC ロールを付与します。

    az webapp identity assign --resource-group $groupName --name $appName --scope $vaultResourceId --role  "Key Vault Secrets User"
    
  4. Azure AI サービスリソース名とサブスクリプション キーをシークレットとしてコンテナーに追加し、次の手順で使用できるように ID を環境変数として保存します。

    csResourceKVUri=$(az keyvault secret set --vault-name $vaultName --name csresource --value $csResourceName --query id --output tsv)
    csKeyKVUri=$(az keyvault secret set --vault-name $vaultName --name cskey --value $csKey1 --query id --output tsv)
    
  5. 先ほど、アプリでシークレットをアプリ設定として設定しました。 代わりにこれらを鍵保管庫参照として設定します。

    az webapp config appsettings set --resource-group $groupName --name $appName --settings CS_ACCOUNT_NAME="@Microsoft.KeyVault(SecretUri=$csResourceKVUri)" CS_ACCOUNT_KEY="@Microsoft.KeyVault(SecretUri=$csKeyKVUri)"
    
  6. ブラウザーで、もう一度 そのページ に移動します。 検出結果が返された場合は、キーボールト参照を使用して Azure AI Services エンドポイントに接続しています。

これで、アプリは、アプリケーション コードを変更することなく、キー コンテナーに保持されているシークレットを使用して Foundry Tools に接続できるようになりました。

リソースをクリーンアップする

前の手順では、Azureリソースをリソース グループ内に作成しました。 今後これらのリソースが必要ない場合は、Cloud Shellで次のコマンドを実行してリソース グループを削除します。

az group delete --name $groupName

このコマンドの実行には、少し時間がかかる場合があります。

次のステップ