Fix Terraform Error - Azure Storage Account Name Already Taken
Fix 'storage account name already taken' errors in Terraform for Azure. Handle globally unique naming with random suffixes and check name availability.
DevOps
Fix Key Vault access policy conflicts in Terraform for Azure. Handle duplicate policies, RBAC vs access policy models, and soft-delete recovery issues.
A Key Vault access policy for that object_id already exists, or you're mixing inline access_policy blocks with separate azurerm_key_vault_access_policy resources. Pick one approach and stick with it. Also check if the vault was soft-deleted — Key Vault names are reserved after deletion.
Error: creating Access Policy for Key Vault:
Access policy already exists for object ID "xxxx-xxxx"# ❌ CONFLICT — inline + separate resource for same principal
resource "azurerm_key_vault" "main" {
access_policy {
object_id = data.azurerm_client_config.current.object_id
key_permissions = ["Get", "List"]
}
}
resource "azurerm_key_vault_access_policy" "app" {
key_vault_id = azurerm_key_vault.main.id
object_id = data.azurerm_client_config.current.object_id # Same object_id!
key_permissions = ["Get", "List", "Create"]
}Azure Key Vault has soft delete enabled by default (mandatory since February 2025). Deleted vaults retain their name for 90 days.
Someone added an access policy via Azure Portal.
resource "azurerm_key_vault" "main" {
name = "${var.project}-kv"
location = azurerm_resource_group.main.location
resource_group_name = azurerm_resource_group.main.name
sku_name = "standard"
tenant_id = data.azurerm_client_config.current.tenant_id
# NO inline access_policy blocks
}
resource "azurerm_key_vault_access_policy" "terraform" {
key_vault_id = azurerm_key_vault.main.id
tenant_id = data.azurerm_client_config.current.tenant_id
object_id = data.azurerm_client_config.current.object_id
key_permissions = ["Get", "List", "Create", "Delete"]
secret_permissions = ["Get", "List", "Set", "Delete"]
}
resource "azurerm_key_vault_access_policy" "app" {
key_vault_id = azurerm_key_vault.main.id
tenant_id = data.azurerm_client_config.current.tenant_id
object_id = azurerm_user_assigned_identity.app.principal_id
secret_permissions = ["Get", "List"]
}resource "azurerm_key_vault" "main" {
name = "${var.project}-kv"
location = azurerm_resource_group.main.location
resource_group_name = azurerm_resource_group.main.name
sku_name = "standard"
tenant_id = data.azurerm_client_config.current.tenant_id
enable_rbac_authorization = true # Use RBAC instead of access policies
}
resource "azurerm_role_assignment" "kv_admin" {
scope = azurerm_key_vault.main.id
role_definition_name = "Key Vault Secrets Officer"
principal_id = data.azurerm_client_config.current.object_id
}# List soft-deleted vaults
az keyvault list-deleted
# Recover it
az keyvault recover --name my-kv
# Or purge it to reuse the name
az keyvault purge --name my-kvNever mix inline access_policy blocks with separate azurerm_key_vault_access_policy resources. Use separate resources for modularity, or switch to RBAC (enable_rbac_authorization = true) for cleaner permission management. Check for soft-deleted vaults if creation fails.
Fix 'storage account name already taken' errors in Terraform for Azure. Handle globally unique naming with random suffixes and check name availability.
Fix Azure App Service Plan SKU not available errors in Terraform. Check region availability, find valid SKUs, and configure the right pricing tier.
Fix Docker provider connection refused errors in Terraform. Covers Docker daemon socket permissions, TLS configuration, and remote host setup.
Fix terraform CloudWatch Log Group ResourceAlreadyExistsException. Import orphaned log groups, prevent Lambda auto-creation