Migrar APis /Policies de uma instancia do APIM para outra

power shell

Wilson Santos
7 min readJun 21, 2021

Gerenciar o fluxo de desenvolvimento de APIs em um gatway como o APIM é uma tarefa difícil, é muito provavel que será necessário migrar as politicas, named Values, tags etc. toda a camada de desenvolvimento do APIM entre diferentes intancias, para isso vamos explorar um conjunto de tecnicas que podem ser uteis para montar uma estratégia de CI/CD para o APIM.

Usando os comandos AzureRmApiManagement

Primeiro o Power Shell, para isso vamos abrir um console do PS no windows local mesmo e usar alguns comandos;

Connect-AzureRmAccount

Esse comando permite conetar no azure , para isso seu PS precisa ter um modulo chamado AzureRM, caso não tenha basta instalar usando o comando

Install-Module -Name <nameModule> -AllowClobber

Apos conectar você pode acessar muitos recursos do painel de administração do azure , como Parar , iniciar aplicações , Criar aplicações,Criar Banco de dados , Deploys com Slots enfim quase tudo esta disponível desse modo.

#Comando de Apoio para se Conectar no Azure escolher a Assinatura.#https://docs.microsoft.com/pt-br/powershell/azure/azurerm/authenticate-azureps?view=azurermps-6.13.0#Connect-AzureRmAccount#Select-AzureRmSubscription -TenantId <id>#Select-AzureRmSubscription -SubscriptionId <id>#Get-AzureRmContext#Get-AzureRmSubscription#01- Deleta Arquivosdel "$PSScriptRoot\0123456789.wadl"del "$PSScriptRoot\myPolicy.xml"#https://docs.microsoft.com/en-us/powershell/module/azurerm.apimanagement/get-azurermapimanagementapi?view=azurermps-6.13.0$ApiMgmtContextsm = New-AzureRmApiManagementContext -ResourceGroupName "pocs" -ServiceName "apim-sample-main"#Get-AzureRmApiManagementApi -Context $ApiMgmtContextsm#02- Exporta a estrutura da API auth da origem apim-sample-main#https://docs.microsoft.com/en-us/powershell/module/azurerm.apimanagement/Export-AzureRmApiManagementApi?redirectedfrom=msdn&view=azurermps-6.13.0Export-AzureRmApiManagementApi -Context $ApiMgmtContextsm -ApiId "auth" -SpecificationFormat "Wadl" -SaveAs "$PSScriptRoot\0123456789.wadl"#03- Remove a API auth no destino smartsecretary-apim#https://docs.microsoft.com/en-us/powershell/module/azurerm.apimanagement/remove-azurermapimanagementpolicy?view=azurermps-6.13.0$apimContextss = New-AzureRmApiManagementContext -ResourceGroupName "pocs" -ServiceName "smartsecretary-apim"Remove-AzureRmApiManagementPolicy  -Context $apimContextss -ApiId "auth"#04- Importa a estrutura da API auth no destino smartsecretary-apim#https://docs.microsoft.com/en-us/powershell/module/azurerm.apimanagement/Import-AzureRmApiManagementApi?redirectedfrom=msdn&view=azurermps-6.13.0#$apimContextss = New-AzureRmApiManagementContext -ResourceGroupName "pocs" -ServiceName "smartsecretary-apim"Import-AzureRmApiManagementApi -Context $apimContextss -SpecificationFormat "Wadl" -SpecificationPath "$PSScriptRoot\0123456789.wadl" -Path "apis" -ApiId "auth"#05- Obtem a política da API autn da origem apim-sample-main#https://docs.microsoft.com/en-us/powershell/module/azurerm.apimanagement/get-azurermapimanagementpolicy?view=azurermps-6.13.0Get-AzureRmApiManagementPolicy -Context $ApiMgmtContextsm -ApiId "auth" -SaveAs "$PSScriptRoot\myPolicy.xml"#06- Seta a política da API autn no destino smartsecretary-apim#https://docs.microsoft.com/en-us/powershell/module/az.apimanagement/set-azapimanagementpolicy?view=azps-6.1.0#$apimContextss = New-AzureRmApiManagementContext -ResourceGroupName "pocs" -ServiceName "smartsecretary-apim"Set-AzureRmApiManagementPolicy -Context $apimContextss -PolicyFilePath "$PSScriptRoot\myPolicy.xml" -ApiId "auth"

Migração de tags

  1. Criar tags no APIM
$tag = "nova_tag"
$prop = @{ Name="$tag"}
New-AzResource -PropertyObject $prop -ResourceGroupName "pocs" -ResourceType Microsoft.ApiManagement/service/tags -ResourceName "smartsecretary-apim/$tag" -ApiVersion 2020-12-01 -Force

2. Associa com a API

New-AzResource -ResourceGroupName "pocs" -ResourceType Microsoft.ApiManagement/service/apis/tags -ResourceName "smartsecretary-apim/777/$tag" -Force

Contribuição de um amigo aqui da firma , James Jodai, valeu!

Rodando Comados AzureRM no Linux

O modulo AzureRM é feito em .net 4.7 e portando não é Cross-platform, mas para salvar nossa sexta feira temos o modulo Az que pode ser instalado no Linux ,pois esse e feito em .net core.

Para testar subi um unbuntu no Docker(ultima versão) e instalei ps nele, usei esses comandos;

# Update the list of packages 
apt-get update
# Install pre-requisite packages.
apt-get install -y wget apt-transport-https software-properties-common
# Download the Microsoft repository GPG keys
wget -q https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb
# Register the Microsoft repository GPG keys
dpkg -i packages-microsoft-prod.deb
# Update the list of packages after we added packages.microsoft.com apt-get update # Install PowerShell
apt-get install -y powershell
# Start PowerShell
pwsh

Depois instalei o modulo AZ

Install-Module Az

Existe uma compatibilidade entre comando por exemplo Connect-AzureRmAccount >> Connect-AzAccount, mas para facilitar existe uma configuração que cria aliais automaticamente entre os dois;

Enable-AzureRmAlias

Pronto agora podemos rodar os comados acima, tive dois problemas o primeiro com o Connect-AzureRmAccount que precisei usar o atributo -UseDeviceAuthentication, ele me deu uma url para abri o browser e fazer autenticação de forma manual, passando um código do device.

E o outro foi com os Paths, tudo que estava assim por exemplo ;

"$PSScriptRoot\myPolicy.xml"

alterei para;

("$PSScriptRoot" + "myPolicy.xml")
observe que sem modificar o path o arquivo gerado fica com uma barra no fim

Mas fora esses dois pontos tudo rodou perfeitamente de ponta a ponta, no fim do artigo estão as referencias e doumentações usadas.

Azure CLI

Outra forma de levar as configurações de um APIM de um ambiente para outro são os comandos da CLI do azure ,com ela podemos utilizar ARM templates, mas para isso precisamos da CLI do Azure, além disso também existem comando específicos apara o APIM, para saber mais clique no az apim

para instalar podemos usar esse comando aqui

Invoke-WebRequest -Uri https://aka.ms/installazurecliwindows -OutFile .\AzureCLI.msi; Start-Process msiexec.exe -Wait -ArgumentList '/I AzureCLI.msi /quiet'; rm .\AzureCLI.msi

no meu caso esse comando não atualizou as variáveis de ambiente e por isso não consegui usar o comando az de primeira , ai instalei o MSI e deu certo!

O básico para isso é exportar o arquivo de template através da interface de gerenciamento do Azure ou do próprio CLI e usar o comando az group deployment create para criar um novo APIM em outro ambiente, algo como o que se segue;

Para exportar;

az group export --resource-group "pocs" --resource-ids "/subscriptions/subscriptionid/resourceGroups/pocs/providers/Microsoft.Web/sites/seed-ui"

para direcionar a saída para um arquivo use no final do comando

>> template.json

e para criar o recurso use;

az deployment group create -g "pocs" -n "myDeploy"  --template-file 'template.json'  --parameters "sites_seed_ui_name=seed-ui-v2"

az deployment group | Microsoft Docs

se ao rodar o script obter esse erro ;

You cannot run this script on the current system. For more information
about running scripts and setting execution policy, see about_Execution_Policies at https:/go.microsoft.com/fwlink/?LinkID=135170.

execute esse comando

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

ou como administrador

Set-ExecutionPolicy unrestricted

saiba mais sobre execution Policies

APIM Repository

Uma forma de gerenciar as mudanças no APIM depois do deploy inicial da infraestrutura é o repositório git fornecido pelo APIM, com ele podemos baixar toda a estrutura de objetos no APIM fazer a manutenção em nossa maquina local.

Assim podemos ter um fluxo de commits / branchs como estamos acostumados com código convencional.

Para isso você precisa acessar o item repository na sessão Deploy + infraestructure.

  1. Clicar em Save to Resitory
  2. Criar uma credencial em Access credencial
  3. Fazer um git clone https://apim-sample-main.scm.azure-api.net
  4. Navegar na estrutura de Objetos do APIM, encontrar o script, fazer as alterações nos arquivos.
  5. Criar commits
  6. Fazer o push
  7. Clicar em Deploy to API Management

Tudo isso pode ser associado a politicas de branch , e no caso de instancia diferentes do APIM podemos trabalhar com múltiplos repositórios remotos e fazer um Share pick para o ambiente final.

saiba mais sobre diferentes repositórios no git

Quando o foco esta nas mudanças do backend

Existe uma situação onde o APIM é usado mais como um proxy reverso e existe muito pouco sendo implementado em politicas , mas do lado dos Backends existem desenvolvimentos constantes. Nesse caso é comum que precisemos reimportar as especificações do OpenAPI para atualizar as Apis disponíveis no APIM.

Aqui estamos criando Produtos, importando APIs e configurando Grupos em uma tarefa do pipeline do Azure Devops

Write-Host "Create Products"az apim product create
--resource-group $(rgName)
--service-name $(apimName)
--product-id focus
--product-name focus
--description focus
--subscription-required true
--approval-required true
--state "published"
Write-Host "Import API"az apim api import --resource-group $(rgName)
--service-name $(apimName)
--path focus
--api-id focus
--specification-url https://app-company-api-dev.azurewebsites.net/swagger/v1/swagger.json
--service-url https://app-company-api-dev.azurewebsites.net
--api-type http
--specification-format OpenApi
Write-Host "Add Product to API"az apim product api add
--resource-group $(rgName)
--service-name $(apimName)
--product-id focus --api-id focus
#Váriavel com informações do APIM:$apimContext = New-AzApiManagementContext -ResourceGroupName $(rgName) -ServiceName $(apimName)#Criação do Grupo:New-AzApiManagementGroup -Context $apimContext -Name $(apiName) -GroupId $(apiName)#Associar o Produto ao Grupo:Add-AzApiManagementProductToGroup -Context $apimContext -GroupId $(apiName) -ProductId $(apiName)

azure-api-management-devops-resource-kit

Existe também um SDK no git hub chamado azure-api-management-devops-resource-kit, ele propõem uma estratégia de CI /CD para o APIM baseado em ARM Templates. Basicamente a ferramenta consegue conectar na REST API do APIM, consultar as APIS, produtos, named Values etc. e com base nessa informações ele constrói os ARMs Templates limpos de infraestrutura que podem ser usados para atualizar outra instancia do APIM.

Uma possibilidade é construir sua estratégia de CI / CD versionando os templates no git e automatizando a implantação dos mesmos via Azure Devops por exemplo.

Inclusive contamos com um Brasileiro da Microsoft o Osvaldo Daibert que faz parte do time de mantenedores desse projeto.

saiba mais

Referencias

  1. Azure API Management : Improve your Policies | by Amine Charot | FAUN
  2. https://markheath.net/post/deploying-arm-templates-azure-cli
  3. CI/CD for Azure API Management using ARM templates | Microsoft Docs
  4. Azure/azure-api-management-devops-resource-kit: Azure API Management DevOps Resource Kit (github.com)
  5. Moving a git commit from one repository to another (elliotblackburn.com)
  6. https://kasunrajapakse.me/replacing-azurerm-module-with-new-cross-platform-az-module-1c1b3b209ed2
  7. New-AzResource (Az.Resources) | Microsoft Docs
  8. https://docs.microsoft.com/pt-br/cli/azure/apim?view=azure-cli-latest#az_apim_backup
  9. https://docs.microsoft.com/pt-br/azure/api-management/api-management-howto-disaster-recovery-backup-restore#what-is-not-backed-up

AzureRm no Linux

  1. https://docs.microsoft.com/pt-br/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-7.1#ubuntu-1604
  2. https://azure.microsoft.com/pt-br/blog/azure-powershell-cross-platform-az-module-replacing-azurerm/
  3. https://kasunrajapakse.me/replacing-azurerm-module-with-new-cross-platform-az-module-1c1b3b209ed2

stephaneey/azure-apim-extension

  1. https://www.youtube.com/watch?v=eC9yEwZv-jw&t=924s
  2. API Management Suite — Visual Studio Marketplace
  3. stephaneey/azure-apim-extension: Full Azure API Management suite and more VSTS extension (github.com)

--

--

Wilson Santos
Wilson Santos

Written by Wilson Santos

Nos últimos 15 anos, venho desenvolvendo , aperfeiçoando e integrando sistemas, sou apaixonado por desenvolver e ensinar, nem tanto por escrever!.

No responses yet