VM Resize

VM Resize – Runbook para redimensionar VMs no Azure

A ideia deste post é ensinar como redimensionar VMs do Azure via automação utilizando runbooks.

Infelizmente não é a realidade de todos conseguir trabalhar com um ambiente PaaS, que possuem diversos recursos para escalonamento horizontal, principalmente quando se fala de sistemas legados que utilizam tecnologias mais antigas ou até mesmo sistemas que não foram desenhados para nuvem. Neste cenário a solução é utilizar um ambiente IaaS utilizando VMs que na grande maioria das vezes se utiliza escalonamento vertical, ou seja, trabalha-se definindo o tamanho da VM (CPU e RAM). Essa VM acaba sendo dimensionada para aguentar a maior carga do sistema, e acaba ficando super dimensionada em determinados períodos, ou até mesmo ociosa.

Imagine o seguinte cenário, um sistema que possua um grande volume de uso durante o dia, porém de madrugada o acesso é muito baixo.

E como economizar dinheiro e fazer uso do que a nuvem nos oferece? Desligar a VM de madrugada? Desligar a VM poderia até ser uma solução para um cenário em que o sistema pudesse ficar fora do ar por algumas horas, que não é o cenário apresentado. Uma das possibilidades é criar um runbook que diminui o tamanho da VM de madrugada, e logo pela manhã aumenta o tamanho da VM retornando ao seu tamanho original. Desta forma é possível pagar menos pela VM enquanto ela permanecesse em tamanho reduzido.

Essa solução aplicada em um caso real trouxe uma economia de aproximadamente vinte porcento por mês.

A seguir será demonstrado como configurar a parte da automação para reduzir e aumentar o tamanho de uma VM de forma agendada no Azure.

Criando a conta de automação

O primeiro passo é criar uma conta de automação no painel do Azure. Para isso:

  • Clique em Criar um recurso;
  • Procure por “automação” na caixa de pesquisa;
  • Selecione o recurso de automação;
  • Clique em Criar;
  • Defina um nome para a conta de automação;
  • Defina um grupo de recurso;
  • Importante: A opção Criar conta Executar como do Azure deve estar como Sim, para que não seja necessário utilizar uma credencial do AD para execução do PowerShell;
  • Por fim clique em Criar.

Definindo variáveis

Após a conta de automação estar criada, abra o recurso e selecione a opção Variáveis no menu lateral.

Clique em Adicionar uma variável. Defina o nome da variável como AzureSubscriptionId do tipo Cadeia de caracteres e no valor defina a identificação da sua assinatura e clique em Criar.

Para localizar o ID da sua assinatura, pesquise na caixa de pesquisa por assinaturas.

Criando o runbook

Na conta de automação criada anteriormente selecione a opção Runbooks no menu lateral.

Escolha a opção Criar um runbook. Logo em seguida defina o nome do runbook e selecione o Tipo de runbook como PowerShell e clique em Criar.

Será exibida uma área para digitar o seu script. Utilize o seguinte PowerShell:

<#
.SYNOPSIS
  Conecta no Azure e escala a VM certicalmente.

.DESCRIPTION
  Este runbook conecta no Azure e escala a VM verticalmente. 

  CONFIGURAÇÕES NECESSÁRIAS
  1. Criar uma variável de automação chamada "AzureSubscriptionId" contendo o GUID da sua assinatura do Azure.  
  2. Criar uma credencial de automação chamada "AzureCredential" contendo as credenciais de um usuário do Azure AD com perfil de acesso. 
     (Se a conta for uma conta Microsoft não funciona, necessário criar um novo usuário)
  3. Se os módulos estiverem desatualizados dará erro ao redimensionar a VM para discos gerenciados. Irá dar um erro no arquivo vhd.

.PARAMETER ResourceGroupName
   Required 
   Nome do grupo de recurso.

.PARAMETER VmName
   Required 
   Nome da VM.

.PARAMETER VmSize
   Required 
   Tamanho da VM (Exemplo: Standard_DS1_V2, Standard_F4s).
#>

param (
    [parameter(Mandatory = $true)]
    [string]$ResourceGroupName,

    [parameter(Mandatory = $true)]
    [string]$VmName,

    [parameter(Mandatory = $true)]
    [string]$VmSize
)   
    $Conn = Get-AutomationConnection -Name AzureRunAsConnection
    $null = Add-AzureRmAccount -ServicePrincipal -TenantId $Conn.TenantId -ApplicationId $Conn.ApplicationId -CertificateThumbprint $Conn.CertificateThumbprint 
    
    $SubId = Get-AutomationVariable -Name 'AzureSubscriptionId'
    $null = Set-AzureRmContext -SubscriptionId $SubId -ErrorAction Stop
        
    try {
        $vm = Get-AzureRmVm -ResourceGroupName $ResourceGroupName -VMName $VmName -ErrorAction Stop
    } catch {
        Write-Error "Máquina virtual não encontrada"
        exit
    }
    $currentVMSize = $vm.HardwareProfile.vmSize
        
    Write-Output "`nMáquina virtual encontrada: $VmName"
    Write-Output "Tamanho atual: $currentVMSize"
    
    Write-Output "`nNovo tamanho será: $VmSize"
        
    $vm.HardwareProfile.VmSize = $VmSize
    Update-AzureRmVm -VM $vm -ResourceGroupName $ResourceGroupName

    Write-Output "`nVerificando o tamanho"
    
    $updatedVm = Get-AzureRmVm -ResourceGroupName $ResourceGroupName -VMName $VmName
    $updatedVMSize = $updatedVm.HardwareProfile.vmSize
    
    Write-Output "`nTamanho alterado para: $updatedVMSize"  

Clique em publicar e confirme a publicação clicando em Sim.

Você pode testar o seu runbook utilizando a opção Iniciar e logo em seguida em OK. Ao clicar em Iniciar ele irá solicitar os três parâmetros do PowerShell, sendo:

  • ResourceGroupName: nome do grupo de recurso da VM;
  • VMName: o nome da VM;
  • VMSize: o tamanho da VM.

Nesse momento, o seu runbook provavelmente irá falhar, e irá apresentar a mensagem “Vhd cannot be null”. Isso acontece porque ao criar a conta de automação os módulos não estão atualizados, e não suportam redimensionar VMs que possuem discos gerenciados. A solução é simples, basta atualizar os módulos.

Para resolver este problema, na conta de automação selecione a opção Módulos.

Se clicar em Atualizar módulos do Azure, você receberá uma mensagem pedindo para acessar um projeto do GitHub para atualizar os módulos. Mas existe um macete para atualizar todos os módulos pelo painel do Azure.

Escolha a opção Galeria de módulos, que fica logo abaixo dos Módulos. Pesquise pelo módulo AzureRM.Compute.

Selecione o módulo e utilize a opção Importar.

Na página a seguir marque a opção Eu concordo em atualizar todos os módulos do Azure e clique em OK.

O processo de atualização é um pouco demorado, leva alguns minutos. Se retornar na opção Módulos será exibida uma mensagem que os módulos estão em atualização. Assim que este processo terminar selecione novamente o runbook e faça o teste utilizando a opção Iniciar, e desta vez irá funcionar.

Agendando seu runbook

Agora que o seu runbook já funciona, falta apenas criar o agendamento para que seja executado num determinado horário. Selecione o seu runbook, e clique no menu Agendas.

Clique Adicionar um agendamento.

Selecione a opção Parâmetros e configurações de execução. Nesta opção defina o nome do grupo de recurso, o nome da VM, e o tamanho desejado da VM, assim como foi feito durante os testes, e clique em OK.

Selecione agora a opção de Agendar e em seguida Criar uma nova agenda.

Agora defina o horário em que o seu script será executado com os parâmetros definidos anteriormente e clique em Criar.

Nesse exemplo, foi configurado para que o runbook seja executado de forma recorrente todo dia às 0:00 com os parâmetros definidos anteriormente.

Retomando o caso de uso mencionado logo no início deste post, neste momento eu acabei de fazer um agendamento para que todo dia a minha VM às 0:00 seja redimensionada de tamanho, no caso para a configuração Standard_DS1_V2.

Agora preciso criar um novo agendamento, seguindo os mesmos passos, para que minha VM retorne ao tamanho original. Então defino nos parâmetros do novo agendamento o tamanho original da VM.

E no agendamento defino o horário que desejo que minha VM retorne ao tamanho original dela.

Pronto! O seu ambiente já está automatizado, e sua VM passará a ser redimensionada automaticamente de tamanho diariamente, fazendo com que pague menos pelo ambiente.

Um ponto muito importante que vale ressaltar é que esse processo de redimensionar a VM de tamanho fará com que a VM seja desligada e ligada logo em seguida, ou seja, ela ficará fora do ar por alguns minutos.

Azure Media Services

O Azure possui um serviço de streaming de vídeos chamado Azure Media Services. Além do streaming, ele possibilita fazer download progressivo e transmissões ao vivo. A comunicação com este serviço pode ser feita através de uma API REST ou através de SDKs disponíveis para algumas linguagens.

Eu fiz um pequeno exemplo de como consumir esta API utilizando o SDK disponível para C# e disponibilizei o código no github, no link abaixo:

https://github.com/rkiguti/azure.media.services

Neste exemplo, é feito o upload de um arquivo de vídeo (*.mp4) e outro de áudio (*.mp3), em seguida é criada uma tarefa para codificação dos arquivos para que possa ser transmitido via streaming, e por fim é feito a publicação destes arquivos. Neste mesmo projeto há uma aplicação web, que tem um player de exemplo consumindo uma URL de streaming do Azure Media Services.

Para que o exemplo execute, é necessário configurar no arquivo App.config as credenciais da sua conta no Azure, e no arquivo Program.cs alterar o local dos arquivos de vídeo e áudio que será feito o upload.

Alguns links que utilizei para montar o exemplo e configurar a conta no Azure:

https://docs.microsoft.com/pt-br/azure/media-services/media-services-dotnet-get-started

https://azure.microsoft.com/en-us/blog/azure-media-service-aad-auth-and-acs-deprecation/