Azure ResourceManager Client - Primeiros Passos

Azure ResourceManager Client - Primeiros Passos
Photo by David Brooke Martin / Unsplash

Ola pessoALL,
Depois de uma longa pausa estamos de volta! E o post de hoje é sobre os primeiros passos com a biblioteca do Azure Resource Manager para .net.

O time de Azure resolveu reescrever toda a parte de acesso aos recursos do Azure de forma a unificar a forma como os diferentes clientes podem consumir os mesmos recursos.

O que me motivou a escrever esse post foi um recente desafio em escalar um worker service que lê mensagens de uma fila no RabbitMQ e processa elas utilizando um crawler, a primeira ideia foi converter para container e utilizar o Azure Container Instance para facilitar o processo de escala do número de instâncias.
O primeiro problema é que o código só funciona em windows, o que torna manipular containers um problema, uma vez que o tamanho final é muito grande e dificulta o processo de download das imagens para start do container.

Após algum tempo pensando, acabamos decidindo pelo cenário mais simples, criar outras VMs com o código do worker instalado e configurado e deixa-las em estado stopped (deallocated) uma vez nesse estado a cobrança da VM é interrompida, o ponto negativo é que perdemos o IP associado á essa VM, o que no nosso caso não chega a ser um problema pois não temos nenhum tipo de requisição para a Máquina e ainda temos a vantagem de podermos aplicar instância reservada nas VMs que nos garante uma redução de 60% no preço da VM.

Uma vez definida a solução, vamos à implementação! O que vou compartilhar aqui é apenas os primeiros passos para podermos utilizar os novos pacotes do Azure.

Azure.ResourceManager

O primeiro passo é instalar a biblioteca [Azure.ResourceManager](https://www.nuget.org/packages/Azure.ResourceManager/1.0.0-beta.8) o próximo passo é instalar a biblioteca de autenticação [Azure.Identity](https://www.nuget.org/packages/Azure.Identity/)

Na maioria dos casos vamos trabalhar com a classe DefaultAzureCredential que contém toda a lógica que precisamos para a maioria dos casos. Na página do pacote voce tem o tutorial de como essa autenticação funciona, mas em resumo, ela obedece a sequência à seguir:

No nosso caso utilizamos a autenticação via Visual Studio (ou VsCode) para desenvolvimento e quando fizermos o deploy do código seja em uma Máquina Virtual ou em um App Service habilitaremos o Managed Identity para autenticação sem precisarmos alterar o código ou ficar criando apps e tokens direto no Active Directory. O Código para autenticação fica +/- assim:

ArmClient armClient = new ArmClient(new DefaultAzureCredential());
string rgName = "myResourceGroup";
Subscription subscription = await armClient.GetDefaultSubscriptionAsync();
ResourceGroup rg = await subscription.GetResourceGroups().GetAsync(rgName);

Azure.ResourceManager.Compute

Cada "parte" (ou time) do Azure implementa as chamadas para a API rest obedecendo os principios de design em formato de extenção para as classes bases, então vamos precisar referenciar os pacotes de acordo com os recursos do Azure que quermos manipular, no meu caso como queria trabalhar com máquinas virtuais eu vou utilizar a biblioteca [Azure.ResourceManager.Compute](https://www.nuget.org/packages/Azure.ResourceManager.Compute/1.0.0-beta.6) para recuperar o estado das máquinas virtuais.

Uma vez com o meu ResourceGroup tudo o que preciso fazer é recuperar minhas máquinas virtuais e aplicar a ação desejada.

// Recuperando uma unica VM
var vm = await _resourceGroup.GetVirtualMachines().GetAsync(vmName);

// Iterando na coleção de VMs
await foreach (VirtualMachine vm in rg.GetVirtualMachines().GetAllAsync())
{
    //previously we would have to take the resourceGroupName and the vmName from the vm object
    //and pass those into the powerOff method as well as we would need to execute that on a separate compute client
    await vm.StartPowerOff().WaitForCompletionAsync();
}

Erro: Invalid issuer. Expected one of xpto, found xyz

Em casos aonde temos acesso á varios tenants e várias assinaturas, podemos incorrer em um erro 401 de estarmos em uma subscription mas desejamos manipular outra, o erro geralmente ocorre porque o token gerado para a assinatura A não é valido na assinatura B.
Geralmente isso ocorre quando nosso email de acesso é um email externo no AD, nesse caso recomendo que criem uma conta local no AD a ser manipulado e trabalhe com ele logado no Visual Studio e/ou Vs Code.

Finalisando

Existem outras bibliotecas para manipularmos os mais variados serviços do Azure, vou deixar alguns links de referência e espero ter ajudado.

[]s e até a próxima