Получение пар ключевых значений из конфигурации приложения Azure с помощью PowerShell

В модулях зоны доступности нет командлетов для получения пар ключ-значение из конфигурации приложения Azure. Есть ли какие-нибудь другие варианты, кроме AZ CLI? Есть ли способ взаимодействовать со службой из PowerShell?

5 ответов

Решение

Взгляните на модуль Az.AppConfiguration. Я не могу ручаться за его качество или полноту, но он есть. Модуль Az не выглядит так, как будто он включен в качестве зависимости.

Вы можете скачать его из галереи PowerShell с помощью:

Install-Module -Name Az.AppConfiguration -Repository PSGallery -Scope CurrentUser

На данный момент нет поддержки PowerShell для получения ключей и значений из конфигурации приложения. Вызов Azure CLI в PowerShell - это правильный путь. Модуль Az.AppConfiguration поддерживает только операции управления (например, создание хранилища конфигурации приложения и т. Д.).

Запрос отслеживается в GitHub https://github.com/Azure/AppConfiguration/issues/267.

Вот мое решение, использующее строку подключения App Configuration для аутентификации. Вы заинтересованы в.itemsсвойство возвращаемого объекта. В случае пейджинга будетnextссылка там же. Дополнительные сведения см. в документации по адресу https://learn.microsoft.com/azure/azure-app-configuration/rest-api-key-value .

Ключи могут содержать символы косой черты, поэтому они должны быть закодированы в URL-адресе с использованием[System.Net.WebUtility]::UrlEncode($Key)при строительстве$RequestUri.

      function Invoke-AppConfigRequest {
    param(
        [Parameter(Mandatory = $true)] [string] $ConnectionString,  # 'Endpoint=...;Id=...;Secret=...'
        [Parameter(Mandatory = $true)] [string] $RequestUri,        # '/kv?api-version=1.0&key=some-url-encoded-key&label=*'
        [Parameter(Mandatory = $false)] [string] $Method = 'GET',   # 'GET', 'POST'
        [Parameter(Mandatory = $false)] [object] $Body = $null      # Accepts [object] to avoid implicit conversion of $null to empty string
    )

    $ConnectionStringValues = $ConnectionString -split ';' | ForEach-Object { $Tokens = $_ -split '=',2; @{ Key = $Tokens[0]; Value = $Tokens[1] } }
    $Endpoint = ($ConnectionStringValues | Where-Object { $_.Key -eq 'Endpoint' }).Value
    $Credential = ($ConnectionStringValues | Where-Object { $_.Key -eq 'Id' }).Value
    $Secret = ($ConnectionStringValues | Where-Object { $_.Key -eq 'Secret' }).Value
    if ([string]::IsNullOrWhitespace($Endpoint) -or [string]::IsNullOrWhitespace($Credential) -or [string]::IsNullOrWhitespace($Secret)) {
        throw "Invalid App Configuration connection string"
    }

    $UtcNow = (Get-Date).ToUniversalTime().ToString('ddd, d MMM yyyy HH:mm:ss \G\M\T')
    $EndpointHost = $Endpoint -replace '^https?://(.*)$','$1'
    $ContentHash = [Convert]::ToBase64String(
        [System.Security.Cryptography.HashAlgorithm]::Create('sha256').ComputeHash(
            [System.Text.Encoding]::UTF8.GetBytes($(if ($Body -ne $null) { "$Body" } else { '' }))
        )
    )
    $StringToSign = "$Method`n$RequestUri`n$UtcNow;$EndpointHost;$ContentHash"

    $HmacSha256 = New-Object System.Security.Cryptography.HMACSHA256
    $HmacSha256.Key = [Convert]::FromBase64String($Secret)
    $Signature = [Convert]::ToBase64String(
        $HmacSha256.ComputeHash(
            [System.Text.Encoding]::UTF8.GetBytes($StringToSign)
        )
    )

    $Headers = @{
        'Host' = $EndpointHost;
        'x-ms-date' =  $UtcNow;
        'x-ms-content-sha256' = $ContentHash;
        'Accept' = 'application/vnd.microsoft.appconfig.kv+json, application/json, application/problem+json';
        'Authorization' = "HMAC-SHA256 Credential=$Credential&SignedHeaders=x-ms-date;host;x-ms-content-sha256&Signature=$Signature";
    }

    $Uri = "$Endpoint$RequestUri"
    $Response = Invoke-WebRequest -Method $Method -Uri $Uri -Headers $Headers -Body $Body
    if ($Response.StatusCode -eq 200) {
        [System.Text.Encoding]::UTF8.GetString($Response.Content) | ConvertFrom-Json
    }
}

Пример вызова:

      function Get-AppConfigKeyValue {
    param(
        [Parameter(Mandatory = $true)] [string] $ConnectionString,
        [Parameter(Mandatory = $true)] [string] $Key,
        [Parameter(Mandatory = $false)] [string] $Label = ''
    )

    $UrlEncodedKey = [System.Net.WebUtility]::UrlEncode($Key)
    $UrlEncodedLabel = [System.Net.WebUtility]::UrlEncode($Label)

    # https://learn.microsoft.com/azure/azure-app-configuration/rest-api-key-value
    $Method = 'GET'
    $ApiVersion = '1.0'
    $RequestUri = '/kv'
    #if (![string]::IsNullOrWhitespace($UrlEncodedKey)) {
    #    $RequestUri += "/$UrlEncodedKey"  # Strict key/label matching, no support for wildcards like *.
    #}
    $RequestUri += "?api-version=$ApiVersion"
    if (![string]::IsNullOrWhitespace($UrlEncodedKey)) {
        $RequestUri += "&key=$UrlEncodedKey"  # Key filter, accepts "*" to match all keys.
    }
    if (![string]::IsNullOrWhitespace($UrlEncodedLabel)) {
        $RequestUri += "&label=$UrlEncodedLabel"  # Label filter, accepts "*" to match all labels.
    } else {
        $RequestUri += "&label=%00"  # Matches KV without a label.
    }

    (Invoke-AppConfigRequest -ConnectionString $ConnectionString -RequestUri $RequestUri).items
}

В Azure CLI есть команда az appconfig kv listкоторый можно использовать для перечисления всех пар "ключ-значение" из конфигурации приложения. Более подробную информацию об использовании и примеры можно найти здесь.

Эй, я немного опоздал на вечеринку, но я искал то же самое, и в итоге я создал свое собственное решение, потому что данный ответ охватывает только задачи управления, а не поиск данных.

проверить это репо

Он может извлекать значения ключей и разрешать секреты.

Также он может анализировать ссылочные ключи в значениях.

он использует az cli в фоновом режиме, поэтому вам нужно установить его в первую очередь.

Другие вопросы по тегам