我正在使用 REST 创建或更新 Rest api 在我的 PowerShell 脚本中创建 APIM 命名值
脚本:
$requestPayload = @{
properties = @{
displayName = $displayname
keyVault = @{
secretIdentifier = $SecretIdentifier
}
secret = $true
}
}
# Convert the hash table to a JSON string
$jsonPayload = $requestPayload | ConvertTo-Json -Depth 5
# Create/Update named values
$baseurl="https://management.azure.com/subscriptions/";
$headers = @{ "Authorization" = "Bearer " + $accesstoken }$url=$baseurl+$SubscriptionId+"/resourceGroups/"+$ResourceGroupName+"/providers/Microsoft.ApiManagement/service/"+$APIMResourceName+"/namedValues/$($Name)?api-version=2022-08-01";
$result=Invoke-WebRequest $url -Method 'Put' -Headers $headers -Body $jsonPayload -ContentType "application/json" -UseBasicParsing
Write-Output( $result)
此脚本在我的 3 个环境中运行得非常好(预生产订阅中的实验室和测试以及生产订阅中的 PRV),但在生产环境中它不起作用。
所有 4 个环境中的输出 $result 都是相同的,即接受响应代码 202。除了生产环境之外,命名值是使用 keyvault 秘密引用正确创建的,只有在生产环境中它才不起作用。我无法找出实际原因,因为此 api 返回 202 接受的响应。在 APIM 服务中,我还检查了活动日志,我还可以看到已接受和已启动的日志,但未成功或完成或任何错误日志。
如果不知道错误详细信息,就很难解决这个问题。
我还验证了 apim 实例,它具有在 keyvault 中设置的获取和列出访问策略。
请告诉我有什么方法可以找出错误所在。
202 响应应带有 Location 标头,指向您可以监控进程的 URL。使用 GET 请求进行轮询,直到您得到除 202 之外的任何其他内容,并且该响应应包含错误信息。
如果我不得不猜测,您在产品中的 APIM 服务无权访问您为其创建命名值的 KeyVault。确保 APIM 服务已启用托管身份。如果您的 KeyVault 在访问策略中配置,请确保将 prod APIM 服务的身份添加到 ACL 以读取机密值。如果您的 KeyVault 处于 RBAC 模式,请确保在访问控制中至少添加 APIM 服务“秘密用户”角色。