Aplica-se a: ✔️ VMs do Windows
Metadado | Descrição |
---|---|
Título | Template de Infraestrutura Azure para Ambiente Corporativo com Alta Disponibilidade |
Assunto | Azure Virtual Machines |
Versão | 1.0.0 |
Data | 18/02/2025 |
Autor | Mathews Buzetti |
Tags | azure-automation , windows-server , high-availability , infrastructure-as-code |
- Metadados
- Especificações Técnicas
- Diagrama de Arquitetura
- Automação e Monitoramento
- Pré-requisitos
- Como Usar
- Avisos Importantes e Pós-Instalação
- Procedimento de Rollback
- Resource Groups e Organização
- Tagging e Governança
- Logs e Feedback
- Parâmetros do Script
- Versionamento
- Windows Server 2025 Datacenter Azure Edition
- Tamanho: Standard_B2ms
- Disco OS: 127GB StandardSSD_LRS
- Opção de criar uma segunda VM com as mesmas configurações
- Fuso Horário: E. South America Standard Time (Brasil)
- Provisionamento:
- VM Agent habilitado
- Atualizações automáticas ativadas
- Hot Patching habilitado
- Patch Mode: AutomaticByPlatform
- 🔒 Segurança:
- TPM Virtual (vTPM) habilitado
- Secure Boot ativado
- Security Type: TrustedLaunch
Tip
Estas configurações avançadas garantem:
- Maior segurança com TPM e Secure Boot
- Atualizações automáticas gerenciadas
- Fuso horário correto para Brasil
- Conformidade com boas práticas de segurança
- VNET (Configurável via parâmetro VNetIPRange)
- SNET-Internal (Configurável via parâmetro SubnetInternalIPRange)
- GatewaySubnet (Configurável via parâmetro GatewaySubnetIPRange)
- NSG com regras para:
- RDP (porta 3389)
Warning
Por questões de segurança, após configurar a VPN:
- É altamente recomendado fechar a porta 3389 (RDP) para acesso externo
- Remover o IP público da(s) VM(s) uma vez que o acesso pode ser feito via VPN
- Todo acesso à(s) VM(s) deve ser feito através da VPN utilizando o IP privado
Isso garante uma camada adicional de segurança, pois remove a exposição direta da VM à internet.
- VM: PIP-VM-[NOME-DA-VM]
- VPN Gateway (opcional):
- [CLIENTE]-PIP-S2S-PRIMARY (Site-to-Site)
- Todos configurados como:
- Tipo: Static
- SKU: Standard
- Gateway VPN em modo Active-Passive
- Gateway Private IPs habilitado
- Suporte para conexões S2S e P2S
- SKU: VpnGw1
- Storage Account (Standard_LRS)
- Recovery Services Vault
- Availability Set
- Configuração do START/STOP VMs:
- Runbook para automação de horários
- Suporte para agendamentos personalizados
- Execução baseada em tags nas VMs
- Monitoramento de execução via Log Analytics
- Integração com Automation Account para:
- Monitoramento de jobs do Runbook
- Alertas por email em caso de falhas
- Coleta de logs de execução
- Métricas de performance
- Diagnósticos de Boot:
- Desabilitado por padrão
- Configurável via Storage Account
- Permite troubleshooting de problemas de inicialização
- Você precisará de uma assinatura ativa do Azure.
- Você pode executar este script diretamente no Azure CloudShell.
- O usuário que executar o script deve ter as seguintes permissões na assinatura do Azure:
- Contribuidor (Contributor) ou Proprietário (Owner) na assinatura
-
Acesse o portal do Azure e abra o Azure CloudShell:
-
Execute o comando abaixo no CloudShell para baixar o script:
irm "https://raw.githubusercontent.com/mathewsbuzetti/azure-infrastructure-template/main/Scripts/Deploy_AzureInfrastructure_BrazilSouth.ps1" -OutFile "Deploy_AzureInfrastructure_BrazilSouth.ps1"
-
Acesse nosso site para gerar o código de execução do script:
No site, você deverá preencher todos os parâmetros necessários:
Informações Básicas:
- ID da Assinatura Azure
- Nome do Cliente (maiúsculo)
- Nome do Cliente (minúsculo)
- Nome da Máquina Virtual
- Usuário e senha para login nas máquinas virtuais
Configurações de Rede:
- VNET IP Range
- Subnet Internal IP Range
- Gateway Subnet IP Range
Opções Adicionais:
- Criar Segunda VM (Sim/Não)
- Se sim, informar nome da segunda VM
- Instalar VPN Gateway (Sim/Não)
-
Copie o comando gerado.
-
Cole o comando gerado no Azure CloudShell e pressione Enter.
O script iniciará a implantação dos recursos do Azure.
- Deploy completo sem VPN: 30 minutos
- Deploy com VPN: 60 minutos
- Após a criação da VM, é necessário ativar o Diagnostics utilizando a conta de armazenamento que foi criada durante o processo.
-
Alterar a redundância para Locally-redundant (LRS)
💰 Recomendação: A alteração para LRS é recomendada para redução de custos, pois oferece redundância suficiente para a maioria dos cenários com um custo menor.
-
Definir a política de retenção conforme necessidade
⚙️ Recomendação: A política abaixo é uma recomendação amplamente utilizada por empresas. Caso deseje seguir este modelo:
- Abrir o Automation Account
- No menu lateral, em Settings, selecione Identity
- Na aba System Assigned, defina o Status como On
- Clique em Save
- Na mesma tela acesse a opção Azure role assignments:
-
Na tela Azure role assignments preencha os dados
- Scope: Subscription
- Subscription: sua Assinatura
- Role: Virtual Machine Contributor
Warning
Não atribua mais permissões do que o necessário à Managed Identity. O princípio de "least privilege" deve ser aplicado para maior segurança.
- No editor do runbook que acabou de abrir, apague qualquer código existente
- Copie e cole o conteúdo completo do script Start-StopAzureVMsByTag.ps1
- Clique em Save
- Depois em Publish
Warning
Não altere os nomes dos parâmetros, pois os agendamentos farão referência a esses nomes específicos.
Depois de publicar vai voltar para tela inicial do runbook. Para configurar o Agendamento, siga os passos:
- Acesse a opção Resources e depois Schedules:
- Na tela de Schedules, clique em Add a Schedule e aparecerão duas opções conforme a imagem abaixo:
- Vamos configurar primeiro o Schedule. Neste exemplo, configurei para ligar VMs às 08:00 da manhã:
Preencha as informações:
- Name: StartVMs_Morning
- Description: "Inicia as VMs nos dias úteis pela manhã"
- Starts: Selecione a data e hora de início (recomendado: próximo dia útil às 8h)
- Time zone: Selecione seu fuso horário local
- Recurrence: Recurring
- Recur every: 1 Day
- Set expiration: No
- Week days: Selecione apenas os dias úteis (Monday to Friday)
Warning
O Azure Automation usa UTC por padrão. Certifique-se de selecionar o fuso horário correto para que as VMs sejam iniciadas no horário local desejado.
- Agora configure os Parameters:
- TagName: start
- TagValue: 08:00
- Shutdown: false (para iniciar)
- Depois clique em OK para criar o agendamento:
Para criar o agendamento de Stop, vamos seguir o mesmo processo, porém alterando o horário para 19:00:
- Na tela de Schedules, clique em Add a Schedule:
- Configure o Schedule para desligar as VMs às 19:00:
Preencha as informações:
- Name: StopVMs_Evening
- Description: "Para as VMs nos dias úteis à noite"
- Starts: Selecione a data e hora de início (recomendado: próximo dia útil às 19h)
- Time zone: Selecione seu fuso horário local (mesmo do agendamento anterior)
- Recurrence: Recurring
- Recur every: 1 Day
- Set expiration: No
- Week days: Selecione apenas os dias úteis (Monday to Friday)
Warning
O Azure Automation usa UTC por padrão. Certifique-se de selecionar o fuso horário correto para que as VMs sejam paradas no horário local desejado.
- Configure os Parameters:
- TagName: stop
- TagValue: 19:00
- Shutdown: true (para desligar)
- Depois clique em OK para criar o agendamento:
Para cada VM que você deseja incluir na automação:
- No Portal Azure, acesse Virtual Machines
- Clique na VM que deseja gerenciar
- No menu lateral, selecione Tags
- Adicione a tag com o mesmo nome e valor configurados nos agendamentos:
- Name: Digite o nome da tag (ex: "start")
- Value: Digite o valor da tag (ex: "07:00")
- Name: Digite o nome da tag (ex: "stop")
- Value: Digite o valor da tag (ex: "19:00")
- Clique em Apply
Warning
Certifique-se de que o nome e valor das tags nas VMs correspondam exatamente ao configurado nos agendamentos do Runbook.
- No portal Azure, acesse o Automation Account
- Na seção Monitoring, clique em Diagnostic settings
- Configure as categorias:
- Marque JobLogs, JobStreams e AuditEvent
- Em "Destination details", ative "Send to Log Analytics workspace"
- Selecione seu workspace
- No Log Analytics workspace:
- Acesse a seção Monitoring
- Clique em Alerts
- Clique em "New alert rule"
- Em "Scope":
- Selecione o Automation Account
- Em "Condition":
- Selecione "Custom log search"
- Cole a seguinte query:
// Azure Automation jobs that are failed, suspended, or stopped
// List all the automation jobs that failed, suspended or stopped in the last 24 hours.
let jobLogs = AzureDiagnostics
| where ResourceProvider == "MICROSOFT.AUTOMATION"
and Category == "JobLogs"
and (ResultType == "Failed" or ResultType == "Stopped" or ResultType == "Suspended")
| project
TimeGenerated,
RunbookName_s,
ResultType,
_ResourceId,
JobId_g,
OperationName,
Category;
let auditEvents = AzureDiagnostics
| where ResourceProvider == "MICROSOFT.AUTOMATION"
and Category == "AuditEvent"
and OperationName == "Delete"
| project
TimeGenerated,
RunbookName_s,
ResultType,
_ResourceId,
JobId_g,
OperationName,
Category;
jobLogs
| union auditEvents
| order by TimeGenerated desc
- Configure a Measurement e Alert Logic:
- Clique em "Create action group"
- Configure os detalhes básicos:
- Action group name: "JobErrorsGrp001"
- Display name: "JobErrorsGrp"
- Resource group: RG de Automation
- Configure as notificações:
- Tipo: Email/SMS message/Push/Voice
- Adicione o email desejado
- Revise as configurações do Action Group
- Selecione o Action Group criado
- Configure os detalhes do alerta:
- Severity: 1 - Error
- Alert rule name: "RunbookFailureAlert"
- Region: East US
- Revise todas as configurações
Note
- Após configuração, você receberá emails em caso de falhas no Start/Stop das VMs
- Monitore o Log Analytics workspace periodicamente
- Mantenha o email de notificação sempre atualizado
Se for necessário fazer rollback da infraestrutura, siga estes passos:
-
Acesse o portal do Azure e abra o Azure CloudShell:
-
Execute o comando abaixo no CloudShell para baixar o script:
irm "https://raw.githubusercontent.com/mathewsbuzetti/azure-infrastructure-template/main/Scripts/Script_Delete_Resource_Groups.ps1" -OutFile "Script_Delete_Resource_Groups.ps1"
- No CloudShell, execute o comando abaixo substituindo os parâmetros:
./Script_Delete_Resource_Groups.ps1 -SubscriptionId "sua-subscription-id" -ClientNameUpper "NOME-CLIENTE"
- RG-[CLIENT]-VM (BrazilSouth)
- RG-[CLIENT]-Storage (BrazilSouth)
- RG-[CLIENT]-Networks (BrazilSouth)
- RG-[CLIENT]-Backup (BrazilSouth)
- RG-[CLIENT]-Automation (East US)
- RG-[CLIENT]-LogAnalytics (East US)
Todos os recursos são automaticamente tagueados com:
- client: [nome-cliente]
- environment: [ambiente]
- technology: [tipo-recurso]
O script fornece feedback em tempo real com cores:
- 🟦 Cyan: Informação
- 🟩 Verde: Sucesso
- 🟨 Amarelo: Aviso
- 🟥 Vermelho: Erro
Parâmetro | Descrição | Exemplo | Obrigatório |
---|---|---|---|
SubscriptionId | ID da Assinatura Azure | "30983457-3b9f-4d50-bae3-a1465e3665ab" | Sim |
LocationBrazil | Região do Azure Brasil | "brazilsouth" | Sim |
LocationUS | Região do Azure EUA | "eastus" | Sim |
ClientNameUpper | Nome do Cliente (Maiúsculo) | "MATHEWS" | Sim |
ClientNameLower | Nome do Cliente (Minúsculo) | "mathews" | Sim |
Environment | Ambiente do Deploy | "prod" | Não |
VMName | Nome da Máquina Virtual Principal | "MATHEWS-DC01" | Sim |
CriarSegundaVM | Criar Segunda VM | $false | Não |
SecondVMName | Nome da Segunda VM (se CriarSegundaVM = $true) | "MATHEWS-DC02" | Não* |
InstalarVPN | Instalar Gateway VPN | $false | Não |
VMUsername | Nome do Usuário Admin da(s) VM(s) | "admaz" | Sim |
VMPassword | Senha do Usuário Admin da(s) VM(s) | "*f8gS#(X<S}dwLfw" | Sim |
VNetIPRange | Range de IP da VNET | "10.1.0.0/16" | Sim |
SubnetInternalIPRange | Range de IP da Subnet Interna | "10.1.1.0/24" | Sim |
GatewaySubnetIPRange | Range de IP da Gateway Subnet (se InstalarVPN = $true) | "10.1.253.0/27" | Não* |
Note
* Obrigatório apenas se a funcionalidade correspondente estiver habilitada
- Versão: 1.0.0
- Última atualização: 18/02/2025