Azure Apim Set-AzApiManagementPolicy gives Entity with specified identifier not found

846 Views Asked by At

I'm trying to write some PowerShell that will copy an api and policy from one subscription to another.

This is what I have:

Connect-AzAccount
Set-AzContext -Subscription "x"
$ApiMgmtContext = New-AzApiManagementContext -ResourceGroupName "rg-apim-dev-001" -ServiceName "apim-dev-002"
Export-AzApiManagementApi -Context $ApiMgmtContext -ApiId "365-response" -SpecificationFormat OpenApi -SaveAs "C:\robtemp\365-response.yml"
$policy = Get-AzApiManagementPolicy -Context $ApiMgmtContext -ApiId "365-response" -OperationId "invoice"


Set-AzContext -Subscription "y"
$ApiMgmtContext = New-AzApiManagementContext -ResourceGroupName "rg-apim-int-001" -ServiceName "apim-int-001"
Import-AzApiManagementApi -Context $ApiMgmtContext -SpecificationFormat OpenApi -SpecificationPath "C:\robtemp\365-response.yml" -Path "apis"
Set-AzApiManagementPolicy -Context $ApiMgmtContext -ApiId "365-response" -OperationId "invoice" -Policy $policy.ToString()

It is able to populate the $policy variable ok but on the Set-AzApiManagementPolicy call, the following error is thrown:

Set-AzApiManagementPolicy: Error Code: ValidationError Error Message: Entity with specified identifier not found Request Id: 7a0ece56-9e95-4eae-af58-f3b96f3ac23e

1

There are 1 best solutions below

0
Rob Bowman On BEST ANSWER

I needed to copy the source policy to a string rather than reference directly when assigning to the target operation.

The following did the trick:

param ($tempFolder = "c:\robtemp")
Connect-AzAccount
Set-AzContext -Subscription "x"
$ctx = New-AzApiManagementContext -ResourceGroupName "rg-apim-dev-001" -ServiceName "apim-dev-002"
Export-AzApiManagementApi -Context $ctx -ApiId "365-response" -SpecificationFormat OpenApi -SaveAs "$tempFolder/365-response.yml"
$policy = Get-AzApiManagementPolicy -Context $ctx -ApiId "365-response" -OperationId "invoice"
$policyToCopy = $policy.ToString()

Set-AzContext -Subscription "y"
$ctx = New-AzApiManagementContext -ResourceGroupName "rg-apim-int-001" -ServiceName "apim-int-001"
$api = Get-AzApiManagementApi -Context $ctx -Name "365-response"
if ($api) {
  Remove-AzApiManagementApi -Context $ctx -ApiId $api.ApiId
}
Import-AzApiManagementApi -Context $ctx -SpecificationFormat OpenApi -SpecificationPath "$tempFolder/365-response.yml" -Path "apis"
$api = Get-AzApiManagementApi -Context $ctx -Name "365-response"
$operation = Get-AzApiManagementOperation -Context $ctx -ApiId $api.ApiId -OperationId "invoice"
Set-AzApiManagementPolicy -Context $ctx -ApiId $api.ApiId -OperationId $operation.OperationId -Policy $policyToCopy