[英]Parameterize connections in Azure data factory (ARM templates)
我正在嘗試在 CI/CD 設置中設置 Azure 數據工廠。 我遵循了 Microsoft 的最佳實踐( https://docs.microsoft.com/en-us/azure/data-factory/continuous-integration-deployment )。
我有 4 個環境(開發、測試、UAT、PRD)
簡而言之,我做了什么:
創建一個 Azure 數據工廠並將其鏈接到我在 DEV 環境中的 Azure DevOps 存儲庫
在其他環境(測試、UAT 和 PRD)上創建 Azure 數據工廠,但不要將其鏈接到 DevOps。 而是使用 ARM 模板在這些數據工廠上發布管道,並在 Azure DevOps 中發布管道。
我已經參數化了所有必要的部分,以便能夠覆蓋我每個環境中的設置。
此時,我能夠成功部署到我的其他環境,但是,我在 azure 上的數據庫的鏈接服務無法正常工作。 我已經參數化了一切,就像微軟建議的那樣,但是當我將我的鏈接服務導出到 ARM 模板時,它使用連接字符串而不是我的參數化設置。
下面是我在 Azure 數據工廠門戶中的設置圖片:
當我嘗試將其導出到 ARM 模板時,我得到以下信息:
{
"name": "[concat(parameters('factoryName'), '/database')]",
"type": "Microsoft.DataFactory/factories/linkedServices",
"apiVersion": "2018-06-01",
"properties": {
"parameters": {
"sqlServerUrl": {
"type": "string"
},
"databaseName": {
"type": "string"
},
"sqlPwd": {
"type": "string"
},
"sqlAdminUsername": {
"type": "string"
}
},
"annotations": [],
"type": "AzureSqlDatabase",
"typeProperties": {
"connectionString": {
"type": "SecureString",
"value": "[parameters('database_connectionString')]"
}
}
},
"dependsOn": []
},
這個ARM模板的問題在於它沒有使用參數來創建連接字符串,而是使用連接字符串參數database_connectionString(默認情況下連接字符串總是由Azure參數化,所以我不能刪除這個參數)。
發布管道使用此模板時,沒有填寫連接字符串(僅填寫參數),因此與數據庫的連接失敗。 您應該如何設置連接,以便您只需更改參數即可自動(無需人工交互)部署到所有環境?
我不想更改來自 Azure 數據工廠的 ARM 模板,因為這需要人工交互
提供的其他答案之一是使用覆蓋參數的有效方法。 此答案將提供不同的答案以及有關如何定義 SQL 連接以及如何利用和實施通過 Key Vault 和數據工廠集成所做的一些更新的更多上下文。
如果使用本地連接到 SQL,則連接字符串將如下所示:
"Server={serverName};Database={databaseName};User ID={domain}\{userName};Password={password};Integrated Security=True;"
引號是必需的,可以作為覆蓋參數傳入。
如果使用 Azure 數據庫甚至使用 Key Vault,請通過將其包含在 ARM 模板中來添加數據工廠支持的托管標識
"identity": {
"type": "SystemAssigned"
}
添加后,Azure SQL 數據庫將需要添加托管標識。 這可以通過可重用的 SQL 腳本來完成,例如:
DECLARE @rolename AS NVARCHAR(100) = 'DataFactory_User'
DECLARE @username AS NVARCHAR(100) -- This will be the DataFactory name
SET @username = 'DataFacotryName'
if exists(select * from sys.database_principals where name = @username and Type = 'X' or Type='E')
BEGIN
DECLARE @dropUserSql varchar(1000)
SET @dropUserSql='DROP USER [' + @username + ']'
PRINT 'Executing ' + @dropUserSql
EXEC (@dropUserSql)
PRINT 'Completed ' + @dropUserSql
END
DECLARE @createUserSql varchar(1000)
SET @createUserSql='CREATE USER [' + @username + '] FROM EXTERNAL PROVIDER'
PRINT 'Executing ' + @createUserSql
EXEC (@createUserSql)
PRINT 'Completed ' + @createUserSql
我建議刪除並重新創建此用戶。 SQL 識別托管標識的指紋,每次刪除並重新創建 DataFactory 時,都會創建一個新的指紋。
在利用 Key Vault 方面,有一種 Key Vault 的LinkedService 類型,它依賴於上述托管標識來檢索機密。
如果通過 ARM 部署,Key Vault 需要將訪問策略更新為類似於以下內容:
"accessPolicies": [
{
"tenantID": "[subscription().tenantId]",
"objectId": "[reference(resourceId('Microsoft.DataFactory/factories/', parameters('DataFactoryName')), '2018-02-01', 'Full').identity.principalId]",
"permissions": {
"secrets": [
"get"
],
"keys": [
"get"
],
"certificates": [
"import"
]
},
"dependsOn": [
"[resourceId('Microsoft.DataFactory/factories/', parameters('DataFactoryName'))]"
]
}
]
此代碼段假定 Key Vault 和數據工廠位於同一個 ARM 模板中。 如果它們不是,訪問策略仍然可以通過 ARM 實現,方法是獲取數據工廠定義的托管標識的 ObjectId 並將其作為 ObjectId 傳入並刪除dependsOn 語句。
以防萬一你還沒有找到答案或解決這個問題:
我處於非常相似的情況,我有幾個參數化的 Azure SQL 數據庫(數據庫名稱),需要更改 ADF Azure Release Pipeline 中的 SQL 服務器名稱以在環境之間交換。
我發現通過檢查鏈接服務的代碼定義(它旁邊的 {}),您可以獲得一個連接字符串,其中包含您定義的任何參數:
我復制了“connectionString”的值並修改了我需要的內容(服務器地址)並保留了參數,並將其添加到我的 Azure Release Pipeline 中的“connectionString”覆蓋參數中,並且它起作用了! (包括引號!)
我希望這可以幫助您或將來遭受同樣挫折/困惑的任何人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.