Pular para o conteúdo principal

[AZ-104] Grand Labs - NovaCarga Logistica S.A

Ambiente Cumulativo de Implantação Real


Narrativa Central

Empresa: NovaCarga Logística S.A. | Setor: Logística e transporte de cargas fracionadas | Sede: São Paulo, Brasil

A NovaCarga é uma empresa de médio porte com 1.200 colaboradores distribuídos entre sua sede em São Paulo e filiais em Recife, Porto Alegre e Manaus. Após uma auditoria de segurança e um incidente de acesso indevido a dados de clientes, a diretoria aprovou a migração completa da infraestrutura de TI para o Azure.

O projeto foi batizado de Projeto Âncora e você é o engenheiro de cloud responsável pela implantação. O ambiente será construído do zero, seguindo os requisitos levantados pelo time de arquitetura: identidade centralizada no Microsoft Entra ID, segmentação de rede por função de carga de trabalho, armazenamento seguro para documentos fiscais e logs de rastreamento, VMs para os sistemas legados de WMS e TMS, contêineres para microserviços da nova plataforma de rastreamento, e monitoramento em conformidade com as políticas da LGPD.

Cada etapa deste laboratório corresponde a uma entrega real do Projeto Âncora. O prefixo de todos os recursos é ncarga. Capture os IDs, IPs e nomes de objetos produzidos em cada etapa — eles serão exigidos nas etapas seguintes.


Pré-requisitos

Instale antes de começar

Valide todas as ferramentas abaixo antes de iniciar a Etapa 1.

FerramentaVersão MínimaNecessária nas EtapasVerificação
PowerShell7.2+Todas$PSVersionTable.PSVersion
Az PowerShell module10.0+TodasGet-Module Az -ListAvailable
Microsoft.Graph module2.0+1–5Get-Module Microsoft.Graph -ListAvailable
Bicep CLIQualquer33–36bicep --version
Docker Desktop24+44–46docker --version
Azure CLI2.50+46–47az --version
AzCopyv10+25azcopy --version
Estimativa de custo e tempo
  • 💰 Custo estimado para execução completa: USD 20–45
  • ⏱️ Tempo estimado total: 14–18 horas distribuídas em múltiplas sessões
  • 🔋 Desligue e desaloque VMs, VMSS e o Bastion ao encerrar cada sessão
  • 📍 Região principal: East US | Região de DR: Brazil South
RecursoCusto estimadoObservação
Azure Bastion (Standard)~USD 0,19/hDesligue após uso
VM Standard_D4s_v3~USD 0,19/hDesaloque entre sessões
VMSS (2x D2s_v3)~USD 0,19/hReduza para 0 instâncias entre sessões
App Service P1v3~USD 0,16/hScale down para F1 entre sessões
Site Recovery~USD 0,16/VM/hDesabilite após Etapa 78
Load Balancer Standard~USD 0,008/hCusto baixo, pode manter

Convenção de Nomenclatura

Tipo de RecursoExemplo
Resource groupncarga-rg-storage
Rede virtualncarga-vnet-compute
VMncarga-vm-wms01
Storage accountncargatms001 (sem hífens, máx 24 chars)
NSGncarga-nsg-compute
Key Vaultncarga-kv-001

Índice por Domínio do Exame

DomínioEtapas
Domínio 1 — Identidade e Governança1–15
Domínio 2 — Storage16–32
Domínio 3 — Infraestrutura como Código33–36
Domínio 4 — Compute e Contêineres37–47
Domínio 5 — App Service48–53
Domínio 6 — Redes54–66
Domínio 7 — Monitoramento67–72
Domínio 8 — Backup e DR73–79

Domínio 1 — Identidade e Governança

Etapa 1 — Criar usuários e grupos no Microsoft Entra ID

Contexto: O Projeto Âncora começa pela identidade. Antes de qualquer recurso Azure ser provisionado, o time de TI da NovaCarga precisa existir no Microsoft Entra ID. A auditoria identificou que usuários estavam compartilhando credenciais e que não havia grupos de segurança para controlar acesso por função.

Tarefas:

[PowerShell] Crie três usuários membros no tenant com os parâmetros abaixo usando New-MgUser. Defina UsageLocation como BR, AccountEnabled como $true e gere senha temporária com ForceChangePasswordNextSignIn habilitado. Capture o Id de cada usuário após a criação.

DisplayNameUserPrincipalNameJobTitleDepartment
Ana Ferreiraana.ferreira@<tenant>.onmicrosoft.comCloud EngineerTI
Bruno Oliveirabruno.oliveira@<tenant>.onmicrosoft.comWMS AdminOperacoes
Carla Mendescarla.mendes@<tenant>.onmicrosoft.comFinance AnalystFinanceiro

[PowerShell] Crie dois grupos de segurança com SecurityEnabled = $true e MailEnabled = $false usando New-MgGroup. Adicione os membros indicados com New-MgGroupMember.

DisplayNameMailNicknameMembros iniciais
ncarga-tincarga-tiana.ferreira
ncarga-opsncarga-opsbruno.oliveira

[Portal] Confirme os usuários e grupos navegando em: Microsoft Entra ID → Users e Microsoft Entra ID → Groups. Verifique que o campo Usage location de cada usuário está definido como Brazil.

Critérios de Validação:

# Deve retornar UsageLocation = BR:
Get-MgUser -Filter "startsWith(UserPrincipalName,'ana.ferreira')" |
Select-Object DisplayName, UserPrincipalName, UsageLocation

# Deve retornar o Id de ana.ferreira:
Get-MgGroupMember -GroupId (Get-MgGroup -Filter "displayName eq 'ncarga-ti'").Id |
Select-Object Id

Etapa 2 — Gerenciar propriedades de usuários e grupos

Contexto: O time de RH solicitou ajustes nos atributos de perfil para que os relatórios de licença e auditoria estejam corretos. Além disso, o grupo ncarga-ops precisa ser convertido para associação dinâmica, pois o volume de contratações sazonais torna inviável a gestão manual.

Tarefas:

[PowerShell] Atualize os três usuários com Update-AzureADUser. Adicione o atributo CompanyName com valor NovaCarga Logistica SA e OfficeLocation como Sao Paulo HQ para todos.

[PowerShell] Converta o grupo ncarga-ops para associação dinâmica usando Update-MgGroup. Defina a regra dinâmica para incluir usuários cujo department seja igual a Operacoes e o MembershipType como DynamicMembership.

informação

Grupos dinâmicos requerem licença Microsoft Entra ID P1 ou superior no tenant.

[Portal] Confirme a regra dinâmica em: Microsoft Entra ID → Groups → ncarga-ops → Dynamic membership rules. Aguarde o processamento e verifique que bruno.oliveira aparece como membro dinâmico.

Critérios de Validação:

# Deve retornar NovaCarga Logistica SA:
Get-MgUser -Filter "displayName eq 'Ana Ferreira'" -Property CompanyName |
Select-Object CompanyName

# Deve retornar Dynamic:
Get-MgGroup -Filter "displayName eq 'ncarga-ops'" |
Select-Object MembershipType

Etapa 3 — Gerenciar licenças no Microsoft Entra ID

Contexto: A NovaCarga adquiriu licenças Microsoft 365 Business Premium para os usuários do Projeto Âncora. O time jurídico exige que apenas usuários ativos com UsageLocation definida possam receber licenças — requisito derivado da política de conformidade com a LGPD.

Tarefas:

[PowerShell] Liste os SKUs de licença disponíveis no tenant usando Get-MgSubscribedSku. Capture o SkuId correspondente ao plano disponível com unidades restantes.

[PowerShell] Atribua a licença capturada aos três usuários usando Set-MgUserLicense. O parâmetro AddLicenses deve conter o objeto com SkuId. Não desabilite planos de serviço individuais.

[Portal] Confirme a atribuição navegando em: Microsoft Entra ID → Users → [usuário] → Licenses. A licença deve aparecer como Assigned para cada um dos três usuários.

Critérios de Validação:

# Deve retornar SkuPartNumber preenchido e status Enabled:
Get-MgUserLicenseDetail -UserId (Get-MgUser -Filter "displayName eq 'Ana Ferreira'").Id |
Select-Object SkuPartNumber, ServicePlans

Etapa 4 — Gerenciar usuários externos

Contexto: A NovaCarga contratou uma consultoria externa, a LogiPartners, para auxiliar na configuração do sistema de rastreamento durante os primeiros três meses do Projeto Âncora. O usuário externo precisa de acesso controlado ao tenant, sem ser promovido a membro permanente.

Tarefas:

[PowerShell] Convide o usuário externo consultor@logipartners.example.com usando New-MgInvitation com os parâmetros:

ParâmetroValor
InvitedUserDisplayNameConsultor LogiPartners
InviteRedirectUrlhttps://portal.azure.com
SendInvitationMessage$true

Capture o Id do usuário convidado na saída do comando.

[Portal] Confirme o usuário guest em: Microsoft Entra ID → Users. Filtre por User type = Guest e verifique o status PendingAcceptance ou Accepted.

[Portal] Adicione o usuário convidado ao grupo ncarga-ti navegando em: Microsoft Entra ID → Groups → ncarga-ti → Members → Add members.

Critérios de Validação:

# Deve retornar UserType = Guest:
Get-MgUser -Filter "userType eq 'Guest'" |
Where-Object { $_.Mail -like "*logipartners*" } |
Select-Object DisplayName, UserType, Mail

# Deve incluir Consultor LogiPartners com UserType = Guest:
Get-MgGroupMember -GroupId (Get-MgGroup -Filter "displayName eq 'ncarga-ti'").Id |
ForEach-Object { Get-MgUser -UserId $_.Id } |
Select-Object DisplayName, UserType

Etapa 5 — Configurar Self-Service Password Reset (SSPR)

Contexto: O helpdesk registra em média 40 chamados mensais relacionados a redefinição de senha. O gerente de TI aprovou a implantação do SSPR para o grupo ncarga-ti, reduzindo a carga operacional antes que o restante dos usuários seja migrado.

Tarefas:

[Portal] Habilite o SSPR para Selected grupos e selecione ncarga-ti. Navegue até: Microsoft Entra ID → Protection → Password reset → Properties.

[Portal] Configure os métodos de autenticação em: Microsoft Entra ID → Protection → Password reset → Authentication methods

ParâmetroValor
Number of methods required to reset1
Methods availableMobile app code, Email

[Portal] Habilite o registro obrigatório e defina o intervalo de reconfirmação em: Microsoft Entra ID → Protection → Password reset → Registration

ParâmetroValor
Require users to register when signing inYes
Number of days before users are asked to re-confirm180

Critérios de Validação:

dica
  • Password reset → Properties: campo Self service password reset enabled = Selected, grupo ncarga-ti listado.
  • Password reset → Authentication methods: Number of methods required = 1, métodos habilitados incluem Mobile app code e Email.

Etapa 6 — Gerenciar funções integradas do Azure (RBAC)

Contexto: Com a identidade estruturada, o time de arquitetura definiu o modelo de acesso ao Azure. Ana Ferreira precisa de acesso administrativo ao ambiente, Bruno Oliveira de acesso de leitura para os recursos de operações, e o consultor externo deve ter acesso apenas para monitorar o ambiente.

Tarefas:

[PowerShell] Atribua a função Contributor para ana.ferreira no escopo da subscription atual usando New-AzRoleAssignment com os parâmetros SignInName, RoleDefinitionName e Scope. Capture o RoleAssignmentId gerado.

[PowerShell] Atribua a função Reader para o grupo ncarga-ops no escopo da subscription. Use o ObjectId do grupo obtido na Etapa 1.

[PowerShell] Atribua a função Monitoring Reader para o usuário guest consultor@logipartners.example.com no escopo da subscription.

Critérios de Validação:

# Deve retornar 3 linhas com as funções Contributor, Reader e Monitoring Reader:
Get-AzRoleAssignment -Scope "/subscriptions/<subscription-id>" |
Where-Object { $_.DisplayName -in @('Ana Ferreira','ncarga-ops','Consultor LogiPartners') } |
Select-Object DisplayName, RoleDefinitionName, Scope

Etapa 7 — Atribuir funções em diferentes escopos

Contexto: Carla Mendes, do time financeiro, precisa de acesso administrativo apenas ao resource group de financeiro, sem acesso ao restante do ambiente. Esta etapa demonstra o princípio de menor privilégio aplicado a escopos granulares.

Tarefas:

[PowerShell] Crie o resource group ncarga-rg-financeiro na região brazilsouth usando New-AzResourceGroup.

[PowerShell] Atribua a função Contributor para carla.mendes no escopo /subscriptions/<id>/resourceGroups/ncarga-rg-financeiro usando New-AzRoleAssignment.

[PowerShell] Confirme que Carla não possui atribuição no escopo da subscription. Use Get-AzRoleAssignment -SignInName carla.mendes@... e verifique o campo Scope.

Critérios de Validação:

# Deve retornar Contributor com Scope = .../resourceGroups/ncarga-rg-financeiro
# Não deve aparecer Scope = /subscriptions/<id> para Carla:
Get-AzRoleAssignment -SignInName "carla.mendes@<tenant>.onmicrosoft.com" |
Select-Object RoleDefinitionName, Scope

Etapa 8 — Interpretar atribuições de acesso

Contexto: Antes de prosseguir com a criação dos demais resource groups, o time de segurança solicitou uma revisão das atribuições de acesso efetivas para cada usuário, documentando o acesso herdado e direto de cada identidade.

Tarefas:

[PowerShell] Liste todas as atribuições de função da subscription atual, filtrando pelos três usuários membros e pelo grupo ncarga-ops, usando Get-AzRoleAssignment -IncludeClassicAdministrators $false.

[Portal] Verifique o acesso efetivo de ana.ferreira e carla.mendes em: Subscription → Access control (IAM) → Check access. Inclua as funções herdadas de grupos.

[PowerShell] Gere um relatório consolidado em formato de tabela com DisplayName, RoleDefinitionName, Scope e ObjectType para todos os principals do Projeto Âncora. Exporte para ~/ncarga/rbac-report.csv.

Critérios de Validação:

# Deve conter as colunas corretas e mínimo de 4 linhas:
Import-Csv ~/ncarga/rbac-report.csv | Select-Object -First 5
# Colunas esperadas: DisplayName, RoleDefinitionName, Scope, ObjectType

Etapa 9 — Implementar e gerenciar Azure Policy

Contexto: A auditoria identificou que recursos estavam sendo criados sem tags obrigatórias e em regiões não autorizadas. Para garantir conformidade desde o início, o time de governança exige políticas de localização e nomenclatura antes de qualquer implantação.

Tarefas:

[PowerShell] Atribua a policy built-in Allowed locations (ID: e56962a6-4747-49cd-b67b-bf8b01975c4f) no escopo da subscription usando New-AzPolicyAssignment. Passe listOfAllowedLocations como array com eastus e brazilsouth.

[PowerShell] Atribua a policy built-in Require a tag and its value on resources (ID: 1e30110a-5ceb-460c-a204-c1c3969c6d62) no escopo da subscription. Configure a tag obrigatória como Project com valor Ancora.

[Portal] Confirme as atribuições em: Policy → Compliance. Force a avaliação com Start-AzPolicyComplianceScan se necessário.

Critérios de Validação:

# Deve retornar 2 linhas, uma para cada policy atribuída:
Get-AzPolicyAssignment |
Where-Object { $_.Properties.DisplayName -like "*Allowed*" -or $_.Properties.DisplayName -like "*tag*" } |
Select-Object Name, @{N='DisplayName';E={$_.Properties.DisplayName}}, @{N='Scope';E={$_.Properties.Scope}}

Etapa 10 — Configurar bloqueios de recursos

Contexto: O resource group ncarga-rg-financeiro contém dados sensíveis de faturamento. O time jurídico exige que ele não possa ser excluído acidentalmente, mesmo por administradores. Os recursos de rede principal também precisam de bloqueio de modificação durante o período de implantação.

Tarefas:

[PowerShell] Aplique um lock do tipo CanNotDelete no resource group ncarga-rg-financeiro com nome ncarga-lock-financeiro e notas Protecao juridica LGPD usando New-AzResourceLock.

[PowerShell] Crie o resource group ncarga-rg-network na região eastus com a tag Project=Ancora. Aplique um lock do tipo ReadOnly com nome ncarga-lock-network-ro.

[Portal] Navegue em: Resource groups → ncarga-rg-financeiro → Locks. Tente excluir o resource group pelo portal e confirme que a operação é bloqueada.

Critérios de Validação:

# Deve retornar LockLevel = CanNotDelete:
Get-AzResourceLock -ResourceGroupName "ncarga-rg-financeiro" |
Select-Object Name, @{N='LockLevel';E={$_.Properties.Level}}, @{N='Notes';E={$_.Properties.Notes}}

# Deve retornar LockLevel = ReadOnly:
Get-AzResourceLock -ResourceGroupName "ncarga-rg-network" |
Select-Object Name, @{N='LockLevel';E={$_.Properties.Level}}

Etapa 11 — Aplicar e gerenciar tags em recursos

Contexto: O time de FinOps definiu uma taxonomia de tags para rastrear custos por projeto, ambiente e equipe responsável. As tags precisam ser aplicadas retroativamente aos resource groups já criados e prospectivamente em todos os novos recursos.

Tarefas:

[PowerShell] Aplique o conjunto de tags abaixo em ncarga-rg-financeiro e ncarga-rg-network usando Update-AzTag com a operação Merge:

TagValor
ProjectAncora
EnvironmentProduction
Ownerana.ferreira
CostCenterTI-001

[PowerShell] Crie o resource group ncarga-rg-compute na região eastus já com as quatro tags acima usando New-AzResourceGroup -Tag.

[PowerShell] Liste todos os resource groups com a tag Project=Ancora usando Get-AzResourceGroup -Tag.

Critérios de Validação:

# Deve retornar as 4 tags:
(Get-AzResourceGroup -Name "ncarga-rg-network").Tags

# Deve retornar Count >= 2:
Get-AzResource -TagName "Project" -TagValue "Ancora" | Measure-Object

Etapa 12 — Gerenciar resource groups

Contexto: O Projeto Âncora cresceu e agora exige um quarto resource group para os recursos de storage. Além disso, o time de operações precisa mover um recurso de teste criado no resource group errado para o correto, sem recriar o recurso.

Tarefas:

[PowerShell] Crie o resource group ncarga-rg-storage na região brazilsouth com as quatro tags padrão do projeto.

[PowerShell] Crie um Storage Account temporário (ncargatest001, SKU: Standard_LRS) no resource group ncarga-rg-compute para simular o recurso no local errado.

[PowerShell] Mova o Storage Account ncargatest001 de ncarga-rg-compute para ncarga-rg-storage usando Move-AzResource. Capture o ID do recurso antes do move com Get-AzStorageAccount.

Critérios de Validação:

# Deve retornar ResourceGroupName = ncarga-rg-storage:
Get-AzStorageAccount -Name "ncargatest001" -ResourceGroupName "ncarga-rg-storage" |
Select-Object StorageAccountName, ResourceGroupName

# Deve retornar saída vazia:
Get-AzStorageAccount -ResourceGroupName "ncarga-rg-compute" |
Where-Object { $_.StorageAccountName -eq "ncargatest001" }

Etapa 13 — Gerenciar subscriptions

Contexto: O diretor de TI solicitou um inventário completo da subscription atual antes de iniciar as negociações para uma segunda subscription dedicada ao ambiente de homologação.

Tarefas:

[PowerShell] Obtenha os detalhes da subscription atual usando Get-AzSubscription. Capture o Id, Name e TenantId em variáveis que serão usadas nas etapas seguintes.

[Portal] Confirme o nome, ID e tenant em: Subscriptions → [sua subscription] → Properties. Verifique o status de pagamento em: Cost Management + Billing → Subscriptions.

[PowerShell] Adicione a tag ProjectAncora=true diretamente na subscription usando Update-AzTag -ResourceId "/subscriptions/<id>" -Tag @{ProjectAncora="true"} -Operation Merge.

Critérios de Validação:

# Deve retornar ProjectAncora = true:
(Get-AzSubscription -SubscriptionId $subscriptionId).Tags

# Deve retornar State = Enabled:
Get-AzSubscription | Select-Object Name, Id, TenantId, State

Etapa 14 — Gerenciar custos com alertas, budgets e Azure Advisor

Contexto: O CFO estabeleceu um limite mensal de USD 500 para o Projeto Âncora durante a fase de implantação. O time de FinOps precisa configurar alertas automáticos e revisar as recomendações do Azure Advisor para otimizar os recursos já criados.

Tarefas:

[Portal] Crie o budget em: Cost Management + Billing → Budgets → Add

ParâmetroValor
Namencarga-budget-monthly
Reset periodMonthly
Budget amount500 USD
Alert threshold 180% (Actual)
Alert threshold 2100% (Forecasted)
Alert emailana.ferreira@<tenant>.onmicrosoft.com

[Portal] Confirme o budget em: Cost Management → Cost alerts. Verifique que ncarga-budget-monthly aparece com Status = Active.

[Portal] Revise as recomendações em: Azure Advisor → All recommendations. Filtre pela subscription e registre ao menos uma recomendação nas categorias Cost e Reliability.

Critérios de Validação:

dica
  • Budget ncarga-budget-monthly com Amount = 500 USD e Status = Active.
  • Dois alertas configurados: 80% Actual e 100% Forecasted.
  • Azure Advisor exibe score para a subscription com ao menos uma recomendação em Cost.

Etapa 15 — Configurar management groups

Contexto: Com a subscription do Projeto Âncora ativa, o time de arquitetura definiu uma hierarquia de management groups para suportar a expansão prevista: uma subscription de produção (atual) e uma futura de homologação.

Tarefas:

[PowerShell] Crie um management group de nível 1 com ID ncarga-mg-root e nome de exibição NovaCarga Root usando New-AzManagementGroup.

[PowerShell] Crie um management group filho com ID ncarga-mg-prod e nome NovaCarga Production subordinado ao ncarga-mg-root usando o parâmetro -ParentId.

[PowerShell] Mova a subscription atual para o management group ncarga-mg-prod usando New-AzManagementGroupSubscription -GroupId ncarga-mg-prod -SubscriptionId <id>.

Critérios de Validação:

# Deve retornar Name = ncarga-mg-prod com ParentId contendo ncarga-mg-root:
Get-AzManagementGroup -GroupName "ncarga-mg-prod" -Expand -Recurse |
Select-Object Name, DisplayName, ParentId

# Deve retornar sua subscription listada sob ncarga-mg-prod:
Get-AzManagementGroupSubscription -GroupId "ncarga-mg-prod" |
Select-Object DisplayName, Id

Domínio 2 — Storage

Etapa 16 — Configurar firewalls e redes virtuais do Azure Storage

Contexto: O storage account ncargatest001, movido para ncarga-rg-storage na Etapa 12, será o repositório oficial de documentos fiscais da NovaCarga. Por requisito da auditoria, o acesso público irrestrito precisa ser desabilitado.

Tarefas:

[PowerShell] Desabilite o acesso público de rede ao storage account ncargatest001 usando Update-AzStorageAccountNetworkRuleSet. Configure DefaultAction como Deny e Bypass como AzureServices,Logging,Metrics.

[PowerShell] Obtenha seu IP público com Invoke-RestMethod -Uri https://api.ipify.org. Adicione-o como exceção no firewall usando Add-AzStorageAccountNetworkRule -IPAddressOrRange <seu-ip>.

[Portal] Confirme em: Storage accounts → ncargatest001 → Networking. O campo Public network access deve exibir Enabled from selected virtual networks and IP addresses e seu IP deve aparecer na lista de exceções.

Critérios de Validação:

# Deve retornar Deny:
(Get-AzStorageAccountNetworkRuleSet -ResourceGroupName "ncarga-rg-storage" -AccountName "ncargatest001").DefaultAction

# Deve retornar seu IP com Action = Allow:
(Get-AzStorageAccountNetworkRuleSet -ResourceGroupName "ncarga-rg-storage" -AccountName "ncargatest001").IpRules

Etapa 17 — Criar e usar tokens SAS

Contexto: O sistema de TMS precisa fazer upload de comprovantes de entrega para o storage sem usar as chaves de acesso da conta. O time de segurança aprovou o uso de SAS tokens com escopo restrito e validade curta para essa integração.

Tarefas:

[PowerShell] Crie um container chamado comprovantes no storage account ncargatest001 com acesso privado usando New-AzStorageContainer.

[PowerShell] Gere um SAS token de nível de container para comprovantes com os parâmetros:

ParâmetroValor
PermissõesRead, Write, List
Expiração2 horas a partir do momento atual
Protocolo permitidoHTTPS apenas

Use New-AzStorageContainerSASToken. Capture a URL completa com o token.

[PowerShell] Teste o SAS token fazendo upload de um arquivo de texto local para o container comprovantes usando Set-AzStorageBlobContent com o contexto criado a partir do SAS token, sem usar as chaves de conta.

Critérios de Validação:

# Deve retornar o arquivo de teste com tamanho > 0:
Get-AzStorageBlob -Container "comprovantes" -Context <contexto-da-conta> |
Select-Object Name, Length

Etapa 18 — Configurar Stored Access Policies

Contexto: O time de desenvolvimento identificou que revogar SAS tokens individuais é inviável em caso de comprometimento. A solução é usar Stored Access Policies, que permitem revogar um conjunto inteiro de tokens sem recriá-los individualmente.

Tarefas:

[PowerShell] Crie uma Stored Access Policy chamada ncarga-sap-comprovantes no container comprovantes com permissões Read, Write, List e validade de 30 dias usando New-AzStorageContainerStoredAccessPolicy.

[PowerShell] Gere um novo SAS token vinculado à policy ncarga-sap-comprovantes, omitindo os parâmetros de permissão e expiração diretos — eles serão herdados da policy.

[PowerShell] Revogue a policy usando Remove-AzStorageContainerStoredAccessPolicy e confirme que o SAS token vinculado falha ao tentar listar os blobs do container.

Critérios de Validação:

# Antes da remoção — deve retornar Policy = ncarga-sap-comprovantes:
Get-AzStorageContainerStoredAccessPolicy -Container "comprovantes" -Context <contexto> |
Select-Object Policy, Permissions, ExpiryTime

# Após remoção — tentativa de listar blobs com o SAS vinculado deve retornar:
# Erro 403 AuthorizationFailure ou similar

Etapa 19 — Gerenciar chaves de acesso do storage

Contexto: A política de segurança da NovaCarga exige rotação de chaves de acesso do storage a cada 90 dias. Esta etapa documenta e executa o processo de rotação sem interrupção do serviço.

Tarefas:

[PowerShell] Obtenha as duas chaves de acesso do storage account ncargatest001 usando Get-AzStorageAccountKey. Registre o valor atual da key1 como referência para validação pós-rotação.

[PowerShell] Regenere a key1 usando New-AzStorageAccountKey -KeyName key1. Confirme que o novo valor difere do registrado anteriormente.

[Portal] Confirme a rotação em: Storage accounts → ncargatest001 → Security + networking → Access keys. Verifique que a key2 permanece inalterada.

Critérios de Validação:

# Deve retornar 2 linhas com key1 e key2:
$keys = Get-AzStorageAccountKey -ResourceGroupName "ncarga-rg-storage" -AccountName "ncargatest001"
$keys | Select-Object KeyName, Value
# key1 deve ter valor diferente do registrado antes da rotação

Etapa 20 — Configurar acesso baseado em identidade para Azure Files

Contexto: O departamento de RH precisa de um compartilhamento de arquivos para documentos de admissão e demissão. Por requisito de auditoria, o acesso deve ser controlado pela identidade do Microsoft Entra ID, sem uso de chaves de storage.

Tarefas:

[PowerShell] Crie um novo storage account chamado ncargatfiles001 na região brazilsouth, resource group ncarga-rg-storage, SKU Standard_LRS, kind StorageV2 usando New-AzStorageAccount.

[Portal] Habilite a autenticação baseada em identidade navegando em: Storage accounts → ncargatfiles001 → File shares → Active Directory. Selecione Microsoft Entra Kerberos como método de autenticação.

[PowerShell] Atribua a função Storage File Data SMB Share Contributor ao grupo ncarga-ti no escopo do storage account ncargatfiles001 usando New-AzRoleAssignment.

Critérios de Validação:

# Deve retornar ncarga-ti com Storage File Data SMB Share Contributor:
Get-AzRoleAssignment -Scope (Get-AzStorageAccount -ResourceGroupName "ncarga-rg-storage" -Name "ncargatfiles001").Id |
Where-Object { $_.RoleDefinitionName -like "*SMB*" } |
Select-Object DisplayName, RoleDefinitionName

Etapa 21 — Criar e configurar storage accounts

Contexto: O Projeto Âncora exige um storage account principal para logs de rastreamento do TMS, configurado com os parâmetros de segurança e desempenho definidos pelo time de arquitetura.

Tarefas:

[PowerShell] Crie o storage account ncargatms001 no resource group ncarga-rg-storage, região eastus, com os parâmetros:

ParâmetroValor
SKUStandard_GRS
KindStorageV2
AccessTierHot
MinimumTlsVersionTLS1_2
AllowBlobPublicAccess$false
EnableHttpsTrafficOnly$true

[PowerShell] Desabilite o acesso com chave de conta usando Set-AzStorageAccount -AllowSharedKeyAccess $false, forçando o uso de identidade Entra ID para acesso.

[Portal] Confirme todos os parâmetros em: Storage accounts → ncargatms001 → Configuration. Verifique que Secure transfer required está Enabled e Allow Blob public access está Disabled.

Critérios de Validação:

# Deve retornar todos os campos correspondendo aos parâmetros definidos:
$sa = Get-AzStorageAccount -ResourceGroupName "ncarga-rg-storage" -Name "ncargatms001"
$sa | Select-Object StorageAccountName, Sku, Kind, AccessTier, MinimumTlsVersion, AllowBlobPublicAccess, EnableHttpsTrafficOnly

Etapa 22 — Configurar redundância do Azure Storage

Contexto: O time de arquitetura revisou os requisitos de RPO e RTO para os dados do TMS. Os logs de rastreamento são críticos para auditorias regulatórias, e a leitura na região secundária é necessária para relatórios de contingência.

Tarefas:

[PowerShell] Verifique a redundância atual do storage account ncargatms001 com Get-AzStorageAccount. Confirme que o SKU é Standard_GRS.

[PowerShell] Mude a redundância de Standard_GRS para Standard_RAGRS (Read-Access Geo-Redundant Storage) usando Set-AzStorageAccount -SkuName Standard_RAGRS. Isso habilita leitura na região secundária.

[Portal] Confirme o endpoint da região secundária em: Storage accounts → ncargatms001 → Geo-replication. Anote a URL do endpoint secundário.

Critérios de Validação:

# Deve retornar Standard_RAGRS:
(Get-AzStorageAccount -ResourceGroupName "ncarga-rg-storage" -Name "ncargatms001").Sku.Name

# Deve retornar URLs de endpoint secundário preenchidas:
(Get-AzStorageAccount -ResourceGroupName "ncarga-rg-storage" -Name "ncargatms001").SecondaryEndpoints

Etapa 23 — Configurar replicação de objetos

Contexto: O time jurídico exige que imagens de documentos fiscais armazenadas no container comprovantes do storage ncargatest001 sejam automaticamente replicadas para ncargatms001 em outra região, para fins de conformidade e recuperação de desastre.

Tarefas:

[PowerShell] Habilite o versionamento de blobs nos storage accounts ncargatest001 e ncargatms001 — pré-requisito obrigatório para object replication.

[PowerShell] Habilite o Change Feed no storage account ncargatest001 (source) usando Update-AzStorageAccount -EnableChangeFeed $true.

[PowerShell] Crie uma regra de replicação de objetos do container comprovantes (source: ncargatest001) para o container comprovantes-replica (destination: ncargatms001) usando Set-AzStorageObjectReplicationPolicy. O filtro deve replicar apenas blobs com prefixo fiscal/.

Critérios de Validação:

# Deve retornar a policy com SourceAccount = ncargatest001:
Get-AzStorageObjectReplicationPolicy -ResourceGroupName "ncarga-rg-storage" -StorageAccountName "ncargatms001" |
Select-Object PolicyId, SourceAccount, DestinationAccount

Etapa 24 — Configurar criptografia do storage account

Contexto: A política de segurança exige que a criptografia dos dados em repouso no storage ncargatms001 seja gerenciada por chaves do cliente (Customer-Managed Keys) armazenadas no Azure Key Vault, em vez das chaves gerenciadas pela Microsoft.

Tarefas:

[PowerShell] Crie o Azure Key Vault ncarga-kv-001 no resource group ncarga-rg-storage, região eastus, com EnableSoftDelete $true e EnablePurgeProtection $true usando New-AzKeyVault.

[PowerShell] Crie uma chave RSA 2048 chamada ncarga-key-storage no Key Vault usando Add-AzKeyVaultKey -Destination Software -KeyType RSA -Size 2048.

[PowerShell] Configure o storage account ncargatms001 para usar Customer-Managed Key com a chave ncarga-key-storage do Key Vault ncarga-kv-001. Habilite o managed identity no storage account e conceda a permissão Key Vault Crypto Service Encryption User ao managed identity antes de aplicar a CMK.

Critérios de Validação:

# Deve retornar KeyName = ncarga-key-storage:
(Get-AzStorageAccount -ResourceGroupName "ncarga-rg-storage" -Name "ncargatms001").Encryption.KeyVaultProperties

# Deve retornar Microsoft.Keyvault:
(Get-AzStorageAccount -ResourceGroupName "ncarga-rg-storage" -Name "ncargatms001").Encryption.KeySource

Etapa 25 — Gerenciar dados com Azure Storage Explorer e AzCopy

Contexto: O time de operações precisa transferir um lote de documentos fiscais legados para o container comprovantes do storage ncargatest001. A transferência deve ser auditável e eficiente, usando AzCopy com autenticação via Microsoft Entra ID.

Pré-requisito

AzCopy v10+ instalado localmente. Verifique com: azcopy --version

Tarefas:

[PowerShell / CLI] Faça login no AzCopy com Microsoft Entra ID usando azcopy login --tenant-id <tenant-id>.

[PowerShell / CLI] Crie a pasta local ~/ncarga/fiscais/ com pelo menos 3 arquivos de texto simulando documentos fiscais. Faça upload da pasta inteira para o container comprovantes no caminho fiscal/2024/ usando azcopy copy com a flag --recursive.

[Portal] Confirme os arquivos em: Storage accounts → ncargatest001 → Storage browser → Blob containers → comprovantes → fiscal/2024/.

Critérios de Validação:

# Deve listar os arquivos uploadados com "Number of File Transfers: 3" ao final:
azcopy list "https://ncargatest001.blob.core.windows.net/comprovantes/fiscal/2024/"

Etapa 26 — Criar e configurar um compartilhamento no Azure Files

Contexto: O departamento de RH precisa de um compartilhamento de arquivos SMB acessível pelos colaboradores da sede. O compartilhamento será montado em servidores Windows que serão criados na Etapa 37.

Tarefas:

[PowerShell] Crie o compartilhamento ncarga-rh-share no storage account ncargatfiles001 com cota de 100 GiB e tier TransactionOptimized usando New-AzRmStorageShare.

[PowerShell] Crie os diretórios Admissoes, Demissoes e Ferias dentro do compartilhamento usando New-AzStorageDirectory para cada um.

[Portal] Confirme o compartilhamento, a cota de 100 GiB e os três subdiretórios em: Storage accounts → ncargatfiles001 → File shares → ncarga-rh-share. Copie o script de montagem PowerShell disponível em Connect para uso futuro.

Critérios de Validação:

# Deve retornar QuotaGiB = 100:
Get-AzRmStorageShare -ResourceGroupName "ncarga-rg-storage" -StorageAccountName "ncargatfiles001" -Name "ncarga-rh-share" |
Select-Object Name, QuotaGiB, AccessTier

# Deve retornar 3 itens: Admissoes, Demissoes, Ferias:
Get-AzStorageFile -ShareName "ncarga-rh-share" -Context <contexto> |
Select-Object Name

Etapa 27 — Criar e configurar um container no Azure Blob Storage

Contexto: O sistema de rastreamento gera imagens de GPS e telemetria em grande volume. Dois containers Blob com configurações distintas são necessários para separar dados brutos de dados processados.

Tarefas:

[PowerShell] Crie dois containers no storage account ncargatms001 com acesso privado usando New-AzStorageContainer:

ContainerDescrição
telemetria-rawDados brutos de GPS e sensores
telemetria-processadaDados processados e agregados

[Portal] Confirme os dois containers em: Storage accounts → ncargatms001 → Containers. Ambos devem exibir acesso Private.

Critérios de Validação:

# Deve retornar 2 containers com PublicAccess = Off:
Get-AzStorageContainer -Context <contexto-ncargatms001> |
Where-Object { $_.Name -like "telemetria*" } |
Select-Object Name, PublicAccess

Etapa 28 — Configurar storage tiers

Contexto: Os dados de telemetria têm ciclo de vida bem definido: acessados frequentemente nos primeiros 30 dias e raramente após 90 dias. O time de FinOps aprovou a mudança de tier manual para alguns blobs e a implementação de política automática.

Tarefas:

[PowerShell] Faça upload de um blob de teste chamado gps-sample-001.json para o container telemetria-raw no storage ncargatms001 no tier Hot.

[PowerShell] Mude o tier do blob gps-sample-001.json para Cool usando Set-AzStorageBlobTier. Confirme com Get-AzStorageBlob.

[Portal] Crie a regra de lifecycle ncarga-lifecycle-telemetria em: Storage accounts → ncargatms001 → Lifecycle management. Configure: mover para Cool após 30 dias e para Archive após 90 dias para blobs do container telemetria-raw.

Critérios de Validação:

# Deve retornar Cool:
(Get-AzStorageBlob -Container "telemetria-raw" -Blob "gps-sample-001.json" -Context <contexto>).ICloudBlob.Properties.StandardBlobTier

# No portal: regra ncarga-lifecycle-telemetria ativa com ações tierToCool (30d) e tierToArchive (90d)

Etapa 29 — Configurar soft delete para blobs e containers

Contexto: O time jurídico identificou que dados de telemetria excluídos acidentalmente podem ser necessários em auditorias. A política de retenção define que blobs e containers excluídos devem ser recuperáveis por 30 dias.

Tarefas:

[PowerShell] Habilite o soft delete para blobs no storage account ncargatms001 com retenção de 30 dias usando Enable-AzStorageBlobDeleteRetentionPolicy -RetentionDays 30.

[PowerShell] Habilite o soft delete para containers com retenção de 30 dias usando Enable-AzStorageContainerDeleteRetentionPolicy -RetentionDays 30.

[PowerShell] Teste o soft delete: exclua o blob gps-sample-001.json do container telemetria-raw e liste os blobs com Get-AzStorageBlob -IncludeDeleted para confirmar que o blob aparece com estado Deleted.

Critérios de Validação:

# Deve retornar Enabled = True, Days = 30:
(Get-AzStorageServiceProperty -ServiceType Blob -Context <contexto>).DeleteRetentionPolicy

# Deve retornar gps-sample-001.json com IsDeleted = True:
Get-AzStorageBlob -Container "telemetria-raw" -Context <contexto> -IncludeDeleted |
Where-Object { $_.IsDeleted -eq $true } |
Select-Object Name, IsDeleted

Etapa 30 — Configurar snapshots e soft delete para Azure Files

Contexto: O compartilhamento ncarga-rh-share contém documentos de admissão que precisam de proteção contra modificações e exclusões acidentais. Snapshots e soft delete garantem a recuperabilidade dos arquivos.

Tarefas:

[PowerShell] Habilite o soft delete para o compartilhamento ncarga-rh-share no storage account ncargatfiles001 com retenção de 14 dias usando Update-AzStorageFileServiceProperty.

[PowerShell] Crie um snapshot manual do compartilhamento usando $share.Snapshot() via contexto de storage. Capture o SnapshotTime gerado.

[Portal] Confirme o snapshot em: Storage accounts → ncargatfiles001 → File shares → ncarga-rh-share → Snapshots. Verifique também que Soft delete está habilitado nas propriedades do serviço File.

Critérios de Validação:

# Deve retornar Enabled = True, Days = 14:
(Get-AzStorageFileServiceProperty -ResourceGroupName "ncarga-rg-storage" -StorageAccountName "ncargatfiles001").ShareDeleteRetentionPolicy

# Deve retornar entrada com SnapshotTime preenchido:
Get-AzRmStorageShare -ResourceGroupName "ncarga-rg-storage" -StorageAccountName "ncargatfiles001" -Name "ncarga-rh-share" -GetShareUsage |
Select-Object Name, SnapshotTime

Etapa 31 — Configurar gerenciamento de ciclo de vida de blobs

Contexto: A política de ciclo de vida criada na Etapa 28 precisa ser expandida para cobrir o container telemetria-processada e adicionar uma ação de exclusão automática de blobs com mais de 365 dias.

Tarefas:

[PowerShell] Obtenha a política de lifecycle existente do storage account ncargatms001 usando Get-AzStorageAccountManagementPolicy.

[PowerShell] Adicione uma nova regra à política cobrindo o container telemetria-processada com as ações:

  • Mover para Cool após 60 dias
  • Mover para Archive após 180 dias
  • Excluir blobs após 365 dias

Use Set-AzStorageAccountManagementPolicy com o objeto de regra adicionado ao array existente.

[Portal] Confirme as duas regras em: Storage accounts → ncargatms001 → Lifecycle management. Ambas devem estar ativas.

Critérios de Validação:

# Deve retornar 2 regras com Enabled = True:
(Get-AzStorageAccountManagementPolicy -ResourceGroupName "ncarga-rg-storage" -StorageAccountName "ncargatms001").Rules |
Select-Object Name, Enabled

Etapa 32 — Configurar versionamento de blobs

Contexto: Os documentos fiscais no container comprovantes podem ser atualizados pelos sistemas de ERP e TMS. O time jurídico exige que todas as versões anteriores sejam mantidas para fins de auditoria.

Tarefas:

[PowerShell] Confirme que o versionamento de blobs está habilitado no storage account ncargatest001 (habilitado parcialmente na Etapa 23). Use Enable-AzStorageBlobVersioning se necessário.

[PowerShell] Faça upload de um blob chamado nf-001.json com conteúdo {"status":"emitida"} para o container comprovantes. Em seguida, atualize o mesmo blob com {"status":"cancelada"} — isso criará uma nova versão.

[PowerShell] Liste as versões do blob usando Get-AzStorageBlob -Container comprovantes -Blob nf-001.json -IncludeVersion. Confirme ao menos duas versões com VersionId distintos.

Critérios de Validação:

# Deve retornar ao menos 2 linhas, uma com IsLatestVersion = True:
Get-AzStorageBlob -Container "comprovantes" -Blob "nf-001.json" -Context <contexto> -IncludeVersion |
Select-Object Name, VersionId, IsLatestVersion

Domínio 3 — Infraestrutura como Código (IaC)

Pré-requisito

bicep --version — Instale o Bicep CLI antes de iniciar esta seção.

Etapa 33 — Interpretar templates ARM e arquivos Bicep

Contexto: O time de arquitetura da NovaCarga padronizou o uso de Bicep para todas as implantações futuras. Antes de criar novos recursos por IaC, o engenheiro precisa analisar um template Bicep existente e identificar os parâmetros, recursos e dependências declaradas.

Tarefas:

[IaC] Analise o arquivo Bicep abaixo sem executá-lo. Identifique e responda por escrito: quais recursos serão criados, qual é a dependência entre eles, quais parâmetros são obrigatórios e qual seria o valor padrão de location se não fosse fornecido.

// Template para revisão — NovaCarga Projeto Âncora
param location string = resourceGroup().location
param storageAccountName string
param keyVaultName string
@secure()
param adminPassword string

resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = {
name: storageAccountName
location: location
sku: { name: 'Standard_LRS' }
kind: 'StorageV2'
}

resource keyVault 'Microsoft.KeyVault/vaults@2023-07-01' = {
name: keyVaultName
location: location
properties: {
sku: { family: 'A', name: 'standard' }
tenantId: subscription().tenantId
accessPolicies: []
enableSoftDelete: true
}
dependsOn: [storageAccount]
}

[PowerShell] Exporte o storage account ncargatest001 como template ARM usando Export-AzResourceGroup -ResourceGroupName ncarga-rg-storage -Resource <id-do-storage>. Salve o JSON exportado localmente.

[IaC] Converta o template ARM exportado para Bicep usando bicep decompile <arquivo>.json. Confirme que o arquivo .bicep foi gerado sem erros.

Critérios de Validação:

# Deve listar o arquivo .bicep gerado:
ls *.bicep

# Deve compilar sem erros:
bicep build <arquivo-decompilado>.bicep

Etapa 34 — Modificar um template ARM existente

Contexto: O time de operações identificou que o template ARM exportado na Etapa 33 não inclui a configuração de HTTPS obrigatório. O engenheiro precisa modificar o template antes de reutilizá-lo em implantações automatizadas.

Tarefas:

[IaC] No arquivo ARM JSON exportado na Etapa 33, localize o recurso do tipo Microsoft.Storage/storageAccounts dentro do array resources. Adicione a propriedade supportsHttpsTrafficOnly: true dentro de properties sem remover nenhuma propriedade existente.

[IaC] Adicione um parâmetro environment do tipo string com allowedValues: ['dev', 'staging', 'prod'] na seção parameters do template.

[PowerShell] Valide o template modificado:

Test-AzResourceGroupDeployment -ResourceGroupName "ncarga-rg-storage" `
-TemplateFile <caminho-do-json-modificado> `
-environment "prod" `
-storageAccountName "ncargatvalid001"

Critérios de Validação:

# Deve retornar saída sem erros de validação:
Test-AzResourceGroupDeployment -ResourceGroupName "ncarga-rg-storage" `
-TemplateFile <arquivo-modificado>.json `
-environment "prod" `
-storageAccountName "ncargatvalid001"

Etapa 35 — Modificar um arquivo Bicep existente

Contexto: O arquivo Bicep gerado na Etapa 33 precisa ser expandido para incluir uma referência ao Key Vault existente e adicionar um output com a URI do storage account, permitindo que outros módulos Bicep referenciem os recursos criados.

Tarefas:

[IaC] Adicione um bloco output ao arquivo .bicep que exponha o blobEndpoint do storage account com o nome storageEndpoint do tipo string.

[IaC] Adicione uma referência ao Key Vault existente ncarga-kv-001 usando um recurso com escopo existing do tipo Microsoft.KeyVault/vaults@2023-07-01.

[IaC] Compile o arquivo Bicep modificado com bicep build e confirme ausência de erros. Não faça deploy nesta etapa.

Critérios de Validação:

# Deve gerar o arquivo .json correspondente sem erros:
bicep build <arquivo-modificado>.bicep

# Deve encontrar a chave storageEndpoint:
cat <arquivo>.json | grep -i "storageEndpoint"

Etapa 36 — Implantar recursos com template Bicep

Contexto: O time de automação aprovou o primeiro deployment de infraestrutura via IaC no Projeto Âncora. O Bicep desenvolvido nas etapas anteriores será usado para criar um storage account de auditoria sem interação manual.

Tarefas:

[IaC] Crie o arquivo ncarga-audit-storage.bicep preenchendo os campos indicados:

// Preencha os campos marcados com <PREENCHER>
param location string = <PREENCHER> // brazilsouth
param storageAccountName string = <PREENCHER> // ncargataudit001
param tags object = <PREENCHER> // as 4 tags padrão do projeto

resource auditStorage 'Microsoft.Storage/storageAccounts@2023-01-01' = {
name: <PREENCHER>
location: <PREENCHER>
tags: <PREENCHER>
sku: { name: <PREENCHER> } // Standard_LRS
kind: <PREENCHER> // StorageV2
properties: {
supportsHttpsTrafficOnly: <PREENCHER> // true
minimumTlsVersion: <PREENCHER> // TLS1_2
allowBlobPublicAccess: <PREENCHER> // false
}
}

output storageId string = <PREENCHER>
output storageName string = <PREENCHER>

[PowerShell] Compile o Bicep e faça o deployment usando New-AzResourceGroupDeployment com -TemplateFile. Nomeie o deployment como ncarga-deploy-audit-storage.

[PowerShell] Capture os valores de output do deployment:

(Get-AzResourceGroupDeployment -ResourceGroupName "ncarga-rg-storage" -Name "ncarga-deploy-audit-storage").Outputs

Critérios de Validação:

# Deve retornar ProvisioningState = Succeeded:
Get-AzResourceGroupDeployment -ResourceGroupName "ncarga-rg-storage" -Name "ncarga-deploy-audit-storage" |
Select-Object DeploymentName, ProvisioningState

# Deve retornar Location = brazilsouth:
Get-AzStorageAccount -ResourceGroupName "ncarga-rg-storage" -Name "ncargataudit001" |
Select-Object StorageAccountName, Location

Domínio 4 — Compute e Contêineres

Etapa 37 — Criar uma máquina virtual

Contexto: O sistema WMS legado da NovaCarga precisa ser hospedado em uma VM Windows no Azure. O servidor será criado sem IP público — o acesso administrativo será feito exclusivamente via Azure Bastion, configurado na Etapa 61.

aviso

O lock ReadOnly em ncarga-rg-network criado na Etapa 10 precisa ser removido temporariamente para criar recursos de rede nesta etapa. Recrie-o após concluir.

Tarefas:

[PowerShell] Crie a rede virtual ncarga-vnet-compute no resource group ncarga-rg-network com o espaço de endereços 10.10.0.0/16 e a subnet snet-compute com range 10.10.1.0/24 usando New-AzVirtualNetwork e Add-AzVirtualNetworkSubnetConfig.

[PowerShell] Crie a VM ncarga-vm-wms01 com os parâmetros:

ParâmetroValor
Resource Groupncarga-rg-compute
Regiãoeastus
ImagemWin2022Datacenter
TamanhoStandard_D2s_v3
Subnetsnet-compute na ncarga-vnet-compute
IP PúblicoNenhum
AutenticaçãoSenha (admin: ncargaadmin)

Use New-AzVM. Capture o Id da VM ao final.

[PowerShell] Confirme que a NIC associada não tem IP público:

(Get-AzNetworkInterface -ResourceGroupName "ncarga-rg-compute" |
Where-Object { $_.VirtualMachine.Id -like "*ncarga-vm-wms01*" }).IpConfigurations.PublicIpAddress
# Resultado esperado: $null

Critérios de Validação:

# Deve retornar ProvisioningState = Succeeded:
Get-AzVM -ResourceGroupName "ncarga-rg-compute" -Name "ncarga-vm-wms01" |
Select-Object Name, Location, @{N='ProvisioningState';E={$_.ProvisioningState}}

Etapa 38 — Configurar encryption at host para VMs

Contexto: O time de segurança exige que todos os dados temporários dos discos de cache e do disco de SO das VMs sejam criptografados no próprio host de compute do Azure. Esta configuração deve ser habilitada na VM ncarga-vm-wms01.

Tarefas:

[PowerShell] Verifique se o recurso EncryptionAtHost está habilitado na subscription usando Get-AzProviderFeature -FeatureName EncryptionAtHost -ProviderNamespace Microsoft.Compute. Se o estado for NotRegistered, registre-o com Register-AzProviderFeature e aguarde.

[PowerShell] Pare a VM ncarga-vm-wms01 com Stop-AzVM -Force. Aguarde o status Deallocated.

[PowerShell] Habilite Encryption at Host na VM usando Update-AzVM com SecurityProfile.EncryptionAtHost = $true. Reinicie a VM após a configuração.

Critérios de Validação:

# Deve retornar True:
(Get-AzVM -ResourceGroupName "ncarga-rg-compute" -Name "ncarga-vm-wms01").SecurityProfile.EncryptionAtHost

# Deve retornar PowerState/running:
Get-AzVM -ResourceGroupName "ncarga-rg-compute" -Name "ncarga-vm-wms01" -Status |
Select-Object -ExpandProperty Statuses | Where-Object { $_.Code -like "PowerState*" }

Etapa 39 — Mover uma VM para outro resource group

Contexto: Após uma revisão da estrutura de resource groups, o time de arquitetura decidiu que todas as VMs de produção devem estar em um resource group dedicado chamado ncarga-rg-vms. A VM ncarga-vm-wms01 precisa ser movida sem recriação.

Tarefas:

[PowerShell] Crie o resource group ncarga-rg-vms na região eastus com as quatro tags padrão do projeto.

[PowerShell] Identifique todos os recursos dependentes da VM ncarga-vm-wms01 (discos, NICs, etc.) usando Get-AzResource -ResourceGroupName ncarga-rg-compute | Where-Object { $_.Name -like "*wms01*" }. Capture os IDs de todos eles.

[PowerShell] Mova a VM e todos os seus recursos dependentes para ncarga-rg-vms usando Move-AzResource -ResourceId @(<lista-de-ids>) -DestinationResourceGroupName ncarga-rg-vms.

Critérios de Validação:

# Deve retornar ResourceGroupName = ncarga-rg-vms:
Get-AzVM -ResourceGroupName "ncarga-rg-vms" -Name "ncarga-vm-wms01" |
Select-Object Name, ResourceGroupName

# Deve retornar saída vazia:
Get-AzVM -ResourceGroupName "ncarga-rg-compute" -Name "ncarga-vm-wms01" -ErrorAction SilentlyContinue

Etapa 40 — Gerenciar tamanhos de VM

Contexto: O sistema WMS entra em pico de carga no fechamento de mês. O time de operações solicitou o redimensionamento temporário da VM ncarga-vm-wms01 para um tamanho com 4+ vCPUs e 16+ GB de RAM.

Tarefas:

[PowerShell] Liste os tamanhos de VM disponíveis na região eastus com 4+ vCPUs e 8+ GB de RAM usando Get-AzVMSize -Location eastus. Identifique Standard_D4s_v3 como opção adequada.

[PowerShell] Pare a VM ncarga-vm-wms01 (deallocate). Altere o tamanho para Standard_D4s_v3 modificando a propriedade HardwareProfile.VmSize e aplicando com Update-AzVM.

[PowerShell] Inicie a VM e confirme o novo tamanho com Get-AzVM.

Critérios de Validação:

# Deve retornar Standard_D4s_v3:
(Get-AzVM -ResourceGroupName "ncarga-rg-vms" -Name "ncarga-vm-wms01").HardwareProfile.VmSize

Etapa 41 — Gerenciar discos de VM

Contexto: O banco de dados SQLite local do WMS está crescendo e o disco de dados atual está ficando pequeno. O time de TI precisa adicionar um disco de dados dedicado de 128 GB para os arquivos do banco de dados.

Tarefas:

[PowerShell] Crie o managed disk ncarga-disk-wms-data01 no resource group ncarga-rg-vms, região eastus, com 128 GiB e SKU Premium_LRS usando New-AzDisk.

[PowerShell] Anexe o disco à VM ncarga-vm-wms01 como disco de dados no LUN 0 usando Add-AzVMDataDisk e Update-AzVM.

[PowerShell] Confirme o anexo com Get-AzVM verificando o campo StorageProfile.DataDisks.

Critérios de Validação:

# Deve retornar Name = ncarga-disk-wms-data01, Lun = 0, DiskSizeGB = 128:
(Get-AzVM -ResourceGroupName "ncarga-rg-vms" -Name "ncarga-vm-wms01").StorageProfile.DataDisks |
Select-Object Name, Lun, DiskSizeGB, ManagedDisk

Etapa 42 — Implantar VMs em Availability Zones e Availability Sets

Contexto: O sistema TMS requer alta disponibilidade. O time de arquitetura definiu que as VMs do TMS devem ser implantadas em Availability Zones diferentes para garantir SLA de 99,99%.

Tarefas:

[PowerShell] Crie a VM ncarga-vm-tms01 no resource group ncarga-rg-vms com imagem UbuntuLTS, tamanho Standard_D2s_v3, zona 1, subnet snet-compute, sem IP público, autenticação SSH.

[PowerShell] Crie a VM ncarga-vm-tms02 com os mesmos parâmetros, mas na zona 2. Ambas as VMs devem estar na subnet snet-compute.

[PowerShell] Confirme que cada VM está em uma zona distinta:

Get-AzVM -ResourceGroupName "ncarga-rg-vms" |
Where-Object { $_.Name -like "*tms*" } |
Select-Object Name, Zones
# Esperado: ncarga-vm-tms01 com Zones = {1}, ncarga-vm-tms02 com Zones = {2}

Critérios de Validação:

# Deve retornar Zones = {1} para tms01 e Zones = {2} para tms02:
Get-AzVM -ResourceGroupName "ncarga-rg-vms" |
Where-Object { $_.Name -like "*tms*" } |
Select-Object Name, Zones

Etapa 43 — Implantar e configurar Azure Virtual Machine Scale Sets

Contexto: O serviço de rastreamento em tempo real recebe picos de tráfego no período comercial. O time de arquitetura aprovou o uso de Virtual Machine Scale Sets para escalar automaticamente a camada de processamento de eventos de GPS.

Tarefas:

[PowerShell] Crie o VMSS ncarga-vmss-tracker no resource group ncarga-rg-vms, região eastus, com imagem UbuntuLTS, tamanho Standard_D2s_v3, capacidade inicial de 2 instâncias, subnet snet-compute, upgrade policy Automatic e zonas 1,2,3 usando New-AzVmss.

[PowerShell] Configure a política de autoscaling usando New-AzAutoscaleSetting:

  • Scale-out: CPU média > 70% por 5 min → adicionar 1 instância
  • Scale-in: CPU média < 30% por 10 min → remover 1 instância
  • Mínimo: 2 instâncias, Máximo: 10 instâncias

[Portal] Confirme as 2 instâncias ativas e a política de autoscale em: Virtual Machine Scale Sets → ncarga-vmss-tracker → Instances e Scaling.

Critérios de Validação:

# Deve retornar Capacity = 2, Tier = Standard_D2s_v3:
Get-AzVmss -ResourceGroupName "ncarga-rg-vms" -VMScaleSetName "ncarga-vmss-tracker" |
Select-Object Name, @{N='Capacity';E={$_.Sku.Capacity}}, @{N='Tier';E={$_.Sku.Name}}

# Deve retornar Enabled = True:
Get-AzAutoscaleSetting -ResourceGroupName "ncarga-rg-vms" |
Where-Object { $_.Name -like "*tracker*" } |
Select-Object Name, Enabled

Etapa 44 — Criar e gerenciar um Azure Container Registry

Contexto: A nova plataforma de rastreamento é desenvolvida como microserviços em contêineres. O time de DevOps precisa de um registry privado no Azure para armazenar e versionar as imagens Docker antes de implantá-las nos clusters.

Pré-requisito

Docker Desktop instalado e em execução. Verifique com: docker --version

Tarefas:

[PowerShell] Crie o Azure Container Registry ncargatregistry001 no resource group ncarga-rg-compute, região eastus, SKU Standard usando New-AzContainerRegistry.

[PowerShell] Habilite o usuário administrador com Update-AzContainerRegistry -EnableAdminUser $true. Obtenha as credenciais usando Get-AzContainerRegistryCredential.

[PowerShell / CLI] Faça login no registry via Docker CLI com docker login ncargatregistry001.azurecr.io. Crie uma imagem de teste local (FROM alpine:latest), rotule-a e faça push para ncargatregistry001.azurecr.io/rastreamento:v1.0.

Critérios de Validação:

# Deve retornar "rastreamento" listado como repositório:
Get-AzContainerRegistryRepository -RegistryName "ncargatregistry001" |
Select-Object -ExpandProperty Name

# Deve retornar Sku = Standard, AdminUserEnabled = True:
Get-AzContainerRegistry -ResourceGroupName "ncarga-rg-compute" -Name "ncargatregistry001" |
Select-Object Name, Sku, AdminUserEnabled

Etapa 45 — Provisionar um container com Azure Container Instances

Contexto: Para validar a imagem rastreamento:v1.0 publicada na Etapa 44, o time de QA precisa de um ambiente efêmero de teste. O Azure Container Instances permitirá executar o contêiner sem gerenciar infraestrutura de orquestração.

Tarefas:

[PowerShell] Crie o Container Instance ncarga-aci-rastreamento no resource group ncarga-rg-compute, região eastus, com:

ParâmetroValor
Imagemncargatregistry001.azurecr.io/rastreamento:v1.0
CPU1
Memory1.5 GiB
OSLinux
Restart policyNever

Use New-AzContainerGroup com as credenciais do registry obtidas na Etapa 44.

[PowerShell] Aguarde o container atingir o estado Terminated ou Running com Get-AzContainerGroup. Capture os logs com Get-AzContainerInstanceLog.

[Portal] Confirme a saída de log em: Container instances → ncarga-aci-rastreamento → Containers → Logs.

Critérios de Validação:

# Deve retornar a imagem correta:
Get-AzContainerGroup -ResourceGroupName "ncarga-rg-compute" -Name "ncarga-aci-rastreamento" |
Select-Object Name, Location, @{N='State';E={$_.InstanceViewState}}, @{N='Image';E={$_.Containers[0].Image}}

Etapa 46 — Provisionar um container com Azure Container Apps

Contexto: Após validar a imagem com ACI na Etapa 45, o time de DevOps decidiu hospedar o serviço de rastreamento em produção no Azure Container Apps, que oferece escalonamento automático baseado em eventos HTTP.

Tarefas:

[CLI] Crie o Container Apps Environment ncarga-cae-prod no resource group ncarga-rg-compute, região eastus usando az containerapp env create.

[CLI] Crie o Container App ncarga-ca-rastreamento no environment ncarga-cae-prod com:

ParâmetroValor
Imagemncargatregistry001.azurecr.io/rastreamento:v1.0
CPU0.5
Memory1Gi
Min replicas1
Max replicas5
IngressExternal, porta 80

[CLI] Obtenha a URL do Container App com az containerapp show e confirme que o endpoint responde.

Critérios de Validação:

# Deve retornar URL no formato *.azurecontainerapps.io:
az containerapp show --name ncarga-ca-rastreamento --resource-group ncarga-rg-compute \
--query "properties.configuration.ingress.fqdn" -o tsv

# Deve retornar Running:
az containerapp show --name ncarga-ca-rastreamento --resource-group ncarga-rg-compute \
--query "properties.runningStatus" -o tsv

Etapa 47 — Gerenciar tamanho e escalonamento de contêineres

Contexto: O Container App ncarga-ca-rastreamento precisa de uma política de escalonamento baseada em requisições HTTP, alinhada com o padrão de uso identificado: picos de tráfego no horário comercial.

Tarefas:

[CLI] Atualize o Container App para adicionar uma regra de escalonamento baseada em HTTP: quando o número de requisições concorrentes por réplica exceder 50, novas réplicas devem ser criadas. Use az containerapp update --scale-rule-name http-scale --scale-rule-type http.

[CLI] Atualize os limites de recursos do Container App para --cpu 1.0 --memory 2Gi usando az containerapp update.

[Portal] Confirme as regras de escalonamento e os limites de recursos em: Container Apps → ncarga-ca-rastreamento → Scale and replicas.

Critérios de Validação:

# Deve retornar minReplicas = 1, maxReplicas = 5 e regra http-scale presente:
az containerapp show --name ncarga-ca-rastreamento --resource-group ncarga-rg-compute \
--query "properties.template.scale" -o json

# Deve retornar cpu = "1.0", memory = "2Gi":
az containerapp show --name ncarga-ca-rastreamento --resource-group ncarga-rg-compute \
--query "properties.template.containers[0].resources" -o json

Domínio 5 — App Service

Etapa 48 — Criar e configurar um App Service Plan

Contexto: O portal de clientes da NovaCarga, uma aplicação web para consulta de status de entrega, será hospedado no Azure App Service. O App Service Plan determinará os recursos computacionais disponíveis para a aplicação.

Custo

App Service P1v3 gera ~USD 0,16/h. Reduza para F1 entre sessões se necessário.

Tarefas:

[PowerShell] Crie o App Service Plan ncarga-asp-web no resource group ncarga-rg-compute, região brazilsouth, com SKU P1v3, OS Linux e 1 worker usando New-AzAppServicePlan.

[Portal] Visualize os tiers disponíveis em: App Service plans → ncarga-asp-web → Scale up (App Service plan). Não altere o tier neste momento.

[PowerShell] Confirme a criação com Get-AzAppServicePlan verificando os campos Sku.Name e Kind.

Critérios de Validação:

# Deve retornar Sku = P1v3, OS = linux, NumberOfWorkers = 1:
Get-AzAppServicePlan -ResourceGroupName "ncarga-rg-compute" -Name "ncarga-asp-web" |
Select-Object Name, @{N='Sku';E={$_.Sku.Name}}, @{N='OS';E={$_.Kind}}, NumberOfWorkers

Etapa 49 — Configurar escalonamento para App Service Plan

Contexto: O portal de clientes tem tráfego concentrado no horário comercial. O time de FinOps aprovou escalonamento automático do App Service Plan baseado em métricas de CPU para otimizar custo fora do horário de pico.

Tarefas:

[Portal] Habilite o autoscale em: App Service plans → ncarga-asp-web → Scale out (App Service plan). Crie o perfil ncarga-asp-autoscale com mínimo de 1, máximo de 3 e padrão de 1 instância.

[Portal] Adicione duas regras ao perfil:

  • Scale-out: CPU média > 70% por 5 min → aumentar 1 instância
  • Scale-in: CPU média < 25% por 10 min → diminuir 1 instância

[PowerShell] Confirme a configuração com Get-AzAutoscaleSetting -ResourceGroupName ncarga-rg-compute verificando que o target resource é o App Service Plan ncarga-asp-web.

Critérios de Validação:

# Deve retornar Enabled = True com target ncarga-asp-web:
Get-AzAutoscaleSetting -ResourceGroupName "ncarga-rg-compute" |
Where-Object { $_.TargetResourceUri -like "*ncarga-asp-web*" } |
Select-Object Name, Enabled

Etapa 50 — Criar um App Service

Contexto: Com o App Service Plan provisionado, o time de desenvolvimento precisa criar o Web App que hospedará o portal de consulta de status de entrega.

Tarefas:

[PowerShell] Crie o Web App ncarga-webapp-portal no App Service Plan ncarga-asp-web, resource group ncarga-rg-compute, runtime NODE|18-lts (Linux) usando New-AzWebApp.

[PowerShell] Configure as application settings com Set-AzWebApp -AppSettings:

ChaveValor
ENVIRONMENTproduction
STORAGE_ACCOUNTncargatms001
PROJECTAncora

[Portal] Copie a URL padrão em: App Services → ncarga-webapp-portal → Overview. Confirme que o site responde com a página padrão do Node.js.

Critérios de Validação:

# Deve retornar State = Running com DefaultHostName preenchido:
Get-AzWebApp -ResourceGroupName "ncarga-rg-compute" -Name "ncarga-webapp-portal" |
Select-Object Name, State, DefaultHostName

# Deve retornar Value = production:
(Get-AzWebApp -ResourceGroupName "ncarga-rg-compute" -Name "ncarga-webapp-portal").SiteConfig.AppSettings |
Where-Object { $_.Name -eq "ENVIRONMENT" } | Select-Object Name, Value

Etapa 51 — Configurar certificados e TLS para App Service

Contexto: O portal de clientes deve usar HTTPS obrigatório. O time de segurança exige que conexões HTTP sejam redirecionadas para HTTPS e que a versão mínima de TLS seja 1.2.

Tarefas:

[PowerShell] Habilite o redirecionamento HTTPS no Web App ncarga-webapp-portal usando Set-AzWebApp -HttpsOnly $true.

[PowerShell] Configure a versão mínima de TLS para 1.2 no Web App usando Set-AzWebApp com o parâmetro MinTlsVersion.

[Portal] Confirme em: App Services → ncarga-webapp-portal → TLS/SSL settings

  • HTTPS Only: On
  • Minimum Inbound TLS Version: 1.2

Critérios de Validação:

$webapp = Get-AzWebApp -ResourceGroupName "ncarga-rg-compute" -Name "ncarga-webapp-portal"

# Deve retornar True:
$webapp.HttpsOnly

# Deve retornar 1.2:
$webapp.SiteConfig.MinTlsVersion

Etapa 52 — Configurar backup para App Service

Contexto: O portal de clientes deve ter backup diário automático para recuperação em caso de falha de implantação ou alteração indevida de configuração. O backup será armazenado no storage account ncargataudit001.

Tarefas:

[Portal] Configure o backup em: App Services → ncarga-webapp-portal → Backups

ParâmetroValor
Storage accountncargataudit001
Containerappservice-backups (criar novo)
FrequênciaDiária
Hora02:00 UTC
Retenção30 dias

[Portal] Acione um backup manual clicando em Backup Now e aguarde a conclusão.

[PowerShell] Liste os backups com Get-AzWebAppBackupList e confirme que o backup manual aparece com status Succeeded.

Critérios de Validação:

# Deve retornar Succeeded = True com FinishedTimeUtc preenchido:
Get-AzWebAppBackupList -ResourceGroupName "ncarga-rg-compute" -Name "ncarga-webapp-portal" |
Select-Object BackupName, StorageAccountUrl, Succeeded, FinishedTimeUtc |
Sort-Object FinishedTimeUtc -Descending |
Select-Object -First 1

Etapa 53 — Configurar deployment slots para App Service

Contexto: O time de desenvolvimento adotou o padrão Blue-Green deployment para o portal de clientes. Um slot de staging permitirá que novas versões sejam testadas em produção sem afetar os usuários.

Tarefas:

[PowerShell] Crie o deployment slot staging no Web App ncarga-webapp-portal usando New-AzWebAppSlot.

[Portal] Configure em: App Services → ncarga-webapp-portal → Deployment slots → staging

  • Application setting SLOT_NAME=staging como setting do slot (não swappable)
  • Application setting ENVIRONMENT=staging como setting swappable

[PowerShell] Execute a troca entre os slots com Switch-AzWebAppSlot -SourceSlotName staging -DestinationSlotName production. Confirme que o slot de produção agora tem a setting ENVIRONMENT=staging.

Critérios de Validação:

# Deve retornar State = Running:
Get-AzWebAppSlot -ResourceGroupName "ncarga-rg-compute" -Name "ncarga-webapp-portal" -Slot "staging" |
Select-Object Name, State

# Após o swap — deve retornar Value = staging:
(Get-AzWebApp -ResourceGroupName "ncarga-rg-compute" -Name "ncarga-webapp-portal").SiteConfig.AppSettings |
Where-Object { $_.Name -eq "ENVIRONMENT" } | Select-Object Value

Domínio 6 — Redes

Etapa 54 — Criar e configurar redes virtuais e subnets

Contexto: A infraestrutura de rede do Projeto Âncora precisa ser expandida para suportar a segmentação por função de carga de trabalho. Uma segunda rede virtual será criada para os recursos de storage e serviços, com subnets dedicadas por tipo de recurso.

Tarefas:

[PowerShell] Crie a VNet ncarga-vnet-services no resource group ncarga-rg-network, região brazilsouth, com espaço de endereços 10.20.0.0/16 e as subnets:

SubnetRange
snet-storage10.20.1.0/24
snet-web10.20.2.0/24
AzureBastionSubnet10.20.0.0/27 (nome exato obrigatório)

[PowerShell] Crie o NSG ncarga-nsg-web e associe-o à subnet snet-web. Adicione regras de entrada permitindo HTTP (80) e HTTPS (443) de qualquer origem, e bloqueando todo o restante com prioridade mais baixa.

[PowerShell] Confirme que o NSG está associado à subnet snet-web com Get-AzVirtualNetworkSubnetConfig.

Critérios de Validação:

# Deve retornar as 3 subnets com os ranges corretos:
(Get-AzVirtualNetwork -ResourceGroupName "ncarga-rg-network" -Name "ncarga-vnet-services").Subnets |
Select-Object Name, AddressPrefix

# Deve retornar o ID do ncarga-nsg-web:
(Get-AzVirtualNetworkSubnetConfig -Name "snet-web" -VirtualNetwork (Get-AzVirtualNetwork -Name "ncarga-vnet-services" -ResourceGroupName "ncarga-rg-network")).NetworkSecurityGroup.Id

Etapa 55 — Criar e configurar peering de redes virtuais

Contexto: As VMs do WMS e TMS na ncarga-vnet-compute precisam acessar os storage accounts protegidos por private endpoints na ncarga-vnet-services. O peering entre as duas redes virtuais é a solução de conectividade aprovada.

Tarefas:

[PowerShell] Crie o peering da ncarga-vnet-compute para ncarga-vnet-services usando Add-AzVirtualNetworkPeering com AllowForwardedTraffic habilitado.

[PowerShell] Crie o peering recíproco da ncarga-vnet-services para ncarga-vnet-compute com os mesmos parâmetros. O peering só é funcional quando ambos os lados estão configurados.

[PowerShell] Confirme que ambos os peerings estão com estado Connected usando Get-AzVirtualNetworkPeering.

Critérios de Validação:

# Ambos devem retornar PeeringState = Connected:
Get-AzVirtualNetworkPeering -ResourceGroupName "ncarga-rg-network" -VirtualNetworkName "ncarga-vnet-compute" |
Select-Object Name, PeeringState

Get-AzVirtualNetworkPeering -ResourceGroupName "ncarga-rg-network" -VirtualNetworkName "ncarga-vnet-services" |
Select-Object Name, PeeringState

Etapa 56 — Configurar IPs públicos

Contexto: O Load Balancer público que será criado na Etapa 65 para o portal de clientes precisa de um IP público estático com DNS personalizado. Este IP será anunciado para os clientes e não pode mudar após a implantação.

Tarefas:

[PowerShell] Crie o IP público ncarga-pip-lb no resource group ncarga-rg-network, região brazilsouth, com:

ParâmetroValor
SKUStandard
Allocation methodStatic
DNS labelncarga-portal
VersionIPv4

Use New-AzPublicIpAddress.

[PowerShell] Capture o valor do campo IpAddress com Get-AzPublicIpAddress. Esse valor será usado na Etapa 65.

[Portal] Confirme o DNS name label gerado em: Public IP addresses → ncarga-pip-lb → Configuration. O FQDN deve ser ncarga-portal.<região>.cloudapp.azure.com.

Critérios de Validação:

# Deve retornar IpAddress preenchido, PublicIpAllocationMethod = Static, DnsLabel = ncarga-portal:
$pip = Get-AzPublicIpAddress -ResourceGroupName "ncarga-rg-network" -Name "ncarga-pip-lb"
$pip | Select-Object Name, IpAddress, PublicIpAllocationMethod, @{N='DnsLabel';E={$_.DnsSettings.DomainNameLabel}}

Etapa 57 — Configurar rotas definidas pelo usuário (UDR)

Contexto: O time de segurança determinou que todo o tráfego de saída das VMs para a internet deve passar por um Network Virtual Appliance (NVA) de firewall. Uma UDR será configurada na subnet snet-compute para forçar esse roteamento.

Tarefas:

[PowerShell] Crie a Route Table ncarga-rt-compute no resource group ncarga-rg-network com a tag Project=Ancora usando New-AzRouteTable.

[PowerShell] Adicione a rota route-to-nva na Route Table com destino 0.0.0.0/0, next hop type VirtualAppliance e next hop IP 10.10.10.4 (IP fictício do NVA) usando Add-AzRouteConfig e Set-AzRouteTable.

[PowerShell] Associe a Route Table ncarga-rt-compute à subnet snet-compute da rede ncarga-vnet-compute usando Set-AzVirtualNetworkSubnetConfig com o parâmetro -RouteTable.

Critérios de Validação:

# Deve retornar route-to-nva com NextHopType = VirtualAppliance, NextHopIpAddress = 10.10.10.4:
(Get-AzRouteTable -ResourceGroupName "ncarga-rg-network" -Name "ncarga-rt-compute").Routes |
Select-Object Name, AddressPrefix, NextHopType, NextHopIpAddress

# Deve retornar o ID da Route Table ncarga-rt-compute:
(Get-AzVirtualNetworkSubnetConfig -Name "snet-compute" -VirtualNetwork (Get-AzVirtualNetwork -Name "ncarga-vnet-compute" -ResourceGroupName "ncarga-rg-network")).RouteTable.Id

Etapa 58 — Solucionar problemas de conectividade de rede

Contexto: Após a configuração do UDR na Etapa 57, o time de operações reportou que a VM ncarga-vm-wms01 não consegue mais alcançar o storage account ncargatms001. O engenheiro precisa diagnosticar a causa usando o Network Watcher.

Tarefas:

[PowerShell] Confirme que o Network Watcher está ativo na região eastus usando Get-AzNetworkWatcher. Se não estiver, habilite-o com New-AzNetworkWatcher.

[Portal] Teste o fluxo de tráfego da VM ncarga-vm-wms01 para o IP do storage account ncargatms001 na porta 443 em: Network Watcher → IP flow verify. Identifique se o tráfego é permitido ou bloqueado e qual regra causa o bloqueio.

[Portal] Execute um teste de conectividade em: Network Watcher → Connection troubleshoot. Teste da VM ncarga-vm-wms01 para o endpoint ncargatms001.blob.core.windows.net na porta 443. Documente o resultado e a causa raiz identificada.

Critérios de Validação:

dica
  • Network Watcher → IP flow verify: saída mostrando Allow ou Deny com o nome da regra responsável.
  • Network Watcher → Connection troubleshoot: status Reachable ou Unreachable com hop-by-hop detalhado.

Etapa 59 — Criar e configurar NSGs e Application Security Groups

Contexto: O time de segurança aprovou um modelo de microssegmentação usando Application Security Groups (ASGs) para agrupar as VMs por função e aplicar regras de NSG com base nesses grupos, sem depender de IPs específicos.

Tarefas:

[PowerShell] Crie dois Application Security Groups no resource group ncarga-rg-network usando New-AzApplicationSecurityGroup:

  • ncarga-asg-wms para as VMs do sistema WMS
  • ncarga-asg-tms para as VMs do sistema TMS

[PowerShell] Associe a NIC da VM ncarga-vm-wms01 ao ASG ncarga-asg-wms e as NICs de ncarga-vm-tms01 e ncarga-vm-tms02 ao ASG ncarga-asg-tms usando Get-AzNetworkInterface e Set-AzNetworkInterface.

[PowerShell] Crie o NSG ncarga-nsg-compute e adicione uma regra permitindo tráfego da porta 8080 do ASG ncarga-asg-tms para o ASG ncarga-asg-wms usando Add-AzNetworkSecurityRuleConfig.

Critérios de Validação:

# Deve retornar ncarga-asg-wms e ncarga-asg-tms:
Get-AzApplicationSecurityGroup -ResourceGroupName "ncarga-rg-network" |
Select-Object Name, Location

# Deve retornar regra com Access = Allow, porta 8080:
(Get-AzNetworkSecurityGroup -ResourceGroupName "ncarga-rg-network" -Name "ncarga-nsg-compute").SecurityRules |
Select-Object Name, SourceApplicationSecurityGroups, DestinationApplicationSecurityGroups, DestinationPortRange, Access

Etapa 60 — Avaliar regras de segurança efetivas em NSGs

Contexto: Antes de liberar as VMs do TMS para produção, o time de segurança exige uma revisão das regras de segurança efetivas aplicadas a cada NIC, incluindo regras herdadas de NSGs de subnet e de NIC.

Tarefas:

[Portal] Visualize as regras efetivas de ncarga-vm-tms01 em: Virtual machines → ncarga-vm-tms01 → Networking → Network settings → Effective security rules. Documente as regras de entrada e saída, incluindo a origem (NSG de subnet vs NSG de NIC).

[PowerShell] Obtenha as regras efetivas para a NIC da VM ncarga-vm-tms01 usando Get-AzEffectiveNetworkSecurityGroup. Filtre as regras que bloqueiam tráfego de entrada.

[PowerShell] Gere um relatório comparando as regras efetivas de ncarga-vm-wms01 e ncarga-vm-tms01 com colunas Name, Protocol, SourcePortRange, DestinationPortRange, Access, Priority e Direction. Exporte para ~/ncarga/nsg-effective-rules.csv.

Critérios de Validação:

# Deve retornar regras de bloqueio com prioridade e portas:
Get-AzEffectiveNetworkSecurityGroup -NetworkInterfaceName <nic-tms01> -ResourceGroupName "ncarga-rg-vms" |
Select-Object -ExpandProperty EffectiveSecurityRules |
Where-Object { $_.Access -eq "Deny" -and $_.Direction -eq "Inbound" } |
Select-Object Name, Priority, DestinationPortRange

Etapa 61 — Implementar Azure Bastion

Contexto: As VMs do Projeto Âncora não possuem IP público. Para acesso administrativo seguro sem expor portas RDP ou SSH, o time de TI implantará o Azure Bastion na subnet AzureBastionSubnet já criada na Etapa 54.

Custo

Azure Bastion Standard gera ~USD 0,19/h. Delete o recurso após uso durante o laboratório.

Tarefas:

[PowerShell] Crie o IP público ncarga-pip-bastion no resource group ncarga-rg-network, região brazilsouth, SKU Standard, alocação Static usando New-AzPublicIpAddress.

[PowerShell] Crie o Azure Bastion ncarga-bastion associado à subnet AzureBastionSubnet da rede ncarga-vnet-services com o IP público ncarga-pip-bastion, SKU Standard, usando New-AzBastion.

[Portal] Confirme que a opção de conexão via Bastion está disponível em: Virtual machines → ncarga-vm-wms01 → Connect → Bastion. Não é necessário efetuar login.

Critérios de Validação:

# Deve retornar ProvisioningState = Succeeded, Sku = Standard:
Get-AzBastion -ResourceGroupName "ncarga-rg-network" -Name "ncarga-bastion" |
Select-Object Name, ProvisioningState, @{N='Sku';E={$_.Sku.Name}}

Etapa 62 — Configurar service endpoints para PaaS

Contexto: Para que as VMs na subnet snet-compute possam acessar o storage account ncargatms001 de forma segura sem expor o tráfego à internet, o time de rede configurará Service Endpoints de Storage na subnet.

Tarefas:

[PowerShell] Adicione o Service Endpoint Microsoft.Storage à subnet snet-compute da rede ncarga-vnet-compute usando Set-AzVirtualNetworkSubnetConfig com o parâmetro -ServiceEndpoint.

[PowerShell] Adicione uma regra de VNet ao firewall do storage account ncargatms001 permitindo tráfego da subnet snet-compute usando Add-AzStorageAccountNetworkRule -VirtualNetworkResourceId.

[PowerShell] Confirme que a regra de VNet foi adicionada com Get-AzStorageAccountNetworkRuleSet.

Critérios de Validação:

# Deve retornar linha com snet-compute e Action = Allow:
(Get-AzStorageAccountNetworkRuleSet -ResourceGroupName "ncarga-rg-storage" -AccountName "ncargatms001").VirtualNetworkRules |
Select-Object VirtualNetworkResourceId, Action

# Deve retornar Service = Microsoft.Storage:
(Get-AzVirtualNetworkSubnetConfig -Name "snet-compute" -VirtualNetwork (Get-AzVirtualNetwork -Name "ncarga-vnet-compute" -ResourceGroupName "ncarga-rg-network")).ServiceEndpoints |
Select-Object Service

Etapa 63 — Configurar private endpoints para PaaS

Contexto: O storage account ncargataudit001 contém logs de auditoria sensíveis. O time de segurança exige que o acesso seja feito exclusivamente via rede privada, usando Private Endpoint para eliminar qualquer caminho público.

Tarefas:

[PowerShell] Crie o Private Endpoint ncarga-pe-audit-storage no resource group ncarga-rg-network, região brazilsouth, conectado ao storage account ncargataudit001 com sub-resource blob. Use New-AzPrivateEndpoint apontando para a subnet snet-storage da ncarga-vnet-services.

[PowerShell] Crie a Private DNS Zone privatelink.blob.core.windows.net no resource group ncarga-rg-network e vincule-a à rede ncarga-vnet-services usando New-AzPrivateDnsZone e New-AzPrivateDnsVirtualNetworkLink.

[PowerShell] Crie o DNS Zone Group para o Private Endpoint ncarga-pe-audit-storage usando New-AzPrivateDnsZoneGroup.

Critérios de Validação:

# Deve retornar ProvisioningState = Succeeded:
Get-AzPrivateEndpoint -ResourceGroupName "ncarga-rg-network" -Name "ncarga-pe-audit-storage" |
Select-Object Name, ProvisioningState

# Deve retornar a zona criada:
Get-AzPrivateDnsZone -ResourceGroupName "ncarga-rg-network" -Name "privatelink.blob.core.windows.net" |
Select-Object Name

Etapa 64 — Configurar Azure DNS

Contexto: O portal de clientes precisa ser acessível via domínio personalizado (portal.novacarga.com.br) em vez da URL padrão do App Service. O Azure DNS será usado para gerenciar os registros DNS do domínio da empresa.

Tarefas:

[PowerShell] Crie a DNS Zone pública novacarga.com.br no resource group ncarga-rg-network usando New-AzDnsZone. Obtenha os nameservers atribuídos.

[PowerShell] Crie um registro CNAME na DNS Zone:

ParâmetroValor
Nomeportal
TTL3600
Destinoncarga-webapp-portal.azurewebsites.net

Use New-AzDnsRecordSet com tipo CNAME.

[PowerShell] Crie um registro TXT para verificação de domínio com nome asuid.portal. Obtenha o valor do customDomainVerificationId com:

(Get-AzWebApp -Name ncarga-webapp-portal -ResourceGroupName ncarga-rg-compute).CustomDomainVerificationId

Critérios de Validação:

# Deve retornar ao menos 2 registros: portal (CNAME) e asuid.portal (TXT):
Get-AzDnsRecordSet -ZoneName "novacarga.com.br" -ResourceGroupName "ncarga-rg-network" |
Select-Object Name, RecordType, Ttl

# Deve retornar 4 nameservers Azure:
Get-AzDnsZone -Name "novacarga.com.br" -ResourceGroupName "ncarga-rg-network" |
Select-Object Name, NameServers

Etapa 65 — Configurar um load balancer interno

Contexto: As VMs ncarga-vm-tms01 e ncarga-vm-tms02 precisam de distribuição de carga para a API do TMS. Um Load Balancer interno será configurado para distribuir requisições da porta 8080 entre as duas VMs sem exposição pública.

Tarefas:

[PowerShell] Crie o Load Balancer interno ncarga-lb-tms no resource group ncarga-rg-network, região eastus, SKU Standard, com IP privado estático 10.10.1.100 na subnet snet-compute.

[PowerShell] Configure o Load Balancer com:

  • Frontend IP: 10.10.1.100 na subnet snet-compute
  • Backend pool: ncarga-lb-tms-backend incluindo as NICs de ncarga-vm-tms01 e ncarga-vm-tms02
  • Health probe: TCP na porta 8080, intervalo de 15 segundos
  • Load balancing rule: porta 8080 front para 8080 backend, protocolo TCP

[PowerShell] Confirme que o backend pool contém as duas VMs com Get-AzLoadBalancerBackendAddressPoolConfig.

Critérios de Validação:

# Deve retornar Sku = Standard, ProvisioningState = Succeeded:
Get-AzLoadBalancer -ResourceGroupName "ncarga-rg-network" -Name "ncarga-lb-tms" |
Select-Object Name, @{N='Sku';E={$_.Sku.Name}}, ProvisioningState

# Deve retornar os dois IPs privados das VMs TMS:
(Get-AzLoadBalancerBackendAddressPoolConfig -LoadBalancer (Get-AzLoadBalancer -Name "ncarga-lb-tms" -ResourceGroupName "ncarga-rg-network") -Name "ncarga-lb-tms-backend").BackendAddresses |
Select-Object IpAddress

Etapa 66 — Solucionar problemas de balanceamento de carga

Contexto: Após configurar o Load Balancer na Etapa 65, o time de operações reportou que o health probe não está marcando as VMs como saudáveis. O engenheiro precisa diagnosticar e resolver o problema.

Tarefas:

[Portal] Adicione a métrica Health Probe Status com agregação Average em: Load balancers → ncarga-lb-tms → Metrics. Identifique se as VMs estão sendo marcadas como 0 (unhealthy) ou 1 (healthy).

[Portal] Revise o diagrama de conectividade em: Load balancers → ncarga-lb-tms → Insights. Identifique o componente causando a falha no health probe.

[PowerShell] Adicione uma regra de entrada ao NSG da subnet snet-compute permitindo tráfego TCP na porta 8080 da tag de serviço AzureLoadBalancer:

# Adicione a regra ao NSG que protege a subnet snet-compute:
# Source: AzureLoadBalancer | Destination port: 8080 | Action: Allow

Critérios de Validação:

# Deve retornar regra com SourceAddressPrefix = AzureLoadBalancer, Access = Allow, porta 8080:
Get-AzNetworkSecurityGroup -ResourceGroupName "ncarga-rg-network" -Name "ncarga-nsg-compute" |
Select-Object -ExpandProperty SecurityRules |
Where-Object { $_.DestinationPortRange -eq "8080" -and $_.Access -eq "Allow" } |
Select-Object Name, Priority, SourceAddressPrefix, Access

Domínio 7 — Monitoramento

Etapa 67 — Interpretar métricas no Azure Monitor

Contexto: Com toda a infraestrutura do Projeto Âncora provisionada, o time de operações precisa de visibilidade sobre a performance dos recursos críticos.

Tarefas:

[Portal] Crie um gráfico em: Monitor → Metrics. Selecione o recurso ncarga-vm-wms01 e adicione as métricas:

MétricaAgregação
Percentage CPUAverage
Available Memory BytesAverage
Disk Read Operations/SecSum

Configure o intervalo de tempo como Last 24 hours e granularidade de 5 minutes.

[Portal] Adicione o storage account ncargatms001 ao mesmo gráfico com a métrica Transactions e agregação Sum.

[Portal] Salve o gráfico como visualização fixada em um novo dashboard chamado ncarga-dashboard-ops.

Critérios de Validação:

dica
  • Monitor → Metrics: gráfico com ao menos 3 métricas da VM ncarga-vm-wms01 exibidas sem erros.
  • Dashboard ncarga-dashboard-ops visível em Dashboard → Shared dashboards.

Etapa 68 — Configurar log settings no Azure Monitor

Contexto: A conformidade com a LGPD exige que logs de acesso e operações de todos os recursos críticos sejam armazenados de forma centralizada e auditável. Um Log Analytics Workspace será o repositório central de logs.

Tarefas:

[PowerShell] Crie o Log Analytics Workspace ncarga-law-prod no resource group ncarga-rg-compute, região eastus, com retenção de 90 dias usando New-AzOperationalInsightsWorkspace.

[PowerShell] Configure o Diagnostic Settings do storage account ncargatms001 para enviar logs de categoria StorageRead, StorageWrite e StorageDelete (sub-resource blobServices) ao workspace ncarga-law-prod usando Set-AzDiagnosticSetting.

[PowerShell] Configure o Diagnostic Settings da VM ncarga-vm-wms01 para enviar métricas e logs ao workspace ncarga-law-prod.

Critérios de Validação:

# Deve retornar Sku = PerGB2018, RetentionInDays = 90:
Get-AzOperationalInsightsWorkspace -ResourceGroupName "ncarga-rg-compute" -Name "ncarga-law-prod" |
Select-Object Name, Sku, RetentionInDays

# Deve retornar ao menos uma configuração de diagnóstico:
Get-AzDiagnosticSetting -ResourceId (Get-AzStorageAccount -Name "ncargatms001" -ResourceGroupName "ncarga-rg-storage").Id |
Select-Object Name

Etapa 69 — Consultar e analisar logs no Azure Monitor

Contexto: Após a coleta de logs configurada na Etapa 68, o time de segurança precisa de relatórios sobre acessos ao storage ncargatms001 e sobre o status das VMs.

Tarefas:

[Portal] Execute a consulta KQL abaixo em: Log Analytics workspaces → ncarga-law-prod → Logs. Modifique o filtro para as últimas 24 horas e anote a contagem de operações por categoria:

StorageBlobLogs
| where TimeGenerated > ago(24h)
| summarize Count = count() by OperationName, StatusCode
| order by Count desc

[Portal] Execute uma segunda consulta listando as últimas 10 operações de escrita no storage (OperationName contendo "Write"), exibindo TimeGenerated, CallerIpAddress, AuthenticationType e StatusCode.

[Portal] Salve a primeira consulta com o nome ncarga-query-storage-ops na categoria NovaCarga.

Critérios de Validação:

dica
  • Log Analytics → ncarga-law-prod → Logs → Queries → NovaCarga: query ncarga-query-storage-ops listada e executável.
  • Resultado da query 1: tabela com colunas OperationName, StatusCode, Count. Pode retornar zero resultados se o storage não recebeu tráfego — isso é aceitável, desde que a query execute sem erros de sintaxe KQL.

Etapa 70 — Configurar regras de alerta, action groups e alert processing rules

Contexto: O time de operações precisa ser notificado proativamente quando a CPU da VM ncarga-vm-wms01 exceder 85% por mais de 5 minutos, e quando o storage account ncargatms001 retornar erros HTTP 5xx.

Tarefas:

[PowerShell] Crie o Action Group ncarga-ag-ops no resource group ncarga-rg-compute com uma ação de email para ana.ferreira@<tenant>.onmicrosoft.com usando New-AzActionGroup.

[PowerShell] Crie a regra de alerta de métrica para a VM ncarga-vm-wms01:

ParâmetroValor
Nomencarga-alert-cpu-wms01
MétricaPercentage CPU
OperadorGreaterThan
Threshold85
Janela de avaliação5 minutos
Action Groupncarga-ag-ops

Use New-AzMetricAlertRuleV2.

[Portal] Crie uma Alert Processing Rule para suprimir todos os alertas da subscription durante os fins de semana em: Monitor → Alerts → Alert processing rules → Create.

Critérios de Validação:

# Deve retornar Enabled = True, Threshold = 85:
Get-AzMetricAlertRuleV2 -ResourceGroupName "ncarga-rg-compute" -Name "ncarga-alert-cpu-wms01" |
Select-Object Name, Enabled, @{N='Threshold';E={$_.Criteria.AllOf[0].Threshold}}

# Deve retornar Enabled = True:
Get-AzActionGroup -ResourceGroupName "ncarga-rg-compute" -Name "ncarga-ag-ops" |
Select-Object GroupShortName, Enabled

Etapa 71 — Configurar e interpretar monitoramento com Azure Monitor Insights

Contexto: O time de operações precisa de dashboards operacionais para VMs e redes. O Azure Monitor Insights fornece visualizações pré-construídas para os principais recursos do Projeto Âncora.

Tarefas:

[Portal] Habilite o VM Insights para ncarga-vm-wms01 em: Monitor → Virtual Machines. Instale o agente do Azure Monitor (AMA) se solicitado e aponte para o workspace ncarga-law-prod.

[Portal] Após habilitar o VM Insights, navegue até a aba Performance e identifique os três processos que consomem mais CPU na VM ncarga-vm-wms01.

[Portal] Selecione a VNet ncarga-vnet-compute em: Monitor → Networks → Network Insights. Revise a aba Topology e confirme que subnets, NSGs e peerings estão representados corretamente.

Critérios de Validação:

dica
  • Monitor → Virtual Machines: ncarga-vm-wms01 listada com status de monitoramento = Monitored. Aba Performance disponível com gráficos de CPU, Memory, Disk e Network.
  • Monitor → Networks → Network Insights: ncarga-vnet-compute e ncarga-vnet-services exibidas com topologia. Peering entre as duas VNets visível no diagrama.

Etapa 72 — Usar Azure Network Watcher e Connection Monitor

Contexto: O time de rede precisa de monitoramento contínuo da conectividade entre as VMs do WMS e TMS e o storage account ncargatms001. O Connection Monitor fornecerá alertas se a conectividade entre esses endpoints falhar.

Tarefas:

[Portal] Crie o monitor de conexão ncarga-cm-wms-storage em: Network Watcher → Connection monitor

  • Source: VM ncarga-vm-wms01
  • Destination: endpoint ncargatms001.blob.core.windows.net, porta 443
  • Frequência de teste: 60 segundos
  • Workspace: ncarga-law-prod

[Portal] Adicione um segundo test group ao mesmo Connection Monitor monitorando ncarga-vm-tms01ncarga-vm-wms01 na porta 8080.

[Portal] Aguarde pelo menos um ciclo de teste (1 minuto) e revise os resultados em Connection monitor → Tests. Confirme status (Pass/Fail) e latência média de cada test group.

Critérios de Validação:

dica
  • Network Watcher → Connection monitor → ncarga-cm-wms-storage → Test groups: ao menos dois test groups com status (Pass ou Fail) e valores de latência.
  • Monitor → Logs (ncarga-law-prod): query NWConnectionMonitorTestResult | where TimeGenerated > ago(1h) retorna registros após o primeiro ciclo de coleta.

Domínio 8 — Backup e Recuperação de Desastres

Etapa 73 — Criar um Recovery Services Vault

Contexto: O plano de recuperação de desastres do Projeto Âncora exige que as VMs e o compartilhamento de arquivos do Azure Files tenham backup automático. O Recovery Services Vault será o cofre centralizado para todas as políticas de backup.

Tarefas:

[PowerShell] Crie o Recovery Services Vault ncarga-rsv-prod no resource group ncarga-rg-compute, região eastus, com redundância GeoRedundant usando New-AzRecoveryServicesVault.

[PowerShell] Configure o tipo de armazenamento do vault com Set-AzRecoveryServicesBackupProperty -BackupStorageRedundancy GeoRedundant.

[PowerShell] Defina o contexto do vault para as operações subsequentes com Set-AzRecoveryServicesVaultContext.

Critérios de Validação:

# Deve retornar ProvisioningState = Succeeded, Location = eastus:
Get-AzRecoveryServicesVault -Name "ncarga-rsv-prod" -ResourceGroupName "ncarga-rg-compute" |
Select-Object Name, Location, ProvisioningState

# Deve retornar GeoRedundant:
(Get-AzRecoveryServicesBackupProperty -Vault (Get-AzRecoveryServicesVault -Name "ncarga-rsv-prod" -ResourceGroupName "ncarga-rg-compute")).BackupStorageRedundancy

Etapa 74 — Criar um Azure Backup Vault

Contexto: Além do Recovery Services Vault, o Projeto Âncora requer um Azure Backup Vault para proteger os managed disks e blobs usando as novas políticas de backup nativas do serviço.

Tarefas:

[CLI] Crie o Azure Backup Vault ncarga-bkpvault-prod no resource group ncarga-rg-compute, região eastus, com redundância GeoRedundant e imutabilidade em modo Unlocked usando az dataprotection backup-vault create.

[Portal] Confirme o tipo de armazenamento e status de imutabilidade em: Backup vaults → ncarga-bkpvault-prod → Properties.

[Portal] Confirme em: Backup vaults → ncarga-bkpvault-prod → Backup policies que o vault foi criado sem políticas configuradas.

Critérios de Validação:

# Deve retornar provisioningState = Succeeded:
az dataprotection backup-vault show --vault-name ncarga-bkpvault-prod \
--resource-group ncarga-rg-compute \
--query "{name:name, storageSettings:properties.storageSettings, provisioningState:properties.provisioningState}"

Etapa 75 — Criar e configurar uma política de backup

Contexto: O SLA de recuperação define: backup diário das VMs com retenção de 30 dias, backup semanal com retenção de 12 semanas e backup mensal com retenção de 12 meses.

Tarefas:

[PowerShell] Obtenha a política padrão de VM do vault ncarga-rsv-prod usando Get-AzRecoveryServicesBackupProtectionPolicy -WorkloadType AzureVM. Use-a como base para criar uma política customizada.

[PowerShell] Crie a política ncarga-bkp-policy-vm no vault ncarga-rsv-prod com:

  • Backup diário às 02:00 UTC
  • Retenção diária: 30 dias
  • Retenção semanal: 12 semanas (toda segunda-feira)
  • Retenção mensal: 12 meses (primeiro dia do mês)

Use New-AzRecoveryServicesBackupProtectionPolicy.

[PowerShell] Confirme a criação com Get-AzRecoveryServicesBackupProtectionPolicy -Name ncarga-bkp-policy-vm.

Critérios de Validação:

$policy = Get-AzRecoveryServicesBackupProtectionPolicy -Name "ncarga-bkp-policy-vm"

# Deve retornar WorkloadType = AzureVM com ScheduleRunTimes contendo 02:00 UTC:
$policy | Select-Object Name, WorkloadType, @{N='ScheduleRunTimes';E={$_.SchedulePolicy.ScheduleRunTimes}}

# Deve retornar 30:
$policy.RetentionPolicy.DailySchedule.DurationCountInDays

Etapa 76 — Realizar operações de backup e restore com Azure Backup

Contexto: Com a política configurada, o time de TI precisa habilitar a proteção da VM ncarga-vm-wms01 e executar o primeiro backup sob demanda para validar o processo antes do backup automático noturno.

Tarefas:

[PowerShell] Habilite a proteção de backup para a VM ncarga-vm-wms01 usando a política ncarga-bkp-policy-vm no vault ncarga-rsv-prod com Enable-AzRecoveryServicesBackupProtection.

[PowerShell] Acione um backup sob demanda usando Backup-AzRecoveryServicesBackupItem. Capture o JobId retornado e monitore o progresso com Get-AzRecoveryServicesBackupJob -JobId <id>.

[Portal] Após a conclusão, confirme em: Recovery Services vaults → ncarga-rsv-prod → Backup items → Azure Virtual Machine. A VM ncarga-vm-wms01 deve aparecer com status Backup succeeded e ao menos um ponto de restauração disponível.

Critérios de Validação:

# Deve retornar Status = Completed, Operation = Backup:
Get-AzRecoveryServicesBackupJob -JobId <job-id-capturado> |
Select-Object JobId, Status, Operation, Duration

# Deve retornar LastBackupStatus = Completed:
Get-AzRecoveryServicesBackupItem -BackupManagementType AzureVM -WorkloadType AzureVM |
Where-Object { $_.Name -like "*wms01*" } |
Select-Object Name, LastBackupStatus, LastBackupTime

Etapa 77 — Configurar Azure Site Recovery para recursos Azure

Contexto: O plano de continuidade de negócios define que a VM ncarga-vm-tms01 deve ter replicação ativa para a região Brazil South como região secundária. O Azure Site Recovery gerenciará a replicação contínua para garantir o RTO de 4 horas.

Tarefas:

[Portal] Configure a replicação em: Virtual machines → ncarga-vm-tms01 → Disaster recovery

ParâmetroValor
Região alvoBrazil South
Subscription alvomesma subscription
Resource group alvoncarga-rg-vms-dr (criado automaticamente)
Vault de replicaçãoncarga-rsv-prod
Storage account cachecriar novo (Standard_LRS)

[Portal] Monitore o progresso em: Recovery Services vaults → ncarga-rsv-prod → Replicated items.

[Portal] Após a sincronização inicial, confirme em: Recovery Services vaults → ncarga-rsv-prod → Replicated items → ncarga-vm-tms01 que o status é Protected e Replication health é Healthy.

Critérios de Validação:

dica

Recovery Services vaults → ncarga-rsv-prod → Replicated items: ncarga-vm-tms01 listada com:

  • Replication health: Healthy
  • Status: Protected
  • Target region: Brazil South (brazilsouth)

Etapa 78 — Realizar failover para região secundária com Site Recovery

Contexto: O time de continuidade de negócios agendou um drill de disaster recovery trimestral. Um test failover da VM ncarga-vm-tms01 para a região brazilsouth será executado em uma rede isolada para validar o processo sem afetar a produção.

Tarefas:

[Portal] Execute o test failover em: Recovery Services vaults → ncarga-rsv-prod → Replicated items → ncarga-vm-tms01 → Test Failover

  • Recovery point: Latest processed
  • Rede Azure alvo: Create new ou selecione uma rede de teste em brazilsouth

[Portal] Aguarde a conclusão e confirme que a VM de teste ncarga-vm-tms01-test foi criada na região brazilsouth no resource group de DR.

[Portal] Após validar a VM de teste, execute o cleanup em: Replicated items → ncarga-vm-tms01 → Cleanup test failover. Confirme que os recursos de teste foram removidos e o status retornou a Protected.

Critérios de Validação:

dica
  • Durante o failover: Status = Test failover completed no blade de jobs.
  • Após cleanup: Status retorna a Protected, Replication health = Healthy.
  • Resource groups → ncarga-rg-vms-dr: VM ncarga-vm-tms01-test presente durante o drill e removida após o cleanup.

Etapa 79 — Configurar e interpretar relatórios e alertas de backup

Contexto: O gerente de TI exige um relatório semanal sobre o status de todos os backups do Projeto Âncora. Esta etapa configura os relatórios de backup e cria alertas para backups com falha.

Tarefas:

[Portal] Configure os relatórios de backup em: Recovery Services vaults → ncarga-rsv-prod → Backup reports. Aponte para o workspace ncarga-law-prod clicando em Configure Diagnostic Settings.

[Portal] Revise os alertas de backup ativos em: Backup center → Alerts. Confirme que o vault ncarga-rsv-prod está sendo monitorado.

[Portal] Em: Backup center → Reporting, selecione o vault ncarga-rsv-prod e o workspace ncarga-law-prod. Revise as abas Summary, Backup Items e Jobs. Confirme que o backup de ncarga-vm-wms01 aparece nos relatórios.

Critérios de Validação:

# Deve retornar registros de jobs de backup (pode levar até 24h para aparecer):
Invoke-AzOperationalInsightsQuery -WorkspaceId (Get-AzOperationalInsightsWorkspace -Name "ncarga-law-prod" -ResourceGroupName "ncarga-rg-compute").CustomerId `
-Query "AddonAzureBackupJobs | take 5" |
Select-Object -ExpandProperty Results
# Se vazio: confirme que o Diagnostic Setting do vault está configurado para ncarga-law-prod
dica
  • Backup center → Reporting: ncarga-vm-wms01 visível na aba Backup Items com status Backup succeeded.

Validação Final do Ambiente

Ao concluir todas as 79 etapas, o ambiente do Projeto Âncora deve estar composto pelos seguintes recursos ativos e integrados:

CategoriaRecursosResource Group
Identidade3 usuários, 2 grupos, 1 convidado, SSPRMicrosoft Entra ID
Governança2 policies, 2 locks, budget, management groupncarga-rg-financeiro / ncarga-rg-network
Storagencargatest001, ncargatms001, ncargatfiles001, ncargataudit001ncarga-rg-storage
Computencarga-vm-wms01 (D4s_v3), ncarga-vm-tms01, ncarga-vm-tms02, ncarga-vmss-trackerncarga-rg-vms
Contêineresncargatregistry001, ncarga-aci-rastreamento, ncarga-ca-rastreamentoncarga-rg-compute
App Servicencarga-webapp-portal (P1v3, slot staging)ncarga-rg-compute
Redencarga-vnet-compute, ncarga-vnet-services, NSGs, Bastion, LB, DNS, UDR, Private Endpointsncarga-rg-network
Monitoramentoncarga-law-prod, alertas, Connection Monitor, VM Insightsncarga-rg-compute
Backup e DRncarga-rsv-prod, ncarga-bkpvault-prod, Site Recovery (Brazil South)ncarga-rg-compute

Consulta final de validação:

# Deve retornar ao menos 35 recursos distintos:
Get-AzResource | Where-Object { $_.ResourceGroupName -like "ncarga-*" } | Measure-Object

Laboratório AZ-104 — NovaCarga Logística S.A. | Prefixo: ncarga | Modo: PowerShell | 79 etapas | 8 domínios