0

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

Rob Bowman
  • 7,632
  • 22
  • 93
  • 200

1 Answers1

0

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
Rob Bowman
  • 7,632
  • 22
  • 93
  • 200