Почему для некоторых команд интерфейса командной строки Azure требуется вход в систему с помощью az

В нашем конвейере выпуска VSTS мы хотим вызвать сценарий PowerShell, который добавляет функциональный ключ для одной из моих функций Azure (с помощью API-интерфейса управления ключами).

Я создал сценарий на основе этой статьи: https://www.markheath.net/post/managing-azure-function-keys

Param(
    [string] [Parameter(Mandatory=$true)] $ResourceGroup,
    [string] [Parameter(Mandatory=$true)] $AppName,
    [string] [Parameter(Mandatory=$true)] $FunctionName,
    [string] [Parameter(Mandatory=$true)] $KeyName,
    [string] [Parameter(Mandatory=$true)] $KeyValue
    )

    function getAuthenticationToken([string]$appName, [string]$resourceGroup)
    {
    $user = az webapp deployment list-publishing-profiles -n $appName -g $resourceGroup `
            --query "[?publishMethod=='MSDeploy'].userName" -o tsv

    $pass = az webapp deployment list-publishing-profiles -n $appName -g $resourceGroup `
            --query "[?publishMethod=='MSDeploy'].userPWD" -o tsv

    $pair = "$($user):$($pass)"
    $encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($pair))

    $jwt = Invoke-RestMethod -Uri "https://$appName.scm.azurewebsites.net/api/functions/admin/token" -Headers @{Authorization=("Basic {0}" -f $encodedCreds)} -Method GET

    return $jwt
}

function setFunctionKey([string]$appName, [string]$functionName, [string] $keyName, [string]$keyValue, [string]$jwt)
{
    $body = (@{
        "name" = $keyName
        "value" = $keyValue
    } | ConvertTo-Json)

    #Setting the SecurityProtocol is a workaround for calling Azure APIs, I think?
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    try {
        Invoke-RestMethod -Uri "https://$appName.azurewebsites.net/admin/functions/$functionName/keys/$keyName/" `
            -Headers @{Authorization=("Bearer $jwt")} `
            -Method PUT `
            -ContentType "application/json" `
            -Body $body
    } catch {
        $_.Exception | Format-List -Force
    }
}

$jwt = getAuthenticationToken $AppName $ResourceGroup
setFunctionKey $AppName $FunctionName $KeyName $KeyValue $jwt
Write-Host "Specified key '$KeyName' has been added to $FunctionName"

Работает локально, но при запуске VSTS выдает ошибку при вызове

$user = az webapp deployment list-publishing-profiles -n $appName -g $resourceGroup `
                --query "[?publishMethod=='MSDeploy'].userName" -o tsv

с сообщением:

ОШИБКА. Запустите "az login", чтобы настроить учетную запись.

У нас есть и другие работающие вызовы azure cli, например база данных az cosmosdb, поэтому я предполагаю, что наши подключения по принципу обслуживания на месте. В чем может быть проблема?


person Kimmen    schedule 22.08.2018    source источник


Ответы (2)


Похоже, у нас была старая версия PowerShell, содержащая ошибку, которая сохраняет старый контекст аутентификации соединения службы при создании новой аутентификации соединения службы, что я и сделал в этом случае.

Итак, мы обновили Powershell в наших агентах сборки, и у нас все получилось!

person Kimmen    schedule 27.08.2018

Из документа, который вы разместили выше, есть кое-что, что вы могли пропустить.

Первый шаг - нам нужно получить учетные данные для вызова Kudu API. Если вы прошли аутентификацию с помощью Azure CLI, вы можете сделать это, вызвав команду az webapp deployment list-publishing-profiles и извлекая userName и userPWD для MSDeploy. Вам необходимо указать имя приложения-функции и имя группы ресурсов.

Похоже, вам следует аутентифицировать Azure CLI перед их использованием.

person Charles Xu    schedule 22.08.2018
comment
Я предполагаю, что все вызовы Azure CLI (влияющие на среду) должны быть аутентифицированы? Я предполагаю, что в этом случае используются разные уровни аутентификации (из-за отсутствия правильного термина)? - person Kimmen; 23.08.2018
comment
@Kimmen Да, если вы хотите использовать Azure CLI, вам сначала нужно пройти аутентификацию. - person Charles Xu; 23.08.2018
comment
Что ж, у меня есть другие команды azure cli, работающие в других задачах PowerShell, например база данных az cosmosdb .. работает. Установка параметров подключения службы, разве это не предполагает аутентификацию задач PowerShell? - person Kimmen; 23.08.2018
comment
@Kimmen Используете ли вы команду az cosmosdb database в другом сеансе или в том же сеансе? Вы можете убедиться, что вы уже прошли аутентификацию, прежде чем выполнять команду. - person Charles Xu; 23.08.2018
comment
Тот же сеанс. - person Kimmen; 27.08.2018