Azure DevOps 将安全字符串传递到 ARM 模板

问题描述 投票:0回答:2

我需要在 AzureResourceManagerTemplateDeployment@3 任务的 overRideParameters 中传递 SecureString 类型的变量。该变量是 SAS 令牌,在容器级别创建,具有读取、添加、列出、写入、创建权限。

Azure Data Factory (ADF) 自动生成的 ARM 模板如下:

如果我手动粘贴要在 ADF SSIS-IR 配置中用于自定义的完整 URL,则可以成功启动 SSIS-IR。但是,当通过 Azure DevOps (ADO) 管道代码(其中 url 和 SAS 令牌连接在一起)设置相同的属性值时,会出现问题 - SSIS-IR 将无法启动。错误(403)是找不到端点或者没有权限。

我怎样才能让它发挥作用?

下图显示了具有预期 SAS 令牌屏蔽的 ADF SSIS 配置。

在一个 yml 文件中的一项任务中,我从存储在 ADO 库中的变量组中提取变量(标记为秘密)。然后,我根据需要映射它Microsoft 文档中描述的。然后我确认检索到的值符合预期:

- job: Deploy_${{parameters.environmentName}}_env
  displayName: Deploy published ADF ARM template 
  dependsOn:   Check_Variables_${{parameters.environmentName}}
  condition:   succeeded()
  variables:
    - group: ado_ssis_cicd_${{parameters.environmentName}} 
    - name:  sassToken_from_group
      value: $(ssisir_sasToken)           
    - template: ../../variables/vars-${{parameters.environmentName}}.yml  
  steps:
  - task: PowerShell@2
    displayName: Extract Library variables.
    inputs:
     targetType: 'inline'
     script: |         
      Write-host "sassToken_from_group from Group_Var from lib: $(sassToken_from_group)" 
      "$(sassToken_from_group)"  -eq "sp=racwl&st=2022-11-07T06:29:55Z&se=2029-11-07T15:29:55Z&spr=https&sv=2021-06-08&sr=c&sig=5pPVjhiNO7g7WQIQb5F2uRFmvU8xJEoao2TSofsQJAA%3D"

该值作为参数(类型= String)传递给另一个 yml,然后在 AzureResourceManagerTemplateDeployment@3 任务参数覆盖中使用:

- task: AzureResourceManagerTemplateDeployment@3 
  displayName: ARM template deployment - Resource Group scope
  inputs:
    deploymentScope: Resource Group
    azureResourceManagerConnection: ${{ parameters.azureResourceManagerConnection }}
    subscriptionId: ${{ parameters.subscriptionId }}
    resourceGroupName: ${{ parameters.resourceGroupName }}
    location: ${{ parameters.location }}
    csmFile: $(Build.SourcesDirectory)/build/ArmTemplatesDrop/ARMTemplateForFactory.json
    csmParametersFile: $(Build.SourcesDirectory)/build/ArmTemplatesDrop/ARMTemplateParametersForFactory.json
    deploymentMode: Incremental 
    overrideParameters:        
      -ssisir_blobContainerUri ${{ parameters.ssisir_blobContainerUri }} 
      -ssisir_sasToken ${{ parameters.ssisir_token }}

推送到 SSIS 自定义配置的 SAS 令牌按预期被屏蔽,因此我无法知道部署了什么。

我知道秘密只是一个加密的字符串。我不认为我需要(或可以)解密它。我知道 SecureString 类型的字符串的内存管理方式与普通字符串不同。

因为 yml 文件中参数被覆盖的代码位于拉取和映射变量的同一作业下的步骤中,所以我还尝试直接使用变量而不是通过参数传入的值:

  overrideParameters:  
      -ssisir_blobContainerUri ${{ parameters.ssisir_blobContainerUri }} 
      -ssisir_sasToken $(sassToken_from_group)
azure azure-devops ssis azure-pipelines azure-rm-template
2个回答
0
投票

问题已解决。在我看来这是一个错误。 Blob 容器的 url 需要一个“?”附加,以便在生成并推送到 ADF 中时,blob 容器 url 和 SAS 令牌参数按标准 URI 格式按预期分隔。

以下是从 ADF 发布时在 ARM 模板中生成的内容。请注意,没有“?”附加字符。人们可能会认为代码在生成部署到目标字段的内容时会附加该字符。


0
投票

我尝试复制您的操作,但始终收到以下错误。

IntegrationRuntimeCannotModify:集成运行时只能在处于“初始”或“已停止”状态时更新/删除。当前状态:“已开始”。

请务必注意,源 ADF 实例和目标 ADF 实例的 IntegrationRuntime 定义相同。

有什么专业建议吗?

© www.soinside.com 2019 - 2024. All rights reserved.