Como criar e organizar Azure Management Groups com Terraform
Olá pessoal! Blz?
No artigo de hoje gostaria de trazer algo sobre gerenciamento do Microsoft Azure que são os Management Groups. Em ambientes Azure maiores, onde múltiplas subscriptions são utilizadas, a organização e governança podem se tornar um desafio. Os Management Groups surgem como uma solução para estruturar essas subscriptions em uma hierarquia lógica, facilitando a aplicação de políticas e controles de acesso em larga escala.
Eu nunca quis gerenciar Management Group com Terraform, sempre achei que isso deveria ser um recurso que criamos a mão, configuramos com as melhores práticas e deixamos lá! Mas ai vem a preocupação: E se eu perco esse ambiente e preciso recriá-lo, será que mesmo documentado eu conseguiria reproduzi-lo de maneira que ficasse da forma que estava? E em quanto tempo eu levaria para ter isso recuperado.
Neste artigo, você vai aprender como criar e gerenciar Azure Management Groups utilizando Terraform, garantindo automação, consistência e escalabilidade.
O que são Azure Management Groups?
Os Management Groups ficam acima das subscriptions na hierarquia do Azure e funcionam como uma forma de organizar múltiplas assinaturas dentro de uma estrutura única. Com isso, você consegue aplicar configurações e regras de forma centralizada, sem precisar configurar cada subscription individualmente.
Principais benefícios:
- Aplicação de políticas (Azure Policy) de forma centralizada e em larga escala
- Controle de acesso unificado utilizando RBAC
- Organização das subscriptions por ambiente, área ou finalidade
- Padronização da governança em toda a estrutura
Uma estrutura comum pode ser assim:
1
2
3
4
5
6
7
8
9
10
11
📦Root Management Group
┗ 📂Corp
┃ ┣ 📜Production
┃ ┣ 📜Development
┃ ┗ 📜hHmologation
┃ 📂Platform
┃ ┣ 📜Identity
┃ ┣ 📜Connectivity
┃ ┗ 📜Management
┃ 📂SandBox
┃ 📂Decommissioned
As configurações aplicadas em um Management Group são herdadas por todos os seus grupos e subscriptions abaixo. Isso garante consistência sem necessidade de configurações repetidas. Isso inclui políticas, permissões e outras configurações de governança.
Um cenário que usamos muito Management Groups é fornecer acesso de usuário a várias assinaturas. Ao mover várias assinaturas em um grupo de gerenciamento, você pode criar uma Azure role assignment no Management Group. A função herda esse acesso a todas as assinaturas. Uma atribuição no Management Group pode permitir que os usuários tenham acesso a tudo o que precisam, em vez de criar scripts de RBAC (controle de acesso baseado em função) do Azure em diferentes assinaturas.
Fatos importantes sobre os grupos de gerenciamento
Um único diretório pode dar suporte a 10.000 Management Groups.
Uma árvore do Management Group pode dar suporte a até seis níveis de profundidade.
Esse limite não inclui o nível raiz nem o nível da assinatura.
Cada Management Group e assinatura pode dar suporte apenas a um pai.
Cada Management Group pode ter vários elementos filhos.
Todas as assinaturas e todos os Management Groups estão em uma única hierarquia em cada diretório.
Criar Azure Management Groups com Terraform
Além do acesso ao Microsoft Azure, terraform instalado, você precisará de ter permissões para criar Management Groups (normalmente Owner ou Contributor no tenant root).
Em qualquer ambiente Microsoft Azure inicial e já avançado você SEMPRE terá um Management Group root, geralmente chamado de Root Management Group, ele será a estrutura de Management Group mais alta na sua organização, então como ela já existe precisando primeiramente pegar o ID através do terraform:
1
2
3
data "azurerm_management_group" "root" {
display_name = "Tenant Root Group"
}
Com isso já podemos usar esse Parent management group* (Gerenciamento de grupo Pai) para os outros management group que iremos criar. Vamos criar uma parte da estrutura de Management Groups que citamos no exemplo acima:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
resource "azurerm_management_group" "platform" {
display_name = "Platform"
parent_management_group_id = data.azurerm_management_group.root.id
name = "mg-platform"
}
resource "azurerm_management_group" "corp" {
display_name = "Corp"
parent_management_group_id = data.azurerm_management_group.root.id
name = "mg-corp"
}
resource "azurerm_management_group" "sandbox" {
display_name = "Sandbox"
parent_management_group_id = data.azurerm_management_group.root.id
name = "mg-sandbox"
}
resource "azurerm_management_group" "decommissioned" {
display_name = "Decommissioned"
parent_management_group_id = data.azurerm_management_group.root.id
name = "mg-decommissioned"
}
Usamos o valor no campo parent_management_group_id para informar quem é o Management Group Pai do que estamos criando.
Definir um valor no campo Name é opcional se você não especificar o Azure irá gerar um GUID para esse campo.
Nesse momento do código teriamos a seguinte estrutura criada:
1
2
3
4
5
📦Root Management Group
┗ 📂Corp
┃ 📂Platform
┃ 📂SandBox
┃ 📂Decommissioned
Como já falamos os Management Groups possuem Management Groups filhos, ou seja, outros Management Groups abaixo deles na estrutura, para o artigo não ficar muito extenso vamos criar a estrutura do Management Group Platform, mas o código é o mesmo e se aplica as demais estruturas:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
resource "azurerm_management_group" "identity" {
display_name = "Identity"
parent_management_group_id = azurerm_management_group.platform.id
name = "mg-platform-identity"
}
resource "azurerm_management_group" "connectivity" {
display_name = "Connectivity"
parent_management_group_id = azurerm_management_group.platform.id
name = "mg-platform-connectivity"
}
resource "azurerm_management_group" "management" {
display_name = "Management"
parent_management_group_id = azurerm_management_group.platform.id
name = "mg-platform-management"
}
Após a criação da estrutura Platform e seus filhos, já teriamos a seguinte estrutura:
1
2
3
4
5
6
7
8
📦Root Management Group
┗ 📂Corp
┃ 📂Platform
┃ ┣ 📜Identity
┃ ┣ 📜Connectivity
┃ ┗ 📜Management
┃ 📂SandBox
┃ 📂Decommissioned
Associando subscriptions a Management Groups
Após criar a estrutura de Management Groups, o próximo passo é associar suas subscriptions a esses grupos. Isso permite que elas herdem automaticamente políticas, permissões e regras definidas no nível superior, facilitando a governança e padronização do ambiente. Vou exemplificar somente uma, mas segue a mesma lógica e código para todas as outras subscriptions:
1
2
3
4
resource "azurerm_management_group_subscription_association" "identity" {
management_group_id = azurerm_management_group.identity.id
subscription_id = "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Aplicando políticas no nível de Management Group
O verdadeiro valor dos Management Groups está na herança de políticas. Ao definir políticas no nível adequado da hierarquia, você garante que todas as subscriptions e recursos abaixo sigam automaticamente essas regras, simplificando a governança e mantendo consistência em todo o ambiente. Vamos usar uma política de exmplo:
1
2
3
4
5
6
7
8
9
10
11
resource "azurerm_management_group_policy_assignment" "allowed_locations_sandbox" {
name = "allowed-locations-sandbox"
management_group_id = azurerm_management_group.sandbox.id
policy_definition_id = "/providers/Microsoft.Authorization/policyDefinitions/e56962a6-4747-49cd-b67b-bf8b01975c4c"
parameters = jsonencode({
listOfAllowedLocations = {
value = ["eastus2", "westus2"]
}
})
}
No exemplo acima estamos restringindo somente as regiões eastus2 e westus2 para todo o Management Group Sandbox
Um outro bom exemplo, já que separamos um Management Group com os ambientes Corporativos é exigir uma Azure Tag Environment para os recursos dessas subscriptions:
1
2
3
4
5
6
7
8
9
10
11
resource "azurerm_management_group_policy_assignment" "require_env_tag" {
name = "require-env-tag-corp"
management_group_id = azurerm_management_group.corp.id
policy_definition_id = "/providers/Microsoft.Authorization/policyDefinitions/96670d01-0a4d-4649-9c89-2d3abc0a5025"
parameters = jsonencode({
tagName = {
value = "Environment"
}
})
}
RBAC no nível de Management Group
Você também pode definir permissões diretamente no nível de Management Group. Dessa forma, os acessos são automaticamente herdados por todas as subscriptions e recursos abaixo, facilitando o controle e evitando configurações repetidas.
1
2
3
4
5
6
# Platform team gets Contributor on the Platform management group
resource "azurerm_role_assignment" "platform_team" {
scope = azurerm_management_group.platform.id
role_definition_name = "Contributor"
principal_id = var.platform_team_group_id
}
1
2
3
4
5
resource "azurerm_role_assignment" "security_reader" {
scope = data.azurerm_management_group.root.id
role_definition_name = "Reader"
principal_id = var.security_team_group_id
}
Time Cloud pode ter acesso direto de Reader em todo o ambiente, estamos aplicando isso diretamente no Root Management Group
Concluindo!
Ao longo deste artigo, vimos como utilizar Management Groups no Azure para organizar subscriptions e aplicar governança de forma eficiente utilizando Terraform. Com essa abordagem, você ganha mais controle, consistência e escalabilidade na gestão do seu ambiente.
Implementar essa estrutura como código é um passo importante para evoluir a maturidade da sua infraestrutura e garantir que boas práticas sejam aplicadas desde a base.
Artigos relacionados
O que são grupos de gerenciamento do Azure?
Terraform Azure Management Group
Compartilhe o artigo com seus amigos clicando nos icones abaixo!!!
