使用PowerShell从Azure应用配置获取键值对

6pp0gazn  于 2023-10-22  发布在  Shell
关注(0)|答案(6)|浏览(137)

AZ模块中没有任何小工具可以从Azure应用配置中获取键值对。除了AZ CLI,还有其他选择吗?有没有一种方法可以与PowerShell的服务交互?

vsnjm48y

vsnjm48y1#

目前没有PowerShell支持从应用程序配置中获取键值。在PowerShell中调用Azure CLI是正确的方法。Az.AppConfiguration模块只支持管理操作(例如,创建应用程序配置存储等)。
请求在GitHub https://github.com/Azure/AppConfiguration/issues/267中跟踪。

dgenwo3n

dgenwo3n2#

嘿,我有点迟到了,但我一直在寻找同样的东西,我最终创建了自己的解决方案,因为给定的答案只涵盖了管理任务,而不是数据检索。
看看这个repo
它可以获取密钥值并解析秘密。
它还可以解析值中引用的键。
它在后台使用Aztek,所以你需要先安装它。

35g0bw71

35g0bw713#

下面是我的解决方案,使用应用程序配置连接字符串进行身份验证。您对返回对象的.items属性感兴趣。在分页的情况下,也会有一个next链接。有关详细信息,请参阅https://learn.microsoft.com/azure/azure-app-configuration/rest-api-key-value上的文档
键可以包含斜杠字符,因此在构建$RequestUri时需要使用[System.Net.WebUtility]::UrlEncode($Key)对其进行URL编码。

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
}
qybjjes1

qybjjes14#

Azure CLI有一个命令az appconfig kv list,可用于列出应用程序配置中的所有键值。关于用法和示例的更多细节可以在这里找到。

e4yzc0pl

e4yzc0pl5#

新版本的az.appconfiguration模块提供了此功能。首先安装模块,如果您已经安装了它,请使用-Force开关:

install-module -name az.appconfiguration -Force

接下来,您可以使用端点查询应用配置存储:

Get-AzAppConfigurationKeyValue -Endpoint "https://appconfigname.azconfig.io"

您还可以使用标签和通配符:

Get-AzAppConfigurationKeyValue -Endpoint "https://appconfigname.azconfig.io" -Label "dev" -key "serverWeb*"

注意:当我试图获取所有KeyValues时,我遇到了一些错误,我怀疑它检索的值有一个最大值。使用标签和关键字过滤器,它工作得很好。

ki0zmccv

ki0zmccv6#

查看Az.AppConfiguration模块。我不能保证它的质量或多么完整,但它就在那里。Az模块看起来不像是作为依赖项包含的。
您可以从PowerShell Gallery下载:

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

相关问题