我已使用 Arm 模板通过 Azure Devops Pipeline 自动部署逻辑应用标准。
我有另一个管道,它使用 Azure Devops zip 部署任务来部署工作流(按照 Microsoft 文档的建议)。
我目前的困境是当我有调用其他工作流程的工作流程时。 当我跨不同逻辑应用标准实例部署 zip 文件时,引用的工作流 URL 始终相同。
如何以非硬编码且在部署中动态更改的方式引用/调用工作流程?我可以使用 workflow() 引用其他工作流程吗?
由于访问键是工作流的属性,而不是逻辑应用标准,我无法将其设置为要在工作流内使用的应用设置或参数。
关于如何绕过这个问题有什么想法吗?
最佳答案
我最终做了以下事情。 我已经创建了 keystore secret 。在这些 key 保管库 secret 中,我存储包含授权 secret 的工作流程 URL。
由于我创建了指向 key 保管库 secret 名称而不是硬编码 URL 的其他工作流,逻辑应用在运行时将查询 key 保管库,从我想要进行身份验证的工作流中检索 URL 并将其用作输入。由于它已经包含签名,因此可以正确进行身份验证。
这可能是一种解决方法,但这是我能够在此操作中取得成功的唯一方法。
对于那些和我有同样问题的人,步骤如下:
- 首先,我开发了从 keyvault 获取包含 url 的 secret 的工作流程
然后它使用 key 作为输入来调用 url。 Secret as input for the url
当我准备好部署工作流程时。我导出它们并将代码放在 Azure Devops 上。
然后在构建管道中我使用以下任务
task: ArchiveFiles@2
displayName: "Archive Functions"
inputs:
rootFolderOrFile: "$(Build.Repository.LocalPath)/LogicApps"
includeRootFolder: false
archiveFile: "$(Build.ArtifactStagingDirectory)/LogicApps.zip"
task: AzureFunctionApp@1
displayName: "Deploy Functions"
inputs:
azureSubscription: "${ { parameters.Subscription }}"
appName: "mylogicappstandard"
package: "$(Agent.BuildDirectory)/${ { parameters.ArtifactName}}/LogicApps.zip"
task: AzureCLI@2
displayName: 'Update Signature url in ${ { parameters.KeyvaultName}}'
inputs:
azureSubscription: "${ { parameters.Subscription }}"
scriptType: 'ps'
scriptLocation: 'inlineScript'
inlineScript: "$(Agent.BuildDirectory)/${ { parameters.ArtifactName}}/Scripts/Get-WorkflowUrlSignature.ps1 $(AzureSubscriptionId) ${ { parameters.ResourceGroup }} mylogicappstandard ${ { parameters.KeyvaultName}}"
您可以在此处找到脚本的详细信息 Get-WorkflowUrlSignature.ps1
[CmdletBinding()]
param (
[Parameter(Mandatory)][string]$SubscriptionId,
[Parameter(Mandatory)][string]$ResourceGroup,
[Parameter(Mandatory)][string]$LogicAppName,
[Parameter(Mandatory)][string]$KeyVaultName
)
$json = az rest --method get --uri "https://management.azure.com/subscriptions/$SubscriptionId/resourceGroups/$ResourceGroup/providers/Microsoft.Web/sites/$LogicAppName/hostruntime/runtime/webhooks/workflow/api/management/workflows?api-version=2018-11-01"
$workflows = $json | convertfrom-json
foreach ($workflow in $workflows.Name){
$uri ="https://management.azure.com/subscriptions/$SubscriptionId/resourceGroups/$ResourceGroup/providers/Microsoft.Web/sites/$LogicAppName/hostruntime/runtime/webhooks/workflow/api/management/workflows/$workflow/triggers/manual/listCallbackUrl?api-version=2018-11-01"
if (az rest --method post --uri $uri){
# Gets the url with signature
$sigurl = az rest --method post --uri $uri | convertfrom-json
$secret = $sigurl.value.Replace('&','"&"')
$workflowName = $workflow.Replace("_","")
#Creates or updates secret in the keyvault
Write-Output "Updating secret $workflowName in the keyvault"
az keyvault secret set --name $workflowName --vault-name $KeyVaultName --value $secret
}else{
Write-Output "The workflow $workflow does not have any trigger url"
}
}
我希望这可以帮助其他人自动化该过程。如果您有更简单的方法或查询访问 key 或网址签名,请告诉我。
关于azure - 逻辑应用标准自动化跨环境工作流引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71355379/