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
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