【问题标题】:Data factory SQL connection String with keyvault带有 keyvault 的数据工厂 SQL 连接字符串
【发布时间】:2020-07-30 18:18:37
【问题描述】:

我从 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.keyvault 的密码如何在连接字符串中使用。我在网上没有找到太多关于它的信息。

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

The SQL connection UI

【问题讨论】:

  • 密码是否有特殊字符?通过此方法检索它时,这可能会导致问题。审计日志还显示密钥保管库的什么内容?数据工厂是否实际检索了凭据
  • 密码确实有'+'和'='。如果密码包含特殊字符,我该如何处理此类问题?应该检索凭据,我确实为datafactory添加了访问Keyvault的权限,并且在使用UI作为我附加的图片进行连接时,我可以轻松建立连接。我只需要手动输入完全限定的域名...这是另一个问题,为什么该字段没有从 arm 模板中填充?
  • + 和 = 应该没问题

标签: azure azure-data-factory-2 arm-template


【解决方案1】:

将此作为替代答案/方法。

将连接字符串完整地存储在 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,然后添加run a sql script to add the user。如果这样做,则根本不需要传递任何凭据。

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

【讨论】:

  • 所以请看我附上的图片,碰巧如果我在完全限定域名部分手动添加“:mysqlserver.database.windows.net”,那么整个事情将是在职的。您知道为什么缺少完全限定域名吗?
猜你喜欢
  • 1970-01-01
  • 2019-09-02
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 2019-08-12
  • 2022-10-20
相关资源
最近更新 更多