Azure App Service for Containers 上執行的 Node.js 應用程式,要存取 Azure SQL Database

在 Azure App Service for Containers 上執行的 Node.js 應用程式,要存取 Azure SQL Database,最推薦且安全的方式是使用「受控識別」(Managed Identity)。這樣做的好處是你不需要在程式碼或環境變數中硬編碼資料庫密碼。

以下是實作的關鍵步驟與程式碼範例:

1. 啟用受控識別

在 Azure Portal 中,進入你的 App Service 頁面,找到「身分識別 (Identity)」,將「系統指派 (System assigned)」的狀態切換為「開啟」。這會為你的 App Service 在 Entra ID (原 AAD) 中建立一個身分。

2. 在資料庫中授權

你需要讓 SQL Database 認得這個身分。請使用 SQL 查詢工具(如 Azure Portal 的查詢編輯器)連線到你的資料庫,執行以下指令:

CREATE USER [你的-App-Service-名稱] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [你的-App-Service-名稱];
ALTER ROLE db_datawriter ADD MEMBER [你的-App-Service-名稱];

註:如果是實作容器化部署,名稱通常就是你的 App Service Resource Name。

3. Node.js 程式碼實作

推薦使用 mssql 搭配 tedious 驅動程式。在連線設定中,不需要填寫使用者名稱與密碼,而是指定驗證類型為 azure-active-directory-default。

安裝必要的套件:

npm install mssql

連線範例程式碼:

const sql = require('mssql');

const config = {
  server: '你的伺服器名稱.database.windows.net',
  database: '你的資料庫名稱',
  options: {
    encrypt: true, // Azure SQL 必須加密
    trustServerCertificate: false
  },
  authentication: {
    type: 'azure-active-directory-default' // 自動偵測受控識別
  }
};

async function connectAndQuery() {
  try {
    let pool = await sql.connect(config);
    let result = await pool.request().query('SELECT TOP 10 * FROM YourTable');
    console.log(result.recordset);
  } catch (err) {
    console.error('連線失敗:', err);
  }
}

connectAndQuery();

4. 設定容器環境變數

確保你的 App Service 環境變數(Configuration > Application settings)中包含資料庫連線資訊。雖然我們不用密碼,但伺服器與資料庫名稱仍建議透過環境變數傳入:

  • DB_SERVER: your-server.database.windows.net
  • DB_NAME: your-database

注意事項

  • 網路存取:確保 Azure SQL 的防火牆設定中,「允許 Azure 服務和資源存取此伺服器」已勾選,或是將 App Service 的輸出 IP 加入白名單。
  • 本地測試:在本地開發時,azure-active-directory-default 會嘗試使用你透過 Azure CLI 登入的身分。如果你本地開發遇到困難,可以暫時改回傳統的用戶名密碼驗證。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *