次の方法で共有


Azure SQL Database との間でパスワードレス接続を使うように Node.js アプリケーションを移行する

適用対象: Azure SQL データベース

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

以下のチュートリアルでは、Azure SQL Database に接続する既存の Node.js アプリケーションを、ユーザー名とパスワードのソリューションではなくパスワードレス接続を使うように移行する方法について説明します。

Azure SQL Database の構成

パスワードレスの接続は、Azure Active Directory (Azure AD) 認証を使って、Azure SQL Database を含む Azure サービスに接続します。 Azure AD 認証を使うと、ID を一元管理して、権限の管理を簡略化できます。 Azure SQL Database の Microsoft Entra 認証の構成の詳細については、こちらをご覧ください。

この移行ガイドでは、Azure SQL Database に Microsoft Entra 管理者が割り当てられていることを確認してください。

  1. 論理サーバーの Microsoft Entra ページに移動します。

  2. [管理者の設定] を選択し、[Microsoft Entra ID] フライアウト メニューを開きます。

  3. Microsoft Entra ID フライアウト メニューで、管理者として割り当てるユーザーを検索します。

  4. ユーザーを選び、[選択] を選びます。

    Microsoft Entra 管理者を有効にする方法を示すスクリーンショット。

ローカルの開発環境を構成する

パスワードレス接続は、ローカル環境と Azure ホステッド環境の両方で機能するように構成できます。 このセクションでは、ローカル開発のために個々のユーザーが Azure SQL Database への認証を行うことができるようにする構成を適用します。

Azure へのサインイン

ローカル開発の場合、Azure SQL Database へのアクセスに使うものと同じ Azure AD アカウントでサインインする必要があります。 Azure CLI や Azure PowerShell などの一般的な開発ツールを使用して認証できます。 認証に使用できる開発ツールは、言語によって異なります。

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

az login

データベース ユーザーを作成してロールを割り当てる

Azure SQL Database でユーザーを作成します。 ユーザーは、「Azure にサインインする」セクションでローカル環境にサインインするために使った Azure アカウントに対応している必要があります。

  1. Azure portal でお使いの SQL データベースに移動し、[クエリ エディター (プレビュー)] を選びます。

  2. 画面の右側にある [<your-username> として続行] を選択し、自分のアカウントを使ってデータベースにサインインします。

  3. クエリ エディター ビューで、次の T-SQL コマンドを実行します。

    CREATE USER [user@domain] FROM EXTERNAL PROVIDER;
    ALTER ROLE db_datareader ADD MEMBER [user@domain];
    ALTER ROLE db_datawriter ADD MEMBER [user@domain];
    ALTER ROLE db_ddladmin ADD MEMBER [user@domain];
    GO
    

    Azure Query エディターの使用方法を示すスクリーンショット。

    これらのコマンドを実行すると、指定したアカウントに SQL DB 共同作成者ロールが割り当てられます。 このロールを割り当てられた ID は、データベースのデータとスキーマの読み取り、書き込み、変更を行うことができます。 割り当てられるロールについて詳しくは、「固定データベース ロール」をご覧ください。

ローカル接続の構成を更新する

  1. アプリケーションの環境設定を作成します。

    AZURE_SQL_SERVER=<YOURSERVERNAME>.database.windows.net
    AZURE_SQL_DATABASE=<YOURDATABASENAME>
    AZURE_SQL_PORT=1433
    
  2. Node.js SQL ドライバー - tedious を使って Azure SQL Database に接続する既存のアプリケーション コードは、少し変更するだけで、パスワードレス接続を使って引き続き動作します。 ユーザー割り当てマネージド ID を使用するには、authentication.type プロパティと options.clientId プロパティを渡します。

    import sql from 'mssql';
    
    // Environment settings - no user or password
    const server = process.env.AZURE_SQL_SERVER;
    const database = process.env.AZURE_SQL_DATABASE;
    const port = parseInt(process.env.AZURE_SQL_PORT);
    
    // Passwordless configuration
    const config = {
        server,
        port,
        database,
        authentication: {
            type: 'azure-active-directory-default',
        },
        options: {
            encrypt: true,
            clientId: process.env.AZURE_CLIENT_ID  // <----- user-assigned managed identity        
        }
    };
    
    // Existing applicaton code
    export default class Database {
        config = {};
        poolconnection = null;
        connected = false;
    
        constructor(config) {
            this.config = config;
            console.log(`Database: config: ${JSON.stringify(config)}`);
        }
    
        async connect() {
            try {
                console.log(`Database connecting...${this.connected}`);
                if (this.connected === false) {
                    this.poolconnection = await sql.connect(this.config);
                    this.connected = true;
                    console.log('Database connection successful');
                } else {
                    console.log('Database already connected');
                }
            } catch (error) {
                console.error(`Error connecting to database: ${JSON.stringify(error)}`);
            }
        }
    
        async disconnect() {
            try {
                this.poolconnection.close();
                console.log('Database connection closed');
            } catch (error) {
                console.error(`Error closing database connection: ${error}`);
            }
        }
    
        async executeQuery(query) {
            await this.connect();
            const request = this.poolconnection.request();
            const result = await request.query(query);
    
            return result.rowsAffected[0];
        }
    }
    
    const databaseClient = new Database(config);
    const result = await databaseClient.executeQuery(`select * from mytable where id = 10`);
    

    AZURE_CLIENT_ID 環境変数は、このチュートリアルの後半で作成されます。

アプリをテストする

ローカルでアプリを実行し、Azure SQL Database への接続が期待どおりに機能することを確認します。 Azure ユーザーとロールの変更が Azure 環境に反映されるまでに数分かかる場合があることに注意してください。 これで、開発者がアプリケーション内でシークレットを管理しなくても、ローカルで実行できるようにアプリケーションが構成されました。

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

ローカルでパスワードレス接続を使うようにアプリを構成して、Azure にデプロイすると、同じコードで Azure SQL Database の認証を受けられるようになります。 以下のセクションでは、マネージド ID を使って Azure SQL Database に接続するようにデプロイされたアプリケーションを構成する方法について説明します。 マネージド ID により、Microsoft Entra ID (旧称 Azure Active Directory) 認証をサポートするリソースに接続するときに使用される Microsoft Entra のマネージド ID がアプリケーションに提供されます。 マネージド ID の詳細を確認してください。

マネージド ID を作成する

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

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

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

Azure portal を使ってマネージド ID を作成する方法を示すスクリーンショット。

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

作成したユーザー割り当てマネージド ID を使うように Web アプリを構成します。

ユーザー割り当てマネージド ID をアプリに関連付けるには、Azure portal で次の手順を実行します。 これらの同じ手順は、次の Azure サービスに適用されます。

  • Azure Spring Apps
  • Azure Container Apps
  • Azure の仮想マシン
  • Azure Kubernetes Service
  • Web アプリの概要ページに移動します。
  1. 左側のナビゲーションから、[ID] を選択します。

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

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

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

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

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

    マネージド ID の割り当て方法を示すスクリーンショット。

ID のデータベース ユーザーを作成し、ロールを割り当てる

元のユーザー割り当てマネージド ID にマップする SQL データベース ユーザーを作成します。 アプリでデータベースのデータとスキーマの読み取り、書き込み、変更を実行できるように、必要な SQL ロールをユーザーに割り当てます。

  1. Azure portal で、SQL データベースに移動し、[クエリ エディター (プレビュー)] を選択します。

  2. 画面の右側にある [<username> として続行] を選択し、自分のアカウントを使ってデータベースにサインインします。

  3. クエリ エディター ビューで、次の T-SQL コマンドを実行します。

    CREATE USER [user-assigned-identity-name] FROM EXTERNAL PROVIDER;
    ALTER ROLE db_datareader ADD MEMBER [user-assigned-identity-name];
    ALTER ROLE db_datawriter ADD MEMBER [user-assigned-identity-name];
    ALTER ROLE db_ddladmin ADD MEMBER [user-assigned-identity-name];
    GO
    

    Azure クエリ エディターを使ってマネージド ID の SQL ユーザーを作成する方法を示すスクリーンショット。

    これらのコマンドを実行すると、ユーザー割り当てマネージド ID に SQL DB 共同作成者ロールが割り当てられます。 このロールを割り当てられた ID は、データベースのデータとスキーマの読み取り、書き込み、変更を行うことができます。


重要

エンタープライズ運用環境でデータベース ユーザー ロールを割り当てるときには注意が必要です。 それらのシナリオでは、アプリで 1 つの昇格された ID を使用して、すべての操作を実行すべきではありません。 特定のタスクのための特定のアクセス許可を持つ複数の ID を構成することで、最小限の特権の原則を実装してみてください。

データベース ロールとセキュリティの構成について詳しくは、次のリソースを参照してください。

マネージド ID クライアント ID 用のアプリの設定を作成する

ユーザー割り当てマネージド ID を使うには、AZURE_CLIENT_ID 環境変数を作成し、それにマネージド ID のクライアント ID と同じ値を設定します。 この変数は、Azure portal のアプリの [構成] セクションで設定できます。 クライアント ID は、Azure portal のマネージド ID リソースの [概要] セクションで確認できます。

変更を保存して、アプリケーションを再起動します (自動的に行われない場合)。

システム割り当てマネージド ID を使用する必要がある場合は、options.clientId プロパティを省略します。 引き続き authentication.type プロパティを渡す必要があります。

const config = {
  server,
  port,
  database,
  authentication: {
    type: 'azure-active-directory-default'
  },
  options: {
    encrypt: true
  }
};

アプリケーションをテストする

アプリをテストして、すべてが正常に機能していることを確認します。 すべての変更が Azure 環境に反映されるまで、数分かかることがあります。

次の手順

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

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