首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Azure数据工厂中的参数化连接(ARM模板)

Azure数据工厂中的参数化连接(ARM模板)
EN

Stack Overflow用户
提问于 2019-09-02 08:39:16
回答 3查看 4.3K关注 0票数 7

我正在尝试在CI/CD设置中设置Azure数据工厂。我遵循微软的最佳实践(https://learn.microsoft.com/en-us/azure/data-factory/continuous-integration-deployment)。

我有4个环境(开发,测试,UAT,珠三角)

简而言之,我所做的是:

  • 创建一个Azure数据工厂并将其链接到我在DEV环境下的Azure DevOps回购
  • 在其他环境(测试、UAT和珠三角)上创建一个Azure数据工厂,但不要将其链接到DevOps。相反,使用ARM模板在这些数据工厂上发布管道,在Azure DevOps中发布管道。
  • 我已经参数化了所有必要的部分,以便能够覆盖我的每个环境中的设置。

此时,我能够成功地部署到我的其他环境,然而,链接服务到我的数据库的天青是不工作的。我已经参数化了所有东西,就像Microsoft建议的那样,但是当我将链接服务导出到ARM模板时,它使用连接字符串而不是参数化设置。

下面是我在Azure Data门户中设置的图片:

当我试图将它导出到ARM模板时,我会得到以下内容:

代码语言:javascript
运行
复制
{
            "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模板,因为这需要人工交互

EN

回答 3

Stack Overflow用户

发布于 2019-12-27 16:59:23

提供的其他答案之一是使用覆盖参数的有效方法。这个答案将提供一个不同的答案,以及关于如何定义SQL连接以及如何利用和实现使用Key Vault和Data进行的一些更新的更多上下文。

如果使用到SQL的on连接,则conenction字符串如下所示:

代码语言:javascript
运行
复制
"Server={serverName};Database={databaseName};User ID={domain}\{userName};Password={password};Integrated Security=True;" 

引号是必需的,可以作为覆盖参数传入。

如果使用Azure数据库,甚至使用Key Vault,请在ARM模板中添加托管身份哪个数据工厂支持

代码语言:javascript
运行
复制
 "identity": {
        "type": "SystemAssigned"
    }

添加之后,Azure数据库将需要有添加托管标识。这可以通过一个可重用的SQL脚本来完成,如:

代码语言:javascript
运行
复制
    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部署,则需要将访问策略更新为类似于以下内容:

代码语言:javascript
运行
复制
"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语句。

票数 2
EN

Stack Overflow用户

发布于 2020-11-24 02:34:45

万一你还没有找到答案或者解决了这个问题:

我的情况非常相似,有几个Azure SQL数据库被参数化(数据库名),需要在Azure发布管道中更改SQL服务器名称,以在环境之间进行交换。

我发现,通过检查链接服务({} )的代码定义,您可以获得包含您定义的任何参数的连接字符串:

我复制了"connectionString“的值,修改了所需的内容(服务器地址),并将参数保留在适当的位置,并将其添加到Azure发布管道中的"connectionString”覆盖参数中,并且它工作了!(包括引号!)

我希望这能帮助你或今后任何遭受同样挫折/困惑的人。

票数 2
EN

Stack Overflow用户

发布于 2019-12-27 10:45:58

我是通过在发行版中使用Azure resource group deployment任务来做到这一点的。其中一个选项是Override template parameters,它将允许您做您需要的事情。您可以创建一个空格分隔的参数列表,以覆盖ARM模板并传入一个变量。

在你的情况下

代码语言:javascript
运行
复制
-database_connectionstring $(VariableHere)

我会将连接字符串存储在Azure KeyVault中,并将其链接到安全变量组。您也可以点击一个标准变量上的挂锁来保护它。

然后将自定义变量绑定到发行版的每个阶段。

任务

覆盖

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57753824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档