gpt4 book ai didi

azure - 对 Azure 数据工厂中的连接进行参数化(ARM 模板)

转载 作者:行者123 更新时间:2023-12-03 16:50:44 25 4
gpt4 key购买 nike

我正在尝试在 CI/CD 设置中设置 Azure 数据工厂。我遵循 Microsoft 的最佳实践 ( https://learn.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 上数据库的链接服务无法正常工作。我已经参数化了所有内容,就像 Microsoft 建议的那样,但是当我将链接服务导出到 ARM 模板时,它使用连接字符串而不是我的参数化设置。

下面是我在 Azure 数据工厂门户中的设置图片: daf-setup

当我尝试将其导出到 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,请添加 Managed Identity其中Data Factory Supports将其包含在您的 ARM 模板中

 "identity": {
"type": "SystemAssigned"
}

添加后,Azure SQL 数据库将需要具有 managed identity added 。这可以通过可重用的 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 type of Key Vault依赖于上述托管身份来检索 secret 。

如果通过 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 来完成 obtaining the ObjectId of the Data Factory defined Managed Identity并将其作为 ObjectId 传入并删除 dependentOn 语句。

关于azure - 对 Azure 数据工厂中的连接进行参数化(ARM 模板),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57753824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com