Получить функцию и ключи хоста функции 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]"
}
}