数据工厂 SQL 连接字符串与 keyvault

Data factory SQL connection String with keyvault

我从 Datafactory V2 导出了 arm 模板,当导入模板时它要求我手动输入 SQL 数据库连接字符串。为了尽量减少人机交互,我做了以下更改。

        {
            "name": "[concat(parameters('factoryName'), '/myFactory')]",
            "type": "Microsoft.DataFactory/factories/linkedServices",
            "apiVersion": "2018-06-01",
            "properties": {
                "type": "AzureSqlDatabase",
                "typeProperties": {
                    "connectionString": "[concat('Server=tcp:',parameters('sqlServerName'),'.database.windows.net,1433;Initial Catalog=', parameters('sqlDatabaseName'), ';Persist Security Info=False;User ID=',parameters('sqlServerUserName'),';Password=(password)',';MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30')]",
                    "password": {
                        "type": "AzureKeyVaultSecret",
                        "store": {
                            "referenceName": "AzureKeyVault1",
                            "type": "LinkedServiceReference"
                        },
                        "secretName": "sql-password"
                    }
                }
            },
            "dependsOn": [
                "[concat(variables('factoryId'), '/linkedServices/AzureKeyVault1')]"
            ]
        },

所以目前在部署到 Datafactory V2 并测试与此 SQL 服务器的连接时,我得到了

Cannot connect to SQL Database: 'tcp:mysqlserver.database.windows.net,1433', 
Database: 'mydatabase', User: 'admin'. Check the linked service configuration
is correct, and make sure the SQL Database firewall allows the integration runtime to access.
Login failed for user 'admin'., SqlErrorNumber=18456,

如果我在门户中手动输入所有连接UI,我可以轻松连接到数据库并测试成功,所以这不是防火墙问题。

那我觉得可能有2个问题:

1.how 来自 keyvault 的密码在连接字符串中使用。我在网上没有找到太多关于它的信息。

  1. 当我打开创建的 Sql 链接服务时,我注意到缺少完全限定的域名,如果我手动添加它,则连接正常。

The SQL connection UI

将此作为替代方案 answer/approach。

将连接字符串完整地存储在 Key Vault 中。如果这样做,那么参考将如下所示:

{
  "name": "[concat(parameters('factoryName'), '/',parameters('connectionNameAdventureWorks'))]",
  "type": "Microsoft.DataFactory/factories/linkedServices",
  "apiVersion": "2018-06-01",
  "properties": {
    "annotations": [],
    "type": "AzureSqlDatabase",
    "typeProperties": {
      "connectionString": {
        "type": "AzureKeyVaultSecret",
        "store": {
          "referenceName": "[variables('azkDataAnalyticsReferenceName')]",
          "type": "LinkedServiceReference"
        },
        "secretName": "[variables('azkAdventureWorksSecretName')]"
      }
    }
  },
  "dependsOn": [
     "[concat(variables('factoryId'), '/linkedServices/',variables('azkDataAnalyticsReferenceName'))]" 
  ]
}

更安全的方法是将数据工厂添加为 Managed Identity and then run a sql script to add the user 如果这样做,则根本不需要传递任何凭据。

一个缺点是,如果 DataFactory 被删除并重新创建,则需要将托管标识权限重新分配给 sql 数据库。