数据工厂 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 的密码在连接字符串中使用。我在网上没有找到太多关于它的信息。
- 当我打开创建的 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 数据库。
我从 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 的密码在连接字符串中使用。我在网上没有找到太多关于它的信息。
- 当我打开创建的 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 数据库。