Share via


Azure Cosmos DB for NoSQL とのパスワードレス接続を使用するようにアプリケーションを移行する

Azure Cosmos DB for NoSQL へのアプリケーション要求は認証する必要があります。 Azure Cosmos DB の認証を受けるオプションは複数ありますが、可能な場合は、アプリケーションでパスワードレス接続を優先することをお勧めします。 パスワードや秘密鍵と共に接続文字列を使用する従来の認証方法は、セキュリティ リスクと複雑さが生じます。 パスワードレス接続に移行する利点の詳細については、「Azure サービスのパスワードレス接続」ハブを参照してください。

次のチュートリアルでは、Azure Cosmos DB for NoSQL に接続する既存のアプリケーションを、キーベースのソリューションではなくパスワードレス接続を使用するように移行する方法について説明します。

ローカル開発の認証に使用するロールとユーザーを構成する

パスワードレス認証を使用してローカルで開発する場合は、Cosmos DB に接続するユーザー アカウントに、データ操作を実行するための適切なアクセス許可をもつロールが割り当てられていることを確認します。 現在、Azure Cosmos DB for NoSQL にはデータ操作用の組み込みロールは含まれていませんが、Azure CLI または PowerShell を使用して独自のロールを作成できます。

ロールは、読み取り、書き込み、削除など、アクセス許可、またはユーザーが実行を許可されたアクションのコレクションで構成されます。 ロールベースのアクセス制御 (RBAC) の構成の詳細については、Cosmos DB セキュリティ構成に関するドキュメントを参照してください。

カスタム ロールを作成する

  1. az role definition create コマンドを使用して、ロールを作成します。 Cosmos DB アカウント名とリソース グループを渡し、その後にカスタム ロールを定義する JSON の本文を渡します。 次の例では、Cosmos DB コンテナー内の項目の読み取りと書き込みを行うアクセス許可を持つ PasswordlessReadWrite という名前のロールを作成します。 ロールのスコープも / を使用してアカウント レベルに設定されます。

    az cosmosdb sql role definition create \
        --account-name <cosmosdb-account-name> \
        --resource-group  <resource-group-name> \
        --body '{
        "RoleName": "PasswordlessReadWrite",
        "Type": "CustomRole",
        "AssignableScopes": ["/"],
        "Permissions": [{
            "DataActions": [
                "Microsoft.DocumentDB/databaseAccounts/readMetadata",
                "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*",
                "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*"
            ]
        }]
    }'
    
  2. コマンドが完了したら、name フィールドから ID 値をコピーし、後で使用できるように任意の場所に貼り付けます。

  3. 作成したロールを、Cosmos DB に接続するユーザー アカウントまたはサービス プリンシパルに割り当てます。 ローカル開発の間、これは通常、Visual Studio または Azure CLI などの開発ツールにログインする独自のアカウントになります。 az ad user コマンドを使用して、アカウントの詳細を取得します。

    az ad user show --id "<your-email-address>"
    
  4. id プロパティの値を結果からコピーし、後で使用するために任意の場所に貼り付けます。

  5. az cosmosdb sql role assignment create コマンドと前にコピーした ID を使用して、作成したカスタム ロールをユーザー アカウントに割り当てます。

    az cosmosdb sql role assignment create \
        --account-name <cosmosdb-account-name> \
        --resource-group  <resource-group-name> \
        --scope "/" \
        --principal-id <your-user-id> \
        --role-definition-id <your-custom-role-id> 
    

Azure にローカルでサインインする

ローカル開発の場合は、ロールを割り当てたのと同じ Microsoft Entra アカウントで認証されていることを確認します。 Azure CLI や Azure PowerShell などの一般的な開発ツールを使用して認証できます。 認証に使用できる開発ツールは、言語によって異なります。

Azure CLI で次のコマンドを使って Azure にサインインします。

az login

パスワードレス接続を使用するようにアプリ コードを移行する

  1. .NET アプリケーションで DefaultAzureCredential を使用するには、Azure.Identity パッケージをインストールします:

    dotnet add package Azure.Identity
    
  2. ファイルの先頭に、次のコードを追加します:

    using Azure.Identity;
    
  3. Azure Cosmos DB に接続する CosmosClient オブジェクトを作成する箇所を、コード内で識別します。 次の例に合わせてコードを更新します。

    DefaultAzureCredential credential = new();
    
    using CosmosClient client = new(
        accountEndpoint: Environment.GetEnvironmentVariable("COSMOS_ENDPOINT"),
        tokenCredential: credential
    );
    

アプリをローカルで実行する

これらの変更をコードに対して行った後、アプリケーションをローカルで実行します。 新しい構成では、Azure CLI、Visual Studio、IntelliJ などのローカルの資格情報を取得する必要があります。 アプリは、Azure のローカル開発ユーザーに割り当てられたロールを使用して、Azure サービスにローカルから接続できます。

Azure ホスティング環境を構成する

パスワードレス接続を使用するようにアプリケーションを構成し、ローカルから実行しました。そのアプリケーションを Azure にデプロイすれば、同じコードで Azure サービスに対する認証を行うことができます。 以下のセクションでは、マネージド ID を使用して Azure Cosmos DB に接続するようにデプロイされたアプリケーションを構成する方法について説明します。

マネージド ID を作成する

ユーザー割り当てマネージド ID は、Azure portal または Azure CLI を使用して作成できます。 アプリケーションでは、ID を使用して他のサービスに対する認証が行われます。

  1. Azure portal の上部で、"マネージド ID" を検索します。 [マネージド ID] の結果を選択します。
  2. [マネージド ID] 概要ページの上部にある [+ 作成] を選択します。
  3. [基本] タブで、次の値を入力します。
    • サブスクリプション: 目的のサブスクリプションを選択します。
    • リソース グループ: 目的のリソース グループを選択します。
    • リージョン: ご自分の場所に近いリージョンを選びます。
    • 名前: MigrationIdentity など、ID のわかりやすい名前を入力します。
  4. ページ下部にある [確認と作成] を選択します。
  5. 検証チェックが完了したら、[作成] を選択します。 Azure で、新しいユーザー割り当て ID が作成されます。

リソースが作成されたら、[Go to resource] (リソースに移動) を選択して、マネージド ID の詳細を表示します。

A screenshot showing how to create a user assigned managed identity.

マネージド ID を Web アプリに関連付ける

作成したマネージド ID を使用するように Web アプリを構成する必要があります。 Azure portal または Azure CLI を使用して、アプリに ID を割り当てます。

ID をアプリに関連付けるには、Azure portal で次の手順を実行します。 これらの同じ手順は、次の Azure サービスに適用されます。

  • Azure Spring Apps
  • Azure Container Apps
  • Azure の仮想マシン
  • Azure Kubernetes Service
  1. Web アプリの概要ページに移動します。

  2. 左側のナビゲーションから、[ID] を選択します。

  3. [ID] ページで、[ユーザー割り当て済み] タブに切り替えます。

  4. [+ 追加] を選択して、[ユーザー割り当てマネージド ID の追加] ポップアップを開きます。

  5. ID を作成するために使用したサブスクリプションを選択します。

  6. 名前で MigrationIdentity を検索し、検索結果から選択します。

  7. [追加] を選択して、ID をアプリに関連付けます。

    Screenshot showing how to create a user assigned identity.

マネージド ID にロールを割り当てる

ローカル開発ユーザーの場合と同じように、作成したカスタム ロールを割り当てて、マネージド ID にアクセス許可を付与します。

Azure CLI を使ってリソース レベルでロールを割り当てるには、まず az cosmosdb show コマンドを使用してリソース ID を取得する必要があります。 --query パラメーターを使って、出力プロパティをフィルター処理することができます。

az cosmosdb show \
    --resource-group '<resource-group-name>' \
    --name '<cosmosdb-name>' \
    --query id

前のコマンドからの出力 ID をコピーします。 これで、Azure CLI の az role assignment コマンドを使ってロールを割り当てることができます。

az role assignment create \
    --assignee "<your-managed-identity-name>" \
    --role "PasswordlessReadWrite" \
    --scope "<cosmosdb-resource-id>"

アプリケーション コードを更新する

Azure にデプロイする際に作成した特定のマネージド ID を検索するように、アプリケーション コードを構成する必要があります。 シナリオによっては、アプリのマネージド ID を明示的に設定することで、他の環境 ID が誤って検出されて自動的に使用されるのを防ぐこともできます。

  1. マネージド ID の概要ページで、クライアント ID の値をクリップボードにコピーします。

  2. 次の言語固有の変更を適用します。

    DefaultAzureCredentialOptions オブジェクトを作成し、それを DefaultAzureCredential に渡します。 ManagedIdentityClientId プロパティをクライアント ID に設定します。

    DefaultAzureCredential credential = new(
        new DefaultAzureCredentialOptions
        {
            ManagedIdentityClientId = managedIdentityClientId
        });
    
  3. 構成の更新を適用するために、この変更を行った後にコードを Azure に再デプロイします。

アプリをテストする

更新したコードをデプロイしたら、ホストされているアプリケーションにブラウザーでアクセスします。 Cosmos DB に対してアプリから正常に接続できるはずです。 Azure 環境にロールの割り当てが反映されるまでに数分かかる場合があることに留意してください。 これでローカル環境と運用環境のどちらでも動作するようにアプリケーションが構成されました。開発者がアプリケーション自体でシークレットを管理する必要はありません。

次の手順

このチュートリアルでは、アプリケーションをパスワードレス接続に移行する方法について説明しました。

この記事で説明されている概念の詳細については、次のリソースを参照してください。