Как создать функцию Azure, функциональную клавишу, когда для ваших функций установлено значение "Только чтение"
Описание: я создаю функцию непосредственно в Visual Studio, что в результате приводит к управлению функциями только для чтения на портале. Мой вопрос заключается в том, как легко создать функциональную клавишу для указанного webhook?
Контекст: я пытаюсь подключить общий веб-крючок к Event Grid. Этот процесс привел меня к необходимости запуска SubscriptionValidationEvent, который, в свою очередь, требует, чтобы мой webhook предоставил "код" в URL, который, я полагаю, является функциональной клавишей.
Еще до того, как я проголосовал, я очень хорошо знаю, что здесь уже есть несколько вариантов этого вопроса, на которые мы уже отвечали. Я попробовал их все, и по тем или иным причинам ни одно из решений, включающих в себя написание PowerShell для плохо документированного API ключей с использованием кредитов Kudu, похоже, не работает для меня.
Я надеюсь, что кто-то знает способ решить эту проблему с помощью CLI или даже проще, создавая functionName.json
файл вручную и сбросив его в каталог секретов.
И, наконец, настолько заманчиво, насколько я могу использовать предварительную привязку EventGrid, в настоящее время я не могу запустить предварительный код в своей среде.
1 ответ
Нашел эту интересную статью о том, как управлять клавишами функций Azure из Powershell
:
Также официальная документация (было трудно найти эту вики):
Вот ключевые моменты:
- Получить учетные данные публикации
- Создать токен авторизации API Kudu
- Вызовите Kudu /api/functions/admin/token, чтобы получить JWT, который можно использовать с API-интерфейсом функций.
- Тогда вы можете делать все, что хотите
Вот мой существующий скрипт
Param(
[string] [Parameter(Mandatory=$true)] $resourceGroupName,
[string] [Parameter(Mandatory=$true)] $functionappName,
[string] [Parameter(Mandatory=$true)] $keyname,
[string] [Parameter()] $slot
)
if (![string]::IsNullOrWhiteSpace($slot)){
$apiBaseUrl = "https://$functionappName-$slot.scm.azurewebsites.net/api"
$siteBaseUrl = "https://$functionappName-$slot.azurewebsites.net"
$resourceType = "Microsoft.Web/sites/slots/config"
$resourceName = "$functionappName/$slot/publishingcredentials"
}
else {
$apiBaseUrl = "https://$functionappName.scm.azurewebsites.net/api"
$siteBaseUrl = "https://$functionappName.azurewebsites.net"
$resourceType = "Microsoft.Web/sites/config"
$resourceName = "$functionappName/publishingcredentials"
}
Write-Host "Get the publishing credentials"
$publishingCredentials = Invoke-AzureRmResourceAction -ResourceGroupName $resourceGroupName -ResourceType $resourceType -ResourceName $resourceName -Action list -ApiVersion 2015-08-01 -Force
Write-Host "Generate the Kudu API Authorisation Token"
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $publishingCredentials.Properties.PublishingUserName, $publishingCredentials.Properties.PublishingPassword)))
Write-Host "Call Kudu /api/functions/admin/token to get a JWT that can be used with the Functions Key API"
$jwt = Invoke-RestMethod -Uri "$apiBaseUrl/functions/admin/token" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -Method GET
Write-Host "Creates or updates an host key at the specified resource with an auto generated key"
$mynewkey = (Invoke-RestMethod -Uri "$siteBaseUrl/admin/host/keys/$keyname" -Headers @{Authorization=("Bearer {0}" -f $jwt)} -Method Post).value
РЕДАКТИРОВАТЬ
Вновь созданные функциональные приложения по умолчанию используют TLS 1.2, поэтому вам нужно добавить эту строку вверху скрипта Powershell:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12