使用Terraform配置Azure VM时azurerm_disk_encryption_set创建失败求助
解决Azure Disk Encryption Set创建失败的问题
遇到DiskEncryptionSetCreationFailed报错,通常是Key Vault配置、权限设置或Terraform资源依赖这几个环节出了问题,以下是具体排查和解决步骤:
一、检查Key Vault核心配置
- 区域与订阅一致性:Disk Encryption Set和关联的Key Vault必须在同一Azure区域,且属于同一个订阅,跨区域或跨订阅会直接导致创建失败。
- 软删除与清除保护:Azure要求Key Vault必须开启软删除(保留天数≥7)和清除保护功能,否则无法绑定到Disk Encryption Set。
- 密钥与SKU合规性:Key Vault的SKU需为Standard或Premium(Basic SKU不支持磁盘加密);用于加密的密钥必须是RSA类型,密钥大小≥2048位,且密钥状态为启用、未过期。
二、配置Key Vault访问权限
Disk Encryption Set需要具备访问Key Vault密钥的权限,操作步骤如下:
- 若使用系统分配身份创建Disk Encryption Set,先在Azure门户找到该资源的“标识”页,复制其对象ID。
- 进入关联的Key Vault,在“访问策略”页添加新策略:
- 选择“密钥管理操作”中的
获取、包装密钥、解包密钥权限 - 将复制的Disk Encryption Set对象ID添加为主体
- 保存并应用访问策略
- 选择“密钥管理操作”中的
三、修正Terraform配置问题
- 资源依赖处理:确保Key Vault和密钥资源完全创建后,再创建Disk Encryption Set。可以通过
depends_on显式声明依赖,或通过资源引用(如key_vault_key_id = azurerm_key_vault_key.example.id)实现隐式依赖。 - 身份配置正确:若使用系统分配身份,需在
azurerm_disk_encryption_set的identity块中设置type = "SystemAssigned";若使用用户分配身份,需正确指定identity_ids。
正确的Terraform配置示例
# 创建资源组 resource "azurerm_resource_group" "example" { name = "example-resources" location = "East US" } # 创建符合要求的Key Vault resource "azurerm_key_vault" "example" { name = "example-keyvault" location = azurerm_resource_group.example.location resource_group_name = azurerm_resource_group.example.name tenant_id = data.azurerm_client_config.current.tenant_id soft_delete_retention_days = 7 purge_protection_enabled = true sku_name = "standard" } # 创建加密密钥 resource "azurerm_key_vault_key" "example" { name = "example-encryption-key" key_vault_id = azurerm_key_vault.example.id key_type = "RSA" key_size = 2048 key_opts = [ "decrypt", "encrypt", "unwrapKey", "wrapKey", ] } # 创建Disk Encryption Set resource "azurerm_disk_encryption_set" "example" { name = "example-disk-encryption-set" location = azurerm_resource_group.example.location resource_group_name = azurerm_resource_group.example.name identity { type = "SystemAssigned" } key_vault_key_id = azurerm_key_vault_key.example.id # 显式声明依赖,确保Key Vault和密钥先完成创建 depends_on = [azurerm_key_vault.example, azurerm_key_vault_key.example] } # 获取当前客户端配置(用于Tenant ID) data "azurerm_client_config" "current" {}
内容的提问来源于stack exchange,提问作者bhavi
相关产品推荐
相关产品推荐

