在ADF中使用功能应用连接器-如何覆盖CI-CD中的参数?

时间:2019-07-24 22:52:32

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

我需要很快地解决问题-当我们在开发ADF管道中添加Az函数时,这在开发过程中是一个新的惊喜。

在ADF V2中使用函数应用程序时,生成ARM模板时,它不会像其他链接服务中那样对键引用进行参数化。 gh!

因此,对于CI / CD场景,当我们部署时,我们现在有了固定功能的应用程序参考。我们想要做的与其他链接服务相同-覆盖关键参数以指向功能的正确Dev / UAT / Production环境版本。

我可以想到使用powershell进行覆盖的肮脏黑客(powershell是否支持ADF功能?不知道-一月份他们还不支持)。

关于如何覆盖功能应用链接服务设置的其他想法?

键参数在typeProperties下(假设功能键在keyvault中):

{"functionAppUrl:="https://xxx.azurewebsites.net"}
{"functionkey":{"store":{"referenceName"="xxxKeyVaultLS"}}}
{"functionkey":{"secretName"="xxxKeyName"}}

现在这些都是通过UI设置硬编码的-没有参数,没有默认值。

1 个答案:

答案 0 :(得分:0)

好的,最终回到这个问题。

解决方案看起来很多,但是非常简单。

在我的devops发行版中,我已经在部署了数据工厂ARM模板并且已在Deployment.ps1上运行了具有“ predeployment = $ false”设置的powershell任务之后创建了Powershell任务(请参阅ADF CI / CD {{ 3}}。)

我的git仓库中有每个环境(dev / uat / prod)的json文件(实际上,我使用一个单独的“通用”仓库来存储除ADF git仓库之外的脚本,其在DevOps中的别名为“ _Common” -您将在下面的脚本的-File参数中看到此内容。

用于替换已部署的功能链接服务的json文件是ADF中功能链接服务json的副本,对于DEV来说,如下所示:

(scripts / Powershell / dev.json)

{
    "name": "FuncLinkedServiceName",
    "type": "Microsoft.DataFactory/factories/linkedservices",
    "properties": {
        "annotations": [],
        "type": "AzureFunction",
        "typeProperties": {
            "functionAppUrl": "https://myDEVfunction.azurewebsites.net",
            "functionKey": {
                "type": "AzureKeyVaultSecret",
                "store": {
                    "referenceName": "MyKeyvault_LS",
                    "type": "LinkedServiceReference"
                },
                "secretName": "MyFunctionKeyInKeyvault"
            }
        },
        "connectVia": {
            "referenceName": "MyintegrationRuntime",
            "type": "IntegrationRuntimeReference"
        }
    }
}

...并且PROD文件将如下所示:

(scripts / Powershell / prod.json)

{
    "name": "FuncLinkedServiceName",
    "type": "Microsoft.DataFactory/factories/linkedservices",
    "properties": {
        "annotations": [],
        "type": "AzureFunction",
        "typeProperties": {
            "functionAppUrl": "https://myPRODfunction.azurewebsites.net",
            "functionKey": {
                "type": "AzureKeyVaultSecret",
                "store": {
                    "referenceName": "MyKeyvault_LS",
                    "type": "LinkedServiceReference"
                },
                "secretName": "MyFunctionKeyInKeyvault"
            }
        },
        "connectVia": {
            "referenceName": "MyintegrationRuntime",
            "type": "IntegrationRuntimeReference"
        }
    }
}

然后在devops管道中,我使用一个如下所示的Powershell脚本块:

Set-AzureRMDataFactoryV2LinkedService -ResourceGroup "$(varRGName)" -DataFactoryName "$(varAdfName)" -Name "$(varFuncLinkedServiceName)" -File "$(System.DefaultWorkingDirectory)/_Common/Scripts/Powershell/$(varEnvironment).json" -Force

或表示Az

Set-AzDataFactoryV2LinkedService -ResourceGroupName "$(varRGName)" -DataFactoryName "$(varAdfName)" -Name "$(varFuncLinkedServiceName)" -DefinitionFile "$(System.DefaultWorkingDirectory)/_Common/Scripts/Powershell/Converter/$(varEnvironment).json" -Force

注意:

  • $(varXxx)在我的管道变量中定义,例如
    • varFuncLinkServiceName = FuncLinkedServiceName。
    • varEnvironment =“ DEV”,“ UAT”,“ PROD”取决于目标版本
  • 使用强制是因为链接服务必须已经存在于Data Factory ARM部署中,然后才需要强制覆盖函数链接服务。

希望MSFT将发布使用参数的功能应用程序链接服务,但在那之前,这已经使我们沿着发布渠道发展。

HTH。马克。

更新:添加了AzureRM命令的Az cmdlet版本,并更改​​为Set(“ New-Az ...”有效,但在新的Az中-仅Set- for V2链接服务)。