Как создать функциональную клавишу azure в шаблоне ARM? - PullRequest
2 голосов
/ 09 января 2020

Я боролся с этим весь день, я пытаюсь создать функциональную клавишу Function App из шаблона ARM.

До сих пор я был в состоянии создать свою функциональную клавишу на уровне хоста, используя следующий шаблон:

    {
      "type": "Microsoft.Web/sites/host/functionKeys",
      "apiVersion": "2018-11-01",
      "name": "[concat(parameters('appServiceName'), '/default/PortalFunctionKey')]",
      "properties": {
        "name": "PortalFunctionKey"
      }

Затем я нашел пару статей и ссылку, показывающую, что это возможно через API: https://github.com/Azure/azure-functions-host/wiki/Key-management-API

И я смог сгенерировать это через API-интерфейс: https://{myfunctionapp}.azurewebsites.net/admin/functions/{MyFunctionName}/keys/{NewKeyName}?code={_masterKey}

Но я не могу ради себя понять, как это сделать в моем шаблоне ARM! Я пробовал различные комбинации типа и имени, например:

    {
      "type": "Microsoft.Web/sites/host/functionKeys",
      "apiVersion": "2018-11-01",
      "name": "[concat(parameters('appServiceName'), '/{myfunctionName}/PortalFunctionKey')]",
      "properties": {
        "name": "PortalFunctionKey"
      }

или / functions / {myfunctionName} / PortalFunctionKey, как предлагается в некоторых статьях, и я просто не могу заставить их работать, могу Не можете найти много документации по ARM. Microsoft.Web / sites / host / functionKeys.

Удалось ли кому-нибудь создать ключ FUNCTION (не host) в шаблоне ARM? Я бы с удовольствием услышал, как вы туда попали:)!

В основном: Function Keys

Заранее большое спасибо,

Эммануил

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

Так что в настоящий момент невозможно создать функциональную клавишу уровня функции в шаблоне ARM.

Поэтому я создал запрос функции, по которому можно проголосовать, если вы заинтересованы в этом: https://feedback.azure.com/forums/169385-web-apps/suggestions/39789043-create-function-level-keys-for-azure-functions-in

Пока что мы создаем функциональные клавиши функционального уровня с помощью шага задачи развертывания powershell. вот как.

добавьте выходной параметр в шаблон ARM:

  "outputs": {
    "masterKey": {
      "type": "string",
      "value": "[listkeys(concat(resourceId(resourceGroup().name, 'Microsoft.Web/sites', parameters('appServiceName')), '/host/default'), '2018-11-01').masterKey]"
    },
    "appServiceName": {
      "type": "string",
      "value": "[parameters('appServiceName')]"
    },
    "functionKeys": {
      "type": "array",
      "value": [
        {
          "functionName": "myFunctionName",
          "keys": [ "FunctionKeyName1", "FunctionKeyName2" ]
        }
      ]
    }
  }

Добавьте следующий файл сценария PS в ваш проект развертывания:

param (
    [Parameter(Mandatory=$true)]
    [string]
    $armOutputString
)

Write-Host $armOutputString
$armOutputObj = $armOutputString | convertfrom-json
Write-Host $armOutputObj

$masterKey = $armOutputObj.masterKey.value
$appServiceName = $armOutputObj.appServiceName.value

$httpHeaders = @{
    "x-functions-key" = $masterKey
}
$contentType = "application/json; charset=utf-8"

foreach($function in $armOutputObj.functionKeys.value){

    $retryCount = 5;
    while ($true) {
        try {
            $uriBase = "https://$($appServiceName).azurewebsites.net/admin/functions/$($function.functionName)/keys"
            $existingKeys = Invoke-RestMethod -Method Get -Uri $uriBase -Headers $httpHeaders -ContentType $contentType
            break;
        }
        catch {
            if ($_.Exception.Response.StatusCode.value__ -eq 502) {
                if ($retryCount-- -eq 0) {
                    throw;
                }
                else {
                    Write-Output ("Retry" + ": " + $_.Exception.Response.StatusCode + "; attempts=$retryCount")
                    [System.Threading.Thread]::Sleep(1000);
                    continue;
                }
            }
            else {
                throw;
            }
        }
    }

    foreach ($keyname in $function.keys){
        $keyExists = 0
        foreach($exstingKey in $existingKeys.keys){
            if($exstingKey.name -eq $keyname){
                $keyExists = 1
               Write-Host  "key $($keyname) already exists"
            }
        }

        if($keyExists -eq 0){
            $uri = "$($uriBase)/$($keyname)?code=$($masterKey)";
            Write-Host  "Adding $($keyname) key"
            Invoke-RestMethod -Method Post -Uri "$($uriBase)/$($keyname)" -Headers $httpHeaders -ContentType $contentType;
        }
    }
}

Сценарий обеспечивает что ключ не будет перезаписан, если он уже существует, и будет повторять попытку в случае сбоя (функция ДОЛЖНА существовать и работать, чтобы API работал).

В вашей группе ресурсов * Azure развертывание"задача, в разделе" Advanced"set" Выводы развертывания"в" armDeployOutput".

enter image description here

Добавьте задачу Powershell, ваш путь к сценарию к файлу powershell в вашем проекте развертывания и установите для « Аргументы » значение « -armOutputString '$ (armDeployOutput) ' ".

enter image description here

И все.

0 голосов
/ 10 января 2020

Чтобы решить эту проблему, вы можете обратиться к этой проблеме GitHub. Первый выпуск и Второй выпуск , все эти проблемы связаны с тем, как получить функциональную клавишу в шаблоне ARM.

А пока пример получения ключа значение, как показано ниже:

"properties": {
        "contentType": "text/plain",
        "value": "[listkeys(concat(variables('functionAppId'), '/host/default/'),'2016-08-01').functionKeys.default]"
        }

или ниже, чтобы получить ключевой объект.

"functionkeys": {
            "type": "object",
            "value": "[listkeys(concat(variables('functionAppId'), '/host/default'), '2018-11-01')]"                                                                                }
    }

Вы можете попробовать, надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...