Как создать функцию Azure, функциональную клавишу, когда для ваших функций установлено значение "Только чтение"

Описание: я создаю функцию непосредственно в Visual Studio, что в результате приводит к управлению функциями только для чтения на портале. Мой вопрос заключается в том, как легко создать функциональную клавишу для указанного webhook?

Контекст: я пытаюсь подключить общий веб-крючок к Event Grid. Этот процесс привел меня к необходимости запуска SubscriptionValidationEvent, который, в свою очередь, требует, чтобы мой webhook предоставил "код" в URL, который, я полагаю, является функциональной клавишей.

Еще до того, как я проголосовал, я очень хорошо знаю, что здесь уже есть несколько вариантов этого вопроса, на которые мы уже отвечали. Я попробовал их все, и по тем или иным причинам ни одно из решений, включающих в себя написание PowerShell для плохо документированного API ключей с использованием кредитов Kudu, похоже, не работает для меня.

Я надеюсь, что кто-то знает способ решить эту проблему с помощью CLI или даже проще, создавая functionName.json файл вручную и сбросив его в каталог секретов.

И, наконец, настолько заманчиво, насколько я могу использовать предварительную привязку EventGrid, в настоящее время я не могу запустить предварительный код в своей среде.

1 ответ

Решение

Нашел эту интересную статью о том, как управлять клавишами функций Azure из Powershell:

Также официальная документация (было трудно найти эту вики):

Вот ключевые моменты:

  1. Получить учетные данные публикации
  2. Создать токен авторизации API Kudu
  3. Вызовите Kudu /api/functions/admin/token, чтобы получить JWT, который можно использовать с API-интерфейсом функций.
  4. Тогда вы можете делать все, что хотите

Вот мой существующий скрипт

    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