- Add comprehensive naming convention (provider-region-resource-env-purpose) - Implement Terraform locals for centralized naming - Update all Terraform resources to use new naming convention - Create deployment automation framework (18 phase scripts) - Add Azure setup scripts (provider registration, quota checks) - Update deployment scripts config with naming functions - Create complete deployment documentation (guide, steps, quick reference) - Add frontend portal implementations (public and internal) - Add UI component library (18 components) - Enhance Entra VerifiedID integration with file utilities - Add API client package for all services - Create comprehensive documentation (naming, deployment, next steps) Infrastructure: - Resource groups, storage accounts with new naming - Terraform configuration updates - Outputs with naming convention examples Deployment: - Automated deployment scripts for all 15 phases - State management and logging - Error handling and validation Documentation: - Naming convention guide and implementation summary - Complete deployment guide (296 steps) - Next steps and quick start guides - Azure prerequisites and setup completion docs Note: ESLint warnings present - will be addressed in follow-up commit
392 lines
8.3 KiB
Markdown
392 lines
8.3 KiB
Markdown
# Azure Infrastructure - Execution Guide
|
|
|
|
**Last Updated**: 2025-01-27
|
|
**Default Region**: West Europe (westeurope)
|
|
**Policy**: No US Commercial or Government regions
|
|
|
|
---
|
|
|
|
## Prerequisites
|
|
|
|
Before executing Terraform, ensure you have:
|
|
|
|
1. ✅ **Azure CLI installed**
|
|
```bash
|
|
az --version
|
|
```
|
|
|
|
2. ✅ **Logged into Azure**
|
|
```bash
|
|
az login
|
|
az account show
|
|
```
|
|
|
|
3. ✅ **Required permissions**
|
|
- Subscription Contributor or Owner role
|
|
- Ability to create resource groups
|
|
- Ability to register resource providers
|
|
|
|
---
|
|
|
|
## Step-by-Step Execution
|
|
|
|
### Step 1: Run Azure Setup Scripts
|
|
|
|
Execute the setup scripts to prepare your Azure subscription:
|
|
|
|
```bash
|
|
# Navigate to project root
|
|
cd /home/intlc/projects/the_order
|
|
|
|
# Run complete setup (recommended)
|
|
./infra/scripts/azure-setup.sh
|
|
```
|
|
|
|
This will:
|
|
- List all non-US Azure regions
|
|
- Register all 13 required resource providers
|
|
- Check quotas for primary regions
|
|
- Generate reports
|
|
|
|
**Expected Output Files:**
|
|
- `azure-regions.txt` - List of available regions
|
|
- `azure-quotas.txt` - Quota information for primary regions
|
|
|
|
### Step 2: Verify Resource Provider Registration
|
|
|
|
```bash
|
|
# Run provider registration script
|
|
./infra/scripts/azure-register-providers.sh
|
|
```
|
|
|
|
**Expected Output:**
|
|
```
|
|
✓ Microsoft.ContainerService - Registered
|
|
✓ Microsoft.KeyVault - Registered
|
|
✓ Microsoft.Storage - Registered
|
|
...
|
|
✓ All required resource providers are registered!
|
|
```
|
|
|
|
If any providers are not registered, the script will register them automatically.
|
|
|
|
### Step 3: Review Quotas
|
|
|
|
```bash
|
|
# Check quotas for all regions
|
|
./infra/scripts/azure-check-quotas.sh
|
|
```
|
|
|
|
**Review the output file:**
|
|
```bash
|
|
cat azure-quotas-all-regions.txt
|
|
```
|
|
|
|
Ensure you have sufficient quotas for:
|
|
- VM cores (for AKS nodes)
|
|
- Storage accounts
|
|
- Network resources
|
|
|
|
### Step 4: Initialize Terraform
|
|
|
|
```bash
|
|
# Navigate to Terraform directory
|
|
cd infra/terraform
|
|
|
|
# Initialize Terraform (downloads providers)
|
|
terraform init
|
|
```
|
|
|
|
**Expected Output:**
|
|
```
|
|
Initializing the backend...
|
|
Initializing provider plugins...
|
|
- Finding hashicorp/azurerm versions matching "~> 3.0"...
|
|
- Installing hashicorp/azurerm v3.x.x...
|
|
Terraform has been successfully initialized!
|
|
```
|
|
|
|
### Step 5: Create Initial Infrastructure (State Storage)
|
|
|
|
Before using remote state, create the storage account locally:
|
|
|
|
```bash
|
|
# Review the plan
|
|
terraform plan -target=azurerm_resource_group.terraform_state -target=azurerm_storage_account.terraform_state -target=azurerm_storage_container.terraform_state
|
|
|
|
# Apply to create state storage
|
|
terraform apply -target=azurerm_resource_group.terraform_state -target=azurerm_storage_account.terraform_state -target=azurerm_storage_container.terraform_state
|
|
```
|
|
|
|
**Note**: This creates the storage account needed for remote state backend.
|
|
|
|
### Step 6: Configure Remote State Backend
|
|
|
|
After the storage account is created:
|
|
|
|
1. **Get the storage account name:**
|
|
```bash
|
|
terraform output -raw storage_account_name
|
|
# Or check the Terraform state
|
|
terraform show | grep storage_account_name
|
|
```
|
|
|
|
2. **Update `versions.tf`** - Uncomment and configure the backend block:
|
|
```hcl
|
|
backend "azurerm" {
|
|
resource_group_name = "the-order-terraform-state-rg"
|
|
storage_account_name = "<output-from-above>"
|
|
container_name = "terraform-state"
|
|
key = "terraform.tfstate"
|
|
}
|
|
```
|
|
|
|
3. **Re-initialize with backend:**
|
|
```bash
|
|
terraform init -migrate-state
|
|
```
|
|
|
|
### Step 7: Plan Full Infrastructure
|
|
|
|
```bash
|
|
# Review what will be created
|
|
terraform plan
|
|
|
|
# Save plan to file for review
|
|
terraform plan -out=tfplan
|
|
```
|
|
|
|
**Review the plan carefully** to ensure:
|
|
- Correct resource names
|
|
- Correct region (should be `westeurope`)
|
|
- No US regions are being used
|
|
- Appropriate resource sizes
|
|
|
|
### Step 8: Apply Infrastructure
|
|
|
|
```bash
|
|
# Apply the plan
|
|
terraform apply
|
|
|
|
# Or use the saved plan
|
|
terraform apply tfplan
|
|
```
|
|
|
|
**Expected Resources Created:**
|
|
- Resource groups
|
|
- Storage accounts
|
|
- (Additional resources as you add them)
|
|
|
|
### Step 9: Verify Deployment
|
|
|
|
```bash
|
|
# List created resources
|
|
az resource list --resource-group the-order-dev-rg --output table
|
|
|
|
# Check resource group
|
|
az group show --name the-order-dev-rg
|
|
|
|
# Verify region
|
|
az group show --name the-order-dev-rg --query location
|
|
# Should output: "westeurope"
|
|
```
|
|
|
|
---
|
|
|
|
## Environment-Specific Deployment
|
|
|
|
### Development Environment
|
|
|
|
```bash
|
|
# Set environment variable
|
|
export TF_VAR_environment=dev
|
|
|
|
# Or use -var flag
|
|
terraform plan -var="environment=dev"
|
|
terraform apply -var="environment=dev"
|
|
```
|
|
|
|
### Staging Environment
|
|
|
|
```bash
|
|
terraform plan -var="environment=stage"
|
|
terraform apply -var="environment=stage"
|
|
```
|
|
|
|
### Production Environment
|
|
|
|
```bash
|
|
# Production requires extra caution
|
|
terraform plan -var="environment=prod" -detailed-exitcode
|
|
terraform apply -var="environment=prod"
|
|
```
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
|
|
### Error: Resource Provider Not Registered
|
|
|
|
**Symptom:**
|
|
```
|
|
Error: creating Resource Group: resources.ResourcesClient#CreateOrUpdate:
|
|
Failure sending request: StatusCode=400 -- Original Error:
|
|
Code="MissingSubscriptionRegistration"
|
|
```
|
|
|
|
**Solution:**
|
|
```bash
|
|
# Register the provider
|
|
az provider register --namespace Microsoft.Resources --wait
|
|
|
|
# Or run the registration script
|
|
./infra/scripts/azure-register-providers.sh
|
|
```
|
|
|
|
### Error: Quota Exceeded
|
|
|
|
**Symptom:**
|
|
```
|
|
Error: creating Storage Account: storage.AccountsClient#Create:
|
|
Failure sending request: StatusCode=400 -- Original Error:
|
|
Code="SubscriptionQuotaExceeded"
|
|
```
|
|
|
|
**Solution:**
|
|
1. Check quotas: `./infra/scripts/azure-check-quotas.sh`
|
|
2. Request quota increase in Azure Portal
|
|
3. Or use a different region
|
|
|
|
### Error: Invalid Region
|
|
|
|
**Symptom:**
|
|
```
|
|
Error: invalid location "us-east-1"
|
|
```
|
|
|
|
**Solution:**
|
|
- Ensure you're using `westeurope` or another non-US region
|
|
- Check `variables.tf` - default should be `westeurope`
|
|
- Terraform validation should prevent US regions
|
|
|
|
### Error: Storage Account Name Already Exists
|
|
|
|
**Symptom:**
|
|
```
|
|
Error: creating Storage Account: storage.AccountsClient#Create:
|
|
Failure sending request: StatusCode=409 -- Original Error:
|
|
Code="StorageAccountAlreadyTaken"
|
|
```
|
|
|
|
**Solution:**
|
|
- Storage account names must be globally unique
|
|
- Modify the name in `storage.tf` or use a different project name
|
|
|
|
---
|
|
|
|
## Best Practices
|
|
|
|
### 1. Always Review Plans
|
|
|
|
```bash
|
|
# Always review before applying
|
|
terraform plan -out=tfplan
|
|
terraform show tfplan
|
|
```
|
|
|
|
### 2. Use Workspaces for Multiple Environments
|
|
|
|
```bash
|
|
# Create workspace for dev
|
|
terraform workspace new dev
|
|
|
|
# Create workspace for prod
|
|
terraform workspace new prod
|
|
|
|
# Switch between workspaces
|
|
terraform workspace select dev
|
|
```
|
|
|
|
### 3. Version Control
|
|
|
|
- ✅ Commit Terraform files to version control
|
|
- ❌ Never commit `.tfstate` files
|
|
- ✅ Use remote state backend (Azure Storage)
|
|
- ✅ Use `.tfvars` files for environment-specific values (add to `.gitignore`)
|
|
|
|
### 4. State Management
|
|
|
|
- ✅ Use remote state backend
|
|
- ✅ Enable state locking (automatic with Azure Storage)
|
|
- ✅ Enable versioning on storage account
|
|
- ✅ Regular backups of state
|
|
|
|
### 5. Security
|
|
|
|
- ✅ Use Azure Key Vault for secrets
|
|
- ✅ Use Managed Identities where possible
|
|
- ✅ Enable soft delete on Key Vault
|
|
- ✅ Enable versioning on storage accounts
|
|
|
|
---
|
|
|
|
## Next Steps
|
|
|
|
After initial infrastructure is created:
|
|
|
|
1. **Create Azure Key Vault**
|
|
- For secrets management
|
|
- See `key-vault.tf` (to be created)
|
|
|
|
2. **Create AKS Cluster**
|
|
- For Kubernetes deployment
|
|
- See `aks.tf` (to be created)
|
|
|
|
3. **Create PostgreSQL Database**
|
|
- For application database
|
|
- See `database.tf` (to be created)
|
|
|
|
4. **Create Container Registry**
|
|
- For container images
|
|
- See `container-registry.tf` (to be created)
|
|
|
|
5. **Configure Networking**
|
|
- Virtual networks, subnets, NSGs
|
|
- See `network.tf` (to be created)
|
|
|
|
---
|
|
|
|
## Quick Reference Commands
|
|
|
|
```bash
|
|
# Setup
|
|
./infra/scripts/azure-setup.sh
|
|
./infra/scripts/azure-register-providers.sh
|
|
|
|
# Terraform
|
|
cd infra/terraform
|
|
terraform init
|
|
terraform plan
|
|
terraform apply
|
|
terraform destroy
|
|
|
|
# Verification
|
|
az resource list --resource-group the-order-dev-rg
|
|
az group show --name the-order-dev-rg
|
|
terraform output
|
|
```
|
|
|
|
---
|
|
|
|
## Support
|
|
|
|
- **Resource Providers**: See `AZURE_RESOURCE_PROVIDERS.md`
|
|
- **Scripts**: See `infra/scripts/README.md`
|
|
- **Troubleshooting**: See sections above
|
|
- **Azure CLI Docs**: https://docs.microsoft.com/en-us/cli/azure/
|
|
|
|
---
|
|
|
|
**Ready to deploy!** 🚀
|
|
|