Migrar APis /Policies de uma instancia do APIM para outra
power shell
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
- 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")
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.
- Clicar em Save to Resitory
- Criar uma credencial em Access credencial
- Fazer um git clone https://apim-sample-main.scm.azure-api.net
- Navegar na estrutura de Objetos do APIM, encontrar o script, fazer as alterações nos arquivos.
- Criar commits
- Fazer o push
- 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 OpenApiWrite-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.
Referencias
- Azure API Management : Improve your Policies | by Amine Charot | FAUN
- https://markheath.net/post/deploying-arm-templates-azure-cli
- CI/CD for Azure API Management using ARM templates | Microsoft Docs
- Azure/azure-api-management-devops-resource-kit: Azure API Management DevOps Resource Kit (github.com)
- Moving a git commit from one repository to another (elliotblackburn.com)
- https://kasunrajapakse.me/replacing-azurerm-module-with-new-cross-platform-az-module-1c1b3b209ed2
- New-AzResource (Az.Resources) | Microsoft Docs
- https://docs.microsoft.com/pt-br/cli/azure/apim?view=azure-cli-latest#az_apim_backup
- https://docs.microsoft.com/pt-br/azure/api-management/api-management-howto-disaster-recovery-backup-restore#what-is-not-backed-up
AzureRm no Linux
- https://docs.microsoft.com/pt-br/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-7.1#ubuntu-1604
- https://azure.microsoft.com/pt-br/blog/azure-powershell-cross-platform-az-module-replacing-azurerm/
- https://kasunrajapakse.me/replacing-azurerm-module-with-new-cross-platform-az-module-1c1b3b209ed2