1---2name: bicep3description: Azure Bicep IaC patterns, parameterization, security, and modular design4---56## Bicep Code Review Rules78### Security (Critical)9- **Input Validation**: Always escape or validate user-provided strings using regex validation or built-in Bicep functions before using them in resource names, tags, and outputs. Outputs must never directly include untrusted input10- **Comment Hygiene**: Never use HTML comments (`<!-- -->`) or expose template variables (e.g., `{{ }}`) in outputs, as these can enable injection or phishing attacks11- Never hardcode secrets, connection strings, or keys12- Use Key Vault references for secrets13- Apply least privilege to managed identities14- Enable diagnostic settings for auditing15- Use private endpoints where available16- Enforce encryption at rest for all supported resources17- Validate Azure Policy compliance for resources18- Check regulatory standards compliance (HIPAA, PCI-DSS, etc.)1920### Parameters (Essential)21- Use parameters for values that vary between deployments22- Mark sensitive parameters with `@secure()` decorator23- Provide `@description()` for all parameters24- Use `@allowed()` for constrained values25- Set sensible `@minLength()`, `@maxLength()`, `@minValue()`, `@maxValue()`26- Provide default values where appropriate to reduce required inputs2728### Parameters (Advanced)29- Validate complex parameter types with parameter constraints, assertions, or custom validation logic30- Document parameter purpose and expected values31- Consider using parameter files for environment-specific configurations3233### Resource Naming (Essential)34- Use consistent naming convention35- Include environment, region, workload in names36- Use `uniqueString()` for globally unique names37- Follow Azure naming rules and restrictions3839### Resource Tagging (Essential)40- Tag all resources with standard tags (owner, environment, cost center)41- Use consistent tag naming conventions4243### Resource Tagging (Advanced)44- Include tags for governance (compliance, data classification)45- Define required tags in policy and enforce them46- Reference Azure naming documentation for governance tags and enforcement via policies4748### Modules49- Break down large templates into modules50- One module per logical resource group51- Use outputs to pass values between modules52- Store shared modules in a registry5354### Best Practices55- Use `existing` keyword to reference existing resources56- Use `dependsOn` only when implicit dependencies aren't enough57- Prefer symbolic names over `resourceId()` functions58- Use loops (`for`) instead of copy-paste for similar resources59- Include template metadata block with author, version, and docs60- Use meaningful error messages with `assert()` for validation6162### API Version Management63- Avoid deprecated or preview resource API versions unless justified64- Document reasons for using preview features6566### Outputs67- Output only values needed by other templates/scripts68- Mark sensitive outputs with `@secure()` (Bicep handles this)69- Include resource IDs for downstream references7071### Example Patterns72```bicep73@description('Environment name')74@allowed(['dev', 'staging', 'prod'])75param environment string7677@description('SQL admin password')78@secure()79param sqlAdminPassword string8081metadata description = 'Azure Storage Account with Key Vault integration'82metadata author = 'Infrastructure Team'83metadata version = '1.0.0'8485var baseName = 'myapp-${environment}-${uniqueString(resourceGroup().id)}'86var commonTags = {87 environment: environment88 owner: 'infrastructure-team'89 costCenter: 'IT-001'90}9192resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = {93 name: '${baseName}sa'94 location: resourceGroup().location95 tags: commonTags96 sku: { name: 'Standard_LRS' }97 kind: 'StorageV2'98 properties: {99 minimumTlsVersion: 'TLS1_2'100 supportsHttpsTrafficOnly: true101 }102}103```