簡體   English   中英

參數化 Azure 數據工廠中的連接(ARM 模板)

[英]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 數據工廠門戶中的設置圖片:daf 設置

當我嘗試將其導出到 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”覆蓋參數中,並且它起作用了! (包括引號!)

我希望這可以幫助您或將來遭受同樣挫折/困惑的任何人。

我通過使用 Release 中的Azure resource group deployment任務來執行此操作。 選項之一是Override template parameters ,這將允許您完全按照您的需要進行操作。 您可以創建一個空格分隔的參數列表來覆蓋您的 ARM 模板並傳入一個變量

在你的情況下,它會是

-database_connectionstring $(VariableHere)

我會將連接字符串存儲在 Azure KeyVault 中並將其鏈接到安全變量組。 您也可以在標准變量上打上掛鎖來保護它。

然后將自定義變量綁定到 Release 中的每個 Stage

任務在此處輸入圖片說明

覆蓋在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM