我正在尝试在CI/CD设置中设置Azure数据工厂。我遵循微软的最佳实践(https://learn.microsoft.com/en-us/azure/data-factory/continuous-integration-deployment)。
我有4个环境(开发,测试,UAT,珠三角)
简而言之,我所做的是:
此时,我能够成功地部署到我的其他环境,然而,链接服务到我的数据库的天青是不工作的。我已经参数化了所有东西,就像Microsoft建议的那样,但是当我将链接服务导出到ARM模板时,它使用连接字符串而不是参数化设置。
下面是我在Azure Data门户中设置的图片:
当我试图将它导出到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 interaction提供的ARM模板,因为这需要人工交互
发布于 2019-12-27 16:59:23
提供的其他答案之一是使用覆盖参数的有效方法。这个答案将提供一个不同的答案,以及关于如何定义SQL连接以及如何利用和实现使用Key Vault和Data进行的一些更新的更多上下文。
如果使用到SQL的on连接,则conenction字符串如下所示:
"Server={serverName};Database={databaseName};User ID={domain}\{userName};Password={password};Integrated Security=True;"
引号是必需的,可以作为覆盖参数传入。
如果使用Azure数据库,甚至使用Key Vault,请在ARM模板中添加托管身份哪个数据工厂支持
"identity": {
"type": "SystemAssigned"
}
添加之后,Azure数据库将需要有添加托管标识。这可以通过一个可重用的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方面,有一个LinkedService型密钥库依赖于上面描述的托管标识来检索机密。
密钥库如果通过ARM部署,则需要将访问策略更新为类似于以下内容:
"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'))]"
]
}
]
这个片段假设关键的Vault和Data在同一个ARM模板中。如果它们不是,那么访问策略仍然可以通过获取数据工厂定义的托管标识的ObjectId通过ARM完成,并将其作为ObjectId传入并移除dependsOn语句。
发布于 2020-11-24 02:34:45
万一你还没有找到答案或者解决了这个问题:
我的情况非常相似,有几个Azure SQL数据库被参数化(数据库名),需要在Azure发布管道中更改SQL服务器名称,以在环境之间进行交换。
我发现,通过检查链接服务({} )的代码定义,您可以获得包含您定义的任何参数的连接字符串:
我复制了"connectionString“的值,修改了所需的内容(服务器地址),并将参数保留在适当的位置,并将其添加到Azure发布管道中的"connectionString”覆盖参数中,并且它工作了!(包括引号!)
我希望这能帮助你或今后任何遭受同样挫折/困惑的人。
发布于 2019-12-27 10:45:58
我是通过在发行版中使用Azure resource group deployment
任务来做到这一点的。其中一个选项是Override template parameters
,它将允许您做您需要的事情。您可以创建一个空格分隔的参数列表,以覆盖ARM模板并传入一个变量。
在你的情况下
-database_connectionstring $(VariableHere)
我会将连接字符串存储在Azure KeyVault中,并将其链接到安全变量组。您也可以点击一个标准变量上的挂锁来保护它。
然后将自定义变量绑定到发行版的每个阶段。
任务
覆盖
https://stackoverflow.com/questions/57753824
复制相似问题