Получить функцию и ключи хоста функции Azure в Powershell

Я развернул функцию Azure, используя шаблон Arm. Мне нужна функциональная клавиша и ключ хоста развернутой функции Azure в Powershell. В настоящее время я пытаюсь получить ключи из секции вывода шаблона ARM

 "outputs": {
"FunctionAppName": {
  "type": "string",
  "value": "[variables('functionAppName')]"
},
"Key": {
  "type": "string",
  "value": "[listKeys(resourceId('Microsoft.Web/sites', '[variables('functionAppName')]'),'2015-08-01').keys]"
}

}

Я пробовал разные комбинации, но это не удалось. Есть ли способ получить ключи в Powershell?

7 ответов

Решение

Я получил это с помощью следующего:

    "outputs": {
    "FunctionAppName": {
        "type": "string",
        "value": "[parameters('functionName')]"
    },
    "Key": {
        "type": "string",
        "value": "[listsecrets(resourceId('Microsoft.Web/sites/functions', parameters('existingFunctionAppName'), parameters('functionName')),'2015-08-01').key]"
    },        
    "Url": {
        "type": "string",
        "value": "[listsecrets(resourceId('Microsoft.Web/sites/functions', parameters('existingFunctionAppName'), parameters('functionName')),'2015-08-01').trigger_url]"
    }        
}

Я не смог найти ни одного примера. Но, используя вышеизложенное, пример быстрого запуска на GitHub и документацию по функциям ресурсов, а также проб и ошибок, я получил это.

Обратите внимание, что переменные / параметры и имена были изменены.

Я не смог получить принятый ответ, чтобы получить ключ хоста по умолчанию. @4c74356b41 ответ очень близок. Вы можете получить ключи, используя код ниже. Ключ хоста по умолчанию будет в Outputs.functionKeys.Value.functionKeys.default.Value,

  "outputs": {
    "functionKeys": {
      "type": "object",
      "value": "[listkeys(concat(resourceId('Microsoft.Web/sites', variables('functionAppName'), '/host/default'), '2018-11-01')]"
    }
  }

На вопрос, похоже, нет ответа, поскольку он запрашивал функциональный ключ из Powershell, а не из шаблонов ARM. Я использую приведенный ниже сценарий, чтобы получить функциональный ключ от Powershell в Azure DevOps.

$accountInfo = az account show
$accountInfoObject = $accountInfo | ConvertFrom-Json
$subscriptionId  = $accountInfoObject.id

$resourceGroup = "your-resource-group"
$functionName = "your-function-name"

$functionkeylist = az rest --method post --uri "https://management.azure.com/subscriptions/$subscriptionId/resourceGroups/$resourceGroup/providers/Microsoft.Web/sites/$functionName/host/default/listKeys?api-version=2018-11-01"
$keylistobject = $functionkeylist | ConvertFrom-Json
$functionKey = $keylistobject.functionKeys.default

Надеюсь это поможет.

Использование Azure PowerShell

Я хотел бы предложить другой способ решить эту проблему, используя настолько близкую к чистой Azure PowerShell, насколько мне удалось найти. Он по-прежнему зависит от создания «Операции» Azure, но может быть выполнен всего несколькими строками кода.

Примечание. Предполагается, что у вас есть сеанс PowerShell, который уже прошел проверку подлинности. Если вы не видите: Connect-AzAccount для получения дополнительных сведений.

Вариант 1. Получить ключ для приложения-функции для использования со всеми функциями.

Этот пример основан на этой операции: Веб-приложения — список ключей хоста и использование этого командлета PowerShell для выполнения операции: Invoke-AzRestMethod

      ## lookup the resource id for your Azure Function App ##
$resourceId = (Get-AzResource -ResourceGroupName $rg -ResourceName $functionAppName -ResourceType "Microsoft.Web/sites").ResourceId

## compose the operation path for listing keys ##
$path = "$resourceId/host/default/listkeys?api-version=2021-02-01"

## invoke the operation ##
$result = Invoke-AzRestMethod -Path $urlPath -Method POST
if($result -and $result.StatusCode -eq 200)
{
   ## Retrieve result from Content body as a JSON object ##
   $contentBody = $result.Content | ConvertFrom-Json

   ## Output the default function key. In reality you would do something more ##
   ## meaningful with this ##
   Write-Host $contentBody.functionKeys.default
}

Вариант 2. Получить ключ для определенной функции

Этот пример основан на этой операции для извлечения ключа, характерного для функции. Как правило, это лучшая практика, чтобы у вас не было одной клавиши для всех функций. Но есть веские причины, по которым вы можете захотеть и того, и другого. См. эту операцию здесь: Веб-приложения — Список функциональных клавиш

      ## Lookup function name here ##
$functionName = "MyFunction"

## lookup the resource id for your Azure Function App ##
$resourceId = (Get-AzResource -ResourceGroupName $rg -ResourceName $functionAppName -ResourceType "Microsoft.Web/sites").ResourceId

## compose the operation path for listing keys ##
$path = "$resourceId/functions/$functionName/listkeys?api-version=2021-02-01"

## invoke the operation ##
$result = Invoke-AzRestMethod -Path $urlPath -Method POST
if($result -and $result.StatusCode -eq 200)
{
   ## Retrieve result from Content body as a JSON object ##
   $contentBody = $result.Content | ConvertFrom-Json

   ## Output the default function key. In reality you would do something more ##
   ## meaningful with this. ##
   Write-Host $contentBody.default
}

Итак, чтобы это работало для конкретной функции клавиши для MyHttpFunction в приложении MyFunctionApp, Мне пришлось использовать в Outputs раздел шаблона ARM:

      "MyHttpFunctionKey": {
    "type": "string",
    "value": "[listkeys(resourceId('Microsoft.Web/sites/functions', 'MyFunctionApp', 'MyHttpFunction'), '2019-08-01').default]"
}

Если это вызывается из Powershell с помощью New-AzResourceGroupDeployment с параметром -OutVariable arm то следующая команда Powershell распечатает ключ: $arm.Outputs.myHttpFunctionKey.Value

Прежде всего, у вас есть ошибка в вашем синтаксисе:

  "value": "[listKeys(resourceId('Microsoft.Web/sites', variables('functionAppName')),'2015-08-01').keys]"

но это не поможет, я не думаю, что это реализовано для функций Azure, я не уверен на 100% в этом, но мои попытки получить ключи были тщетными

Следующий код получит точный ключ в строковом формате. Я использовал этот ключ для создания теста доступности.

      "outputs": {
      "Key":{
             "type": "string", 
             "value": "[listkeys(concat(resourceId('Microsoft.Web/sites', 'functionAppName'), '/functions', '/FunctionName'), '2018-11-01').default]"    
             }
            }
Другие вопросы по тегам