351 lines
8.2 KiB
Markdown
351 lines
8.2 KiB
Markdown
|
|
# Cloud for Sovereignty Landing Zone Deployment Guide
|
||
|
|
|
||
|
|
**Last Updated**: 2025-01-27
|
||
|
|
**Management Group**: SOVEREIGN-ORDER-OF-HOSPITALLERS
|
||
|
|
**Framework**: Azure Well-Architected Framework + Cloud for Sovereignty
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
|
||
|
|
This guide walks through deploying a complete Cloud for Sovereignty landing zone across all non-US commercial Azure regions, using the Azure Well-Architected Framework principles.
|
||
|
|
|
||
|
|
## Prerequisites
|
||
|
|
|
||
|
|
1. **Azure Subscription** with access to management group
|
||
|
|
2. **Management Group**: `SOVEREIGN-ORDER-OF-HOSPITALLERS` must exist
|
||
|
|
3. **Azure CLI** installed and authenticated
|
||
|
|
4. **Terraform** >= 1.5.0 installed
|
||
|
|
5. **Environment Variables** configured in `.env` file
|
||
|
|
|
||
|
|
## Architecture Overview
|
||
|
|
|
||
|
|
### Management Group Hierarchy
|
||
|
|
|
||
|
|
```
|
||
|
|
SOVEREIGN-ORDER-OF-HOSPITALLERS (Root)
|
||
|
|
├── Landing Zones
|
||
|
|
│ ├── Platform
|
||
|
|
│ ├── Sandbox
|
||
|
|
│ └── Workloads
|
||
|
|
├── Management
|
||
|
|
│ ├── Identity
|
||
|
|
│ ├── Security
|
||
|
|
│ └── Monitoring
|
||
|
|
└── Connectivity
|
||
|
|
├── Hub Networks
|
||
|
|
└── Spoke Networks
|
||
|
|
```
|
||
|
|
|
||
|
|
### Regional Architecture
|
||
|
|
|
||
|
|
Each region (7 total) includes:
|
||
|
|
- Hub Virtual Network (gateway, firewall, management)
|
||
|
|
- Spoke Virtual Network (application, database, storage)
|
||
|
|
- Azure Firewall
|
||
|
|
- Key Vault with private endpoint
|
||
|
|
- Log Analytics Workspace
|
||
|
|
- Storage Account with private endpoint
|
||
|
|
|
||
|
|
## Deployment Steps
|
||
|
|
|
||
|
|
### Step 1: Validate Environment
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Load and validate environment variables
|
||
|
|
source infra/scripts/azure-load-env.sh
|
||
|
|
|
||
|
|
# Verify management group exists
|
||
|
|
az account management-group show --name SOVEREIGN-ORDER-OF-HOSPITALLERS
|
||
|
|
```
|
||
|
|
|
||
|
|
### Step 2: Deploy Management Group Hierarchy
|
||
|
|
|
||
|
|
```bash
|
||
|
|
cd infra/terraform/management-groups
|
||
|
|
|
||
|
|
# Initialize Terraform
|
||
|
|
terraform init
|
||
|
|
|
||
|
|
# Review plan
|
||
|
|
terraform plan -var="management_group_id=SOVEREIGN-ORDER-OF-HOSPITALLERS"
|
||
|
|
|
||
|
|
# Apply
|
||
|
|
terraform apply
|
||
|
|
```
|
||
|
|
|
||
|
|
This creates:
|
||
|
|
- Landing Zones management group
|
||
|
|
- Platform, Sandbox, and Workloads groups
|
||
|
|
- Management group (Identity, Security, Monitoring)
|
||
|
|
- Connectivity group (Hub Networks, Spoke Networks)
|
||
|
|
|
||
|
|
### Step 3: Deploy Sovereignty Policies
|
||
|
|
|
||
|
|
```bash
|
||
|
|
cd ../policies
|
||
|
|
|
||
|
|
# Initialize Terraform
|
||
|
|
terraform init
|
||
|
|
|
||
|
|
# Review plan
|
||
|
|
terraform plan -var="management_group_id=SOVEREIGN-ORDER-OF-HOSPITALLERS"
|
||
|
|
|
||
|
|
# Apply
|
||
|
|
terraform apply
|
||
|
|
```
|
||
|
|
|
||
|
|
This creates and assigns:
|
||
|
|
- Allowed locations policy (non-US regions only)
|
||
|
|
- Deny US regions policy
|
||
|
|
- Require data residency tags
|
||
|
|
- Require encryption at rest
|
||
|
|
- Require resource tags
|
||
|
|
- Policy initiative for sovereignty compliance
|
||
|
|
|
||
|
|
### Step 4: Deploy Multi-Region Landing Zones
|
||
|
|
|
||
|
|
```bash
|
||
|
|
cd ../multi-region
|
||
|
|
|
||
|
|
# Initialize Terraform
|
||
|
|
terraform init
|
||
|
|
|
||
|
|
# Review plan (all regions)
|
||
|
|
terraform plan \
|
||
|
|
-var="environment=dev" \
|
||
|
|
-var="management_group_id=SOVEREIGN-ORDER-OF-HOSPITALLERS" \
|
||
|
|
-var="deploy_all_regions=true"
|
||
|
|
|
||
|
|
# Apply
|
||
|
|
terraform apply
|
||
|
|
```
|
||
|
|
|
||
|
|
This deploys landing zones to:
|
||
|
|
1. West Europe (Netherlands) - Primary
|
||
|
|
2. North Europe (Ireland) - Secondary
|
||
|
|
3. UK South (London)
|
||
|
|
4. Switzerland North (Zurich)
|
||
|
|
5. Norway East (Oslo)
|
||
|
|
6. France Central (Paris)
|
||
|
|
7. Germany West Central (Frankfurt)
|
||
|
|
|
||
|
|
### Step 5: Verify Deployment
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Check resource groups
|
||
|
|
az group list --query "[?contains(name, 'az-')]" --output table
|
||
|
|
|
||
|
|
# Check Key Vaults
|
||
|
|
az keyvault list --query "[?contains(name, 'az-')]" --output table
|
||
|
|
|
||
|
|
# Check Virtual Networks
|
||
|
|
az network vnet list --query "[?contains(name, 'az-')]" --output table
|
||
|
|
|
||
|
|
# Check policy compliance
|
||
|
|
az policy state list --filter "complianceState eq 'NonCompliant'" --query "[].{Resource:resourceId, Policy:policyDefinitionName}" --output table
|
||
|
|
```
|
||
|
|
|
||
|
|
## Automated Deployment
|
||
|
|
|
||
|
|
Use the deployment script for automated deployment:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
./infra/scripts/deploy-sovereignty-landing-zone.sh
|
||
|
|
```
|
||
|
|
|
||
|
|
This script:
|
||
|
|
1. Loads environment variables
|
||
|
|
2. Deploys management group hierarchy
|
||
|
|
3. Deploys sovereignty policies
|
||
|
|
4. Deploys multi-region landing zones
|
||
|
|
5. Provides deployment summary
|
||
|
|
|
||
|
|
## Regional Resources
|
||
|
|
|
||
|
|
### Per Region Resources
|
||
|
|
|
||
|
|
Each region deployment creates:
|
||
|
|
|
||
|
|
- **1 Resource Group**
|
||
|
|
- **2 Virtual Networks** (Hub + Spoke)
|
||
|
|
- **6 Subnets** (3 hub + 3 spoke)
|
||
|
|
- **1 Azure Firewall**
|
||
|
|
- **1 Public IP** (for firewall)
|
||
|
|
- **2 VNet Peerings** (hub ↔ spoke)
|
||
|
|
- **1 Key Vault** (with private endpoint)
|
||
|
|
- **1 Log Analytics Workspace**
|
||
|
|
- **1 Storage Account** (with private endpoint)
|
||
|
|
- **2 Private Endpoints** (Key Vault + Storage)
|
||
|
|
|
||
|
|
### Total Resources (7 regions)
|
||
|
|
|
||
|
|
- **7 Resource Groups**
|
||
|
|
- **14 Virtual Networks**
|
||
|
|
- **42 Subnets**
|
||
|
|
- **7 Azure Firewalls**
|
||
|
|
- **7 Public IPs**
|
||
|
|
- **14 VNet Peerings**
|
||
|
|
- **7 Key Vaults**
|
||
|
|
- **7 Log Analytics Workspaces**
|
||
|
|
- **7 Storage Accounts**
|
||
|
|
- **14 Private Endpoints**
|
||
|
|
|
||
|
|
## Network Architecture
|
||
|
|
|
||
|
|
### Hub Network
|
||
|
|
|
||
|
|
- **Gateway Subnet**: VPN/ExpressRoute connectivity
|
||
|
|
- **Azure Firewall Subnet**: Centralized security
|
||
|
|
- **Management Subnet**: Management and monitoring
|
||
|
|
|
||
|
|
### Spoke Network
|
||
|
|
|
||
|
|
- **Application Subnet**: Application workloads
|
||
|
|
- **Database Subnet**: Database servers (with delegation)
|
||
|
|
- **Storage Subnet**: Storage private endpoints
|
||
|
|
|
||
|
|
### Connectivity
|
||
|
|
|
||
|
|
- Hub and Spoke connected via VNet peering
|
||
|
|
- Hub allows gateway transit
|
||
|
|
- Spoke uses remote gateways
|
||
|
|
|
||
|
|
## Security Features
|
||
|
|
|
||
|
|
### Data Sovereignty
|
||
|
|
|
||
|
|
- **Private Endpoints**: All PaaS services use private endpoints
|
||
|
|
- **Customer-Managed Keys**: Encryption with Key Vault
|
||
|
|
- **Data Residency Tags**: All resources tagged with region
|
||
|
|
- **Network Isolation**: Hub-and-spoke architecture
|
||
|
|
|
||
|
|
### Compliance
|
||
|
|
|
||
|
|
- **Azure Policies**: Enforce location and encryption
|
||
|
|
- **Tagging**: Required tags for governance
|
||
|
|
- **Audit Logging**: Log Analytics for all regions
|
||
|
|
- **Access Control**: RBAC and management groups
|
||
|
|
|
||
|
|
## Cost Estimation
|
||
|
|
|
||
|
|
### Per Region (Monthly)
|
||
|
|
|
||
|
|
- Virtual Networks: ~$50
|
||
|
|
- Azure Firewall: ~$1,200 (Standard SKU)
|
||
|
|
- Key Vault: ~$15 (Premium SKU)
|
||
|
|
- Log Analytics: ~$200-500 (data ingestion)
|
||
|
|
- Storage Account: ~$50-200 (depending on usage)
|
||
|
|
- Private Endpoints: ~$35 (2 endpoints)
|
||
|
|
|
||
|
|
**Total per region**: ~$1,550-2,000/month
|
||
|
|
|
||
|
|
### Multi-Region (7 regions)
|
||
|
|
|
||
|
|
- **Development**: ~$10,850-14,000/month
|
||
|
|
- **Production**: ~$15,000-20,000/month (with higher usage)
|
||
|
|
|
||
|
|
## Monitoring
|
||
|
|
|
||
|
|
### Regional Monitoring
|
||
|
|
|
||
|
|
Each region has:
|
||
|
|
- Log Analytics Workspace
|
||
|
|
- Application Insights ready
|
||
|
|
- Azure Monitor metrics
|
||
|
|
- Network Watcher
|
||
|
|
|
||
|
|
### Centralized Monitoring
|
||
|
|
|
||
|
|
- Cross-region querying
|
||
|
|
- Centralized dashboards
|
||
|
|
- Alert rules per region
|
||
|
|
- Cost tracking per region
|
||
|
|
|
||
|
|
## Disaster Recovery
|
||
|
|
|
||
|
|
### Regional Failover
|
||
|
|
|
||
|
|
- Primary: West Europe
|
||
|
|
- Secondary: North Europe
|
||
|
|
- Backup regions: Other 5 regions
|
||
|
|
|
||
|
|
### RTO/RPO
|
||
|
|
|
||
|
|
- **RTO**: 4 hours
|
||
|
|
- **RPO**: 1 hour
|
||
|
|
|
||
|
|
### DR Strategy
|
||
|
|
|
||
|
|
1. Automated failover for critical services
|
||
|
|
2. Manual failover for non-critical services
|
||
|
|
3. Geo-replication for storage
|
||
|
|
4. Cross-region backup
|
||
|
|
|
||
|
|
## Next Steps
|
||
|
|
|
||
|
|
After deployment:
|
||
|
|
|
||
|
|
1. **Configure Application Workloads**
|
||
|
|
- Deploy AKS clusters per region
|
||
|
|
- Configure application networking
|
||
|
|
- Set up application monitoring
|
||
|
|
|
||
|
|
2. **Set Up Monitoring**
|
||
|
|
- Create Grafana dashboards
|
||
|
|
- Configure alert rules
|
||
|
|
- Set up cost alerts
|
||
|
|
|
||
|
|
3. **Implement Security**
|
||
|
|
- Configure Azure Firewall rules
|
||
|
|
- Set up Microsoft Defender for Cloud
|
||
|
|
- Configure Azure Sentinel
|
||
|
|
|
||
|
|
4. **Optimize Costs**
|
||
|
|
- Review resource usage
|
||
|
|
- Implement reserved instances
|
||
|
|
- Optimize storage tiers
|
||
|
|
|
||
|
|
## Troubleshooting
|
||
|
|
|
||
|
|
### Management Group Not Found
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Verify management group exists
|
||
|
|
az account management-group show --name SOVEREIGN-ORDER-OF-HOSPITALLERS
|
||
|
|
|
||
|
|
# Create if needed (requires appropriate permissions)
|
||
|
|
az account management-group create --name SOVEREIGN-ORDER-OF-HOSPITALLERS
|
||
|
|
```
|
||
|
|
|
||
|
|
### Policy Assignment Fails
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Check policy assignment
|
||
|
|
az policy assignment list --scope "/providers/Microsoft.Management/managementGroups/SOVEREIGN-ORDER-OF-HOSPITALLERS"
|
||
|
|
|
||
|
|
# Verify permissions
|
||
|
|
az role assignment list --assignee <your-user-id>
|
||
|
|
```
|
||
|
|
|
||
|
|
### Region Deployment Fails
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Check resource provider registration
|
||
|
|
az provider list --query "[?namespace=='Microsoft.Network']"
|
||
|
|
az provider register --namespace Microsoft.Network
|
||
|
|
|
||
|
|
# Check quotas
|
||
|
|
az vm list-usage --location westeurope --output table
|
||
|
|
```
|
||
|
|
|
||
|
|
## References
|
||
|
|
|
||
|
|
- [Azure Well-Architected Framework](https://docs.microsoft.com/azure/architecture/framework/)
|
||
|
|
- [Cloud for Sovereignty](https://azure.microsoft.com/solutions/sovereignty/)
|
||
|
|
- [Azure Landing Zones](https://docs.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/)
|
||
|
|
- [Management Groups](https://docs.microsoft.com/azure/governance/management-groups/)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**Last Updated**: 2025-01-27
|
||
|
|
|