Economia de custos com o Azure para seus aplicativos Web
Introdução
Muitos dos nossos aplicativos Web hospedados no Azure são criados sobre um serviço PaaS, como o Serviço de Aplicativo do Azure e o SQL Azure. Esses serviços geralmente são cobrados com base na quantidade de recursos que consomem. Quanto mais recursos eles consomem, mais pagamos. No entanto, existem algumas práticas recomendadas que podemos seguir para reduzir a quantidade de recursos consumidos e, portanto, reduzir a quantidade de dinheiro que pagamos. Especialmente se estivermos executando um aplicativo Web que não é usado 24 horas por dia, 7 dias por semana ou apenas usado durante o horário comercial no mesmo fuso horário.
Um dos princípios da computação em nuvem é o elasticidade, o que significa que podemos aumentar ou diminuir os recursos que nosso aplicativo consome com base na demanda ou no cronograma. Esse é um ótimo recurso da nuvem, mas devemos estar cientes das implicações de custo desse recurso. Se ampliarmos nosso aplicativo para lidar com um pico de tráfego, também devemos reduzir os recursos quando o tráfego voltar ao normal.
No Serviço de Aplicativo do Azure, temos duas maneiras de escalar, aumentar ou diminuir a escala e expandir para fora ou para dentro. Aumentar ou diminuir a escala significa que podemos alterar o tamanho da VM em que nosso aplicativo está sendo executado. Expandir ou aumentar significa que podemos adicionar ou remover VMs do nosso aplicativo. Podemos aumentar ou diminuir a escala e reduzir a escala para fora ou para dentro ao mesmo tempo. Por exemplo, podemos aumentar o tamanho das VMs e adicionar mais VMs ao nosso aplicativo.
Portanto, se tivermos um aplicativo Web de produção que não seja usado 24 horas por dia, 7 dias por semana, devemos considerar o seguinte:
- Reduza o aplicativo e o banco de dados para os recursos mínimos necessários fora do horário de pico.
- Dimensione o aplicativo e o banco de dados para os recursos máximos necessários durante o horário de pico. (além disso, devemos habilitar o dimensionamento automático para expandir o aplicativo e adicionar mais instâncias quando necessário, por meio das regras que você define para expandir horizontalmente ou para dentro).
O processo para aumentar e diminuir a escala pode ser desativado manualmente a partir do portal, conforme mostrado na imagem.
No entanto, esse processo pode ser tedioso e propenso a erros. Podemos automatizar o processo para aumentar e diminuir a escala do Web App e do banco de dados durante a noite e os fins de semana. Isso reduzirá a quantidade de recursos consumidos e, portanto, reduzirá a quantidade de dinheiro que pagamos.
Solução
Nós podemos usar Automação do Azure para agendar um script do PowerShell para reduzir o Aplicativo Web e o Banco de Dados durante a noite e os fins de semana. Também podemos agendar outro script do PowerShell para ampliar o Aplicativo Web e o Banco de Dados antes do horário comercial.
Você precisará configurar uma identidade atribuída pelo sistema à conta de automação do Azure para se conectar aos recursos do Azure. Você pode seguir as etapas neste artigo.
Vamos explorar os scripts do PowerShell que podemos usar:
Aumentar ou diminuir a escala do aplicativo Web
$resourceGroupName = '<Your Resource Group>'
$appServicePlanName = '<Your App Service>'
$tier = '<Tier you would like to scale down - For example: Basic>'
try
{
filter timestamp {"[$(Get-Date -Format G)]: $_"}
Write-Output "Script started." | timestamp
Write-Verbose "Logging in to Azure..." -Verbose
Connect-AzAccount -Identity
Write-Verbose "Login sucessful. Proceding to update service plan..." -Verbose
Set-AzAppServicePlan -ResourceGroupName $resourceGroupName -Name $appServicePlanName -tier $tier
Write-Verbose "Service plan updated. Getting information about the update..." -Verbose
$appPlanService = Get-AzAppServicePlan -ResourceGroupName $resourceGroupName -Name $appServicePlanName
Write-Output "App Service Plan name: $($appPlanService.Name)" | timestamp
Write-Output "Current App Service Plan status: $($appPlanService.Status), tier: $($appPlanService.Sku.Name)" | timestamp
Write-Output "Script finished."
}
catch {
Write-Verbose "Error... '$_.Exception'" -Verbose
Write-Error -Message $_.Exception
throw $_.Exception
}
Aumentar ou diminuir a escala do SQL Azure
$resourceGroupName = '<Your Resource Group>'
$SqlServerName = '<Your SQL Azure Server Name>'
$DatabaseName = '<Your SQL Azure DB Name>'
$Edition = '<Tier you would like to scale down - For example: Basic>'
$PerfLevel = '<Tier you would like to scale down - For example: Basic>'
try{
filter timestamp {"[$(Get-Date -Format G)]: $_"}
Write-Output "Script started." | timestamp
Write-Verbose "Logging in to Azure..." -Verbose
Connect-AzAccount -Identity
Write-Verbose "Login sucessful. Proceding to update SQL Server plan..." -Verbose
Set-AzSqlDatabase -ResourceGroupName $resourceGroupName -DatabaseName $DatabaseName -ServerName $SqlServerName -Edition $Edition -RequestedServiceObjectiveName $PerfLevel
Write-Verbose "SQL Server plan updated. Getting information about the update..." -Verbose
$sqlServerPlan = Get-AzSqlDatabase -ResourceGroupName $resourceGroupName -DatabaseName $DatabaseName -ServerName $SqlServerName
Write-Output "SQL Server Edition: $($sqlServerPlan.Edition)" | timestamp
Write-Output "Current SQL Server Plan status: $($sqlServerPlan.Status)" | timestamp
Write-Output "Script finished."
}
catch{
Write-Verbose "Error... '$_.Exception'" -Verbose
Write-Error -Message $_.Exception
throw $_.Exception
}
Depois de criar os Runbooks na Automação do Azure, você pode criar as agendas e vincular os Runbooks às agendas.
Conclusão
Vimos como podemos usar a Automação do Azure e o PowerShell para agendar o dimensionamento para cima ou para baixo do Aplicativo Web e do SQL Azure. Isso nos ajudará a economizar dinheiro e também a evitar o tempo de inatividade durante o horário comercial, adicionando os recursos que não usamos à noite.