如何编写适配多SKU的Azure Redis Cache Terraform模块
适配多SKU的Azure Redis Cache Terraform模块实现
核心思路
通过可选变量结合条件配置块,让单个模块自动适配Basic/Standard/Premium SKU的差异,既满足非生产环境的轻量配置,也支持生产环境Premium SKU的专属备份配置。
1. 模块变量定义(variables.tf)
将通用配置与Premium专属配置拆分,把专属配置设为可选变量(默认null),同时添加SKU合法性校验:
variable "name" { type = string description = "Name of the Redis Cache instance" } variable "location" { type = string description = "Azure region for the Redis Cache" } variable "resource_group_name" { type = string description = "Name of the existing resource group" } variable "capacity" { type = number description = "Size of the Redis Cache instance (1-6 for Basic/Standard, 1-4 for Premium)" } variable "sku_name" { type = string description = "SKU type: Basic, Standard, Premium" validation { condition = contains(["Basic", "Standard", "Premium"], var.sku_name) error_message = "sku_name must be one of: Basic, Standard, Premium." } } # 通用Redis配置(所有SKU适用) variable "redis_configuration_common" { type = map(any) description = "Base Redis configuration settings for all SKUs" default = {} } # Premium专属配置(可选,默认null) variable "rdb_backup_frequency" { type = number description = "RDB backup frequency in minutes (Premium only)" default = null validation { condition = var.sku_name != "Premium" || var.rdb_backup_frequency != null error_message = "rdb_backup_frequency is required when using Premium SKU." } } variable "rdb_backup_max_snapshot_count" { type = number description = "Max number of RDB snapshots to retain (Premium only)" default = null validation { condition = var.sku_name != "Premium" || var.rdb_backup_max_snapshot_count != null error_message = "rdb_backup_max_snapshot_count is required when using Premium SKU." } } variable "rdb_storage_connection_string" { type = string description = "Storage account connection string for RDB backups (Premium only)" default = null validation { condition = var.sku_name != "Premium" || var.rdb_storage_connection_string != null error_message = "rdb_storage_connection_string is required when using Premium SKU." } } # 其他通用可选配置 variable "enable_non_ssl_port" { type = bool description = "Whether to enable the non-SSL port" default = false } variable "subnet_id" { type = string description = "Subnet ID for Premium SKU's virtual network integration" default = null }
2. 资源配置实现(main.tf)
使用merge()函数结合条件判断,自动拼接通用配置与Premium专属配置;对Premium独有的资源属性(如subnet_id)也做条件赋值:
resource "azurerm_redis_cache" "this" { name = var.name location = var.location resource_group_name = var.resource_group_name capacity = var.capacity sku_name = var.sku_name # 合并配置:通用配置 + (Premium专属配置,仅当SKU为Premium时生效) redis_configuration = merge( var.redis_configuration_common, var.sku_name == "Premium" ? { rdb_backup_frequency = var.rdb_backup_frequency rdb_backup_max_snapshot_count = var.rdb_backup_max_snapshot_count rdb_storage_connection_string = var.rdb_storage_connection_string } : {} ) # 条件启用Premium专属属性 enable_non_ssl_port = var.enable_non_ssl_port subnet_id = var.sku_name == "Premium" ? var.subnet_id : null }
3. 使用示例
非生产环境(Basic SKU)
无需传入Premium专属变量,仅配置通用项:
module "redis_dev" { source = "./modules/redis-cache" name = "dev-redis-01" location = "eastus" resource_group_name = "rg-dev" capacity = 1 sku_name = "Basic" redis_configuration_common = { maxmemory_reserved = 2 maxmemory_delta = 2 } }
生产环境(Premium SKU)
必须传入所有Premium专属配置,同时保留通用配置:
module "redis_prod" { source = "./modules/redis-cache" name = "prod-redis-01" location = "eastus" resource_group_name = "rg-prod" capacity = 2 sku_name = "Premium" redis_configuration_common = { maxmemory_reserved = 10 maxmemory_delta = 10 } rdb_backup_frequency = 60 rdb_backup_max_snapshot_count = 7 rdb_storage_connection_string = azurerm_storage_account.redis_backup.primary_connection_string subnet_id = azurerm_subnet.redis_subnet.id }
关键优势
- 单个模块覆盖所有SKU类型,避免重复维护多个模块
- 变量校验确保Premium SKU的必填配置不缺失
- 配置逻辑清晰,调用方只需根据环境传入对应变量即可
内容的提问来源于stack exchange,提问作者nmca-inc
相关产品推荐
相关产品推荐

