Получение пар ключевых значений из конфигурации приложения 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 в фоновом режиме, поэтому вам нужно установить его в первую очередь.