Azure API 管理创建/更新策略

问题描述 投票:0回答:1

我们正在将发布管道从 Azure 内置发布迁移到基于 YAML 代码的管道。在我们开始研究 API 管理之前,一切进展顺利。我们已成功使用 az apim import 导入 OpenAPI 端点,但正在努力寻找导入策略的解决方案。

旧的发布管道使用 Set-AzApiManagementPolicy 函数,但我们渴望摆脱这一点。作为旁注,我们确实尝试使用此功能,但它抱怨必须使用 Connect-AzAccount 登录。第一个调用是在 AzureCli@2 任务中进行的,没有 Connect-AzAccount 调用。旧版本工作正常并创建了策略。

查看此 github 问题,这意味着 az apim 将扩展以支持政策,但据我们所知,这还没有发生。

https://github.com/Azure/azure-cli/issues/14695

该问题还讨论了使用 REST 端点来更新策略,这似乎是一个很好的折中办法。其余 API 的详细信息请参见此处。

https://learn.microsoft.com/en-us/rest/api/apimanagement/policy/create-or-update?view=rest-apimanagement-2022-08-01&tabs=HTTP

尽管那篇文章似乎遗漏了早期问题报告中包含的 apis 参数。

因此,我们已经配置了包含 apis 参数的 url,并使用 az rest --method put 来发出请求。一个简单的政策主体定义为:

$xml = "<policies><inbound/><backend><forward-request/></backend><outbound/></policies>" | Out-String
$body='{"properties":{"format":"xml","value":"' + $xml + '"}}' | Out-String
$body=$body.Replace('"','\"') | Out-String

所以我们的 az 休息电话是:

az rest --method PUT --uri $uri --body $body

发出后会生成以下错误:

az : < was unexpected at this time.
At C:\Data\apims1.ps1:11 char:1
+ az rest --method PUT --uri $uri --body $body
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (< was unexpected at this time.:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

如果我们修改正文以不包含 xml,如下所示:

$body='{"properties":{"format":"xml","value":""}}' | Out-String
$body=$body.Replace('"','\"') | Out-String

它会引发以下错误,这意味着它需要 xml,因为它找不到根元素:

az : ERROR: Bad Request({"error":{"code":"ValidationError","message":"One or more fields contain incorrect values:","details":[{"code":"ValidationError","target":"representation","message":"Root element is missing."}]}})
At C:\Data\apims1.ps1:11 char:1
+ az rest --method PUT --uri $uri --body $body
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (ERROR: Bad Requ... missing."}]}}):String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

我们尝试使用 & 符号 lt/gt 以及 & 符号 # 60/62 对 < and > 进行编码;还报告了其他错误。

非常感谢您为解决此问题提供任何帮助。 TIA

azure powershell azure-api-management azure-pipelines-yaml
1个回答
0
投票

我也为

az rest
苦苦挣扎,但我认为你不应该对
Invoke-RestMethod
有这样的问题。试试这个:

$accessToken = (az account get-access-token | ConvertFrom-Json).accessToken
$headers = @{Authorization="Bearer $accessToken"}
Invoke-RestMethod -Method Put -Uri $uri -Body $body -Headers $headers
© www.soinside.com 2019 - 2024. All rights reserved.