azure-api-managementibm-api-management

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


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


Solution

  • 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