首页 > 解决方案 > 获取 ARM 中函数应用程序的 Webhook url 以用于事件网格订阅

问题描述

我正在尝试自动部署我们的环境 vir ARM 模板。我可以部署事件网格和函数应用,但现在我需要在部署函数应用后将函数应用订阅到事件网格。有没有办法获取函数应用程序的 webhook url

  1. 通过 ARM
  2. 发布管道中的其他一些组件(Powershell)

一旦我们有了 webhook url,我们就可以通过 ARM 创建订阅 - 但是要访问正确的 url 似乎是我们落伍的地方。

请提供任何帮助

标签: azureazure-functionsazure-eventgrid

解决方案


在上面@Van 和@Barrie 的答案的帮助下,我设法完成了这项工作。

此脚本从 azure api 返回 masterkey 和 defaultkey,这使您能够从发布管道中的 functionApp/webApp 创建 eventgrid 订阅。

Van 的脚本(7 月 30 日)适用于 FA 版本 1,但不适用于 FunctionApps V2(api 中有所更改)。在 V2 中使用此脚本时,错误是:

运行时密钥存储在 blob 存储中。此 API 不支持此配置。请将环境变量 AzureWebJobsSecretStorageType 值更改为“文件”。

我修改了这个脚本,现在它适用于 V2:

#DEBUG: when debugging (running in powershell on local pc) you need to comment out the next line by starting the line with #
param($resourceGroupName, $webAppname)

function Get-PublishingProfileCredentials($resourceGroupName, $webAppName){
        $resourceType = "Microsoft.Web/sites/config"
        $resourceName = "$webAppName/publishingcredentials"
        $publishingCredentials = Invoke-AzureRmResourceAction -ResourceGroupName $resourceGroupName -ResourceType $resourceType -ResourceName $resourceName -Action list -ApiVersion 2015-08-01 -Force
        return $publishingCredentials
}

function Get-KuduApiAuthorisationHeaderValue($resourceGroupName, $webAppName){
        $publishingCredentials = Get-PublishingProfileCredentials $resourceGroupName $webAppName
        return ("Basic {0}" -f [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $publishingCredentials.Properties.PublishingUserName, $publishingCredentials.Properties.PublishingPassword))))
}

function Get-MasterAPIKey($kuduApiAuthorisationToken, $webAppName ){    
        $bearerToken = Invoke-RestMethod -Uri https://$webAppName.scm.azurewebsites.net/api/functions/admin/token  -Headers @{"Authorization"=$kuduApiAuthorisationToken;"If-Match"="*"} 

        $masterkeyResponse = Invoke-RestMethod -Method GET -Headers @{Authorization=("Bearer {0}" -f $bearerToken)} -Uri "https://$webAppName.azurewebsites.net/admin/host/systemkeys/_master" 
        $masterKeyValue = $masterkeyResponse.value
        return $masterKeyValue
}

function Get-HostAPIKeys($kuduApiAuthorisationToken, $webAppName, $masterKey ){
        $apiUrl = "https://$webAppName.azurewebsites.net/admin/host/keys?code=$masterKey"
        $result = Invoke-WebRequest $apiUrl
        return $result
}

#DEBUG: when debugging this in powershell on my local pc I use this to authenticate (remove # to uncomment the next line):
#Login-AzureRmAccount -SubscriptionName "Insert_Subscription_Name_Here"


#DEBUG: when debugging you need to set these parameters:
# $resourceGroupName = "Insert_ResourceGroup_Name_Here"
# $webAppname = "Insert_FunctionApp_Name_Here"


#Auth Header
$kuduToken = Get-KuduApiAuthorisationHeaderValue $resourceGroupName $webAppName

#MasterKey
$masterKey = Get-MasterAPIKey $kuduToken $webAppName
Write-Host "masterKey = " $masterKey

#Default Key
$result = Get-HostAPIKeys $kuduToken $webAppName $masterkey
$keysCode =  $result.Content | ConvertFrom-Json
Write-Host "default Key = " $keysCode.Keys[0].Value

#Set Return Values:
$faMasterKey = $masterkey
$faDefaultKey = $keysCode.Keys[0].Value

Write-Output ("##vso[task.setvariable variable=fa_MasterKey;]$faMasterKey")
Write-Output ("##vso[task.setvariable variable=fa_DefaultKey;]$faDefaultKey")

这个剧本和范的剧本只有很小的区别。主要区别在于此脚本将在 Azure CLI Functions V2 上运行。更多信息:https ://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-event-grid


推荐阅读