在 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 登入的身分。如果你本地開發遇到困難,可以暫時改回傳統的用戶名密碼驗證。