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

Резюме: я создаю функцию непосредственно в Visual Studio, которая по замыслу приводит к управлению функциями только для чтения на портале. У меня вопрос: как легко создать функциональную клавишу для указанного веб-перехватчика?

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

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

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

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


comment
Вам нужен образец кода для генерации ключа с помощью kudu api? это единственный надежный вариант, который я нашел и до сих пор использовал в производстве.   -  person Thomas    schedule 09.05.2018
comment
Есть ли вариант сделать функцию Read/Write из портала? Вы можете сделать это в настройках приложения, а также в docs .microsoft.com / ru-ru / azure / azure-functions /   -  person Vladislav    schedule 09.05.2018
comment
@ Томас, да, пожалуйста. Хотя я не получил отсюда образцы PowerShell для работы.   -  person ThatCreole    schedule 09.05.2018
comment
@Vladislav Я тоже пробовал. Когда вы это сделаете, портал сообщает, что ваше приложение в настоящее время находится в режиме чтения / записи, потому что вы установили режим редактирования на чтение / запись, несмотря на то, что у вас есть сгенерированный function.json. Изменения, внесенные в function.json, не будут учтены средой выполнения функций.   -  person ThatCreole    schedule 09.05.2018


Ответы (1)


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

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

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

  1. Получить учетные данные публикации
  2. Создайте токен авторизации Kudu API
  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
person Thomas    schedule 10.05.2018
comment
Спасибо, Томас. Так что это меня очень близко. Я думаю, что меня зацепил тот факт, что я пытаюсь запустить это в слоте развертывания. Я изменил приведенный выше код, чтобы сделать $resourceType = "Microsoft.Web/sites/slots/config" и $resourceName = "$functionappName/<myslot>/publishingcredentials". Это, по крайней мере, позволяет мне получить законный JWT. Однако POST для генерации нового ключа в этом месте $siteBaseUrl/admin/host/keys/$keyname кажется неправильным. Я уверен, что где-то там есть прорезь, но это неочевидно. - person ThatCreole; 10.05.2018
comment
Да, вам может потребоваться изменить это местоположение $siteBaseUrl/admin/host/keys/$keyname, чтобы включить в него слот. не совсем уверен, как это сделать. посмотрю сейчас - person Thomas; 10.05.2018
comment
@ThatCreole, просто попытался просто изменить resourceType и resourceName, и я вижу свой новый ключ на портале - person Thomas; 10.05.2018
comment
Подождите, какие пути вы использовали ?! - person ThatCreole; 10.05.2018
comment
Извините за поздний ответ, я обновил свой скрипт для работы со слотом - person Thomas; 11.05.2018
comment
ваш наш сценарий и мой были в основном одинаковыми, но последний бит (POST для создания ключа) не удался. После того, как я немного отладил, выяснилось, что он запутался из-за того, что у меня включен EasyAuth. Вместо того чтобы тратить время на выяснение того, какой еще токен мне нужен, я временно отключил аутентификацию, запустил его, получил ключ и снова включил аутентификацию. В конечном итоге это решило мою проблему. Спасибо! - person ThatCreole; 11.05.2018