You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写适配多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 07:07:50