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

Terraform:同一目录下不同S3桶如何配置差异化生命周期过期变量

问题描述

我有两个S3桶A和B,需要配置生命周期策略,但过期天数不同。二者在同一目录的根模块下,共享同一个variables.tf文件。

A桶和B桶的生命周期策略代码分别放在不同文件中,现有代码如下:

A桶生命周期代码

resource "aws_s3_bucket_lifecycle_configuration" "A_log" {
  bucket = aws_s3_bucket.A.bucket
  rule {
    id     = "expire current version after ${var.s3_expiration_days}, noncurrent version after ${var.s3_noncurrent_version_expiration_days} days"
    status = "Enabled"
    expiration {
      days = var.s3_expiration_days
    }
    noncurrent_version_expiration {
      noncurrent_days = var.s3_noncurrent_version_expiration_days
    }
  }
}

B桶生命周期代码

resource "aws_s3_bucket_lifecycle_configuration" "B_log" {
  bucket = aws_s3_bucket.B.bucket 
  rule {
    id     = "expire current version after ${var.s3_expiration_days}, noncurrent version after ${var.s3_noncurrent_version_expiration_days} days"
    status = "Enabled"
    expiration {
      days = var.s3_expiration_days
    }
    noncurrent_version_expiration {
      noncurrent_days = var.s3_noncurrent_version_expiration_days
    }
  }
}

当前variables.tf内容

variable "s3_expiration_days" {
  type        = number
  description = "S3 bucket objects expiration days"
  default     = 30
}

variable "s3_noncurrent_version_expiration_days" {
  type        = number
  description = "S3 bucket noncurrent version objects expiration days"
  default     = 3
}

需求:

  • A桶:当前版本30天过期,非当前版本3天过期
  • B桶:当前版本0天过期,非当前版本90天过期
  • 不能为任何一个桶硬编码值
解决方案

这里提供两种不用硬编码的实现方式,都能在共享variables.tf的前提下满足不同桶的配置需求:

方案一:使用对象类型变量统一管理桶配置

修改variables.tf,定义一个包含两个桶生命周期配置的对象变量,把每个桶的过期参数都封装进去:

variable "s3_bucket_lifecycle_configs" {
  type = object({
    a = object({
      expiration_days                = number
      noncurrent_expiration_days     = number
    })
    b = object({
      expiration_days                = number
      noncurrent_expiration_days     = number
    })
  })
  description = "Lifecycle configuration for S3 buckets A and B"
  default = {
    a = {
      expiration_days          = 30
      noncurrent_expiration_days = 3
    }
    b = {
      expiration_days          = 0
      noncurrent_expiration_days = 90
    }
  }
}

然后分别修改A、B桶的生命周期代码,引用对应对象的参数:

A桶代码修改后

resource "aws_s3_bucket_lifecycle_configuration" "A_log" {
  bucket = aws_s3_bucket.A.bucket
  rule {
    id     = "expire current version after ${var.s3_bucket_lifecycle_configs.a.expiration_days}, noncurrent version after ${var.s3_bucket_lifecycle_configs.a.noncurrent_expiration_days} days"
    status = "Enabled"
    expiration {
      days = var.s3_bucket_lifecycle_configs.a.expiration_days
    }
    noncurrent_version_expiration {
      noncurrent_days = var.s3_bucket_lifecycle_configs.a.noncurrent_expiration_days
    }
  }
}

B桶代码修改后

resource "aws_s3_bucket_lifecycle_configuration" "B_log" {
  bucket = aws_s3_bucket.B.bucket 
  rule {
    id     = "expire current version after ${var.s3_bucket_lifecycle_configs.b.expiration_days}, noncurrent version after ${var.s3_bucket_lifecycle_configs.b.noncurrent_expiration_days} days"
    status = "Enabled"
    expiration {
      days = var.s3_bucket_lifecycle_configs.b.expiration_days
    }
    noncurrent_version_expiration {
      noncurrent_days = var.s3_bucket_lifecycle_configs.b.noncurrent_expiration_days
    }
  }
}

这种方式的好处是把所有桶的生命周期配置集中在一个变量里,便于统一管理和修改。

方案二:为每个桶单独定义变量

如果觉得对象变量太复杂,也可以直接为A、B桶分别定义专属的过期天数变量,在variables.tf里添加:

# A桶专属变量
variable "s3_a_expiration_days" {
  type        = number
  description = "Expiration days for current version objects in S3 bucket A"
  default     = 30
}

variable "s3_a_noncurrent_expiration_days" {
  type        = number
  description = "Expiration days for noncurrent version objects in S3 bucket A"
  default     = 3
}

# B桶专属变量
variable "s3_b_expiration_days" {
  type        = number
  description = "Expiration days for current version objects in S3 bucket B"
  default     = 0
}

variable "s3_b_noncurrent_expiration_days" {
  type        = number
  description = "Expiration days for noncurrent version objects in S3 bucket B"
  default     = 90
}

然后修改A、B桶的代码,引用各自的变量:

A桶代码修改后

resource "aws_s3_bucket_lifecycle_configuration" "A_log" {
  bucket = aws_s3_bucket.A.bucket
  rule {
    id     = "expire current version after ${var.s3_a_expiration_days}, noncurrent version after ${var.s3_a_noncurrent_expiration_days} days"
    status = "Enabled"
    expiration {
      days = var.s3_a_expiration_days
    }
    noncurrent_version_expiration {
      noncurrent_days = var.s3_a_noncurrent_expiration_days
    }
  }
}

B桶代码修改后

resource "aws_s3_bucket_lifecycle_configuration" "B_log" {
  bucket = aws_s3_bucket.B.bucket 
  rule {
    id     = "expire current version after ${var.s3_b_expiration_days}, noncurrent version after ${var.s3_b_noncurrent_expiration_days} days"
    status = "Enabled"
    expiration {
      days = var.s3_b_expiration_days
    }
    noncurrent_version_expiration {
      noncurrent_days = var.s3_b_noncurrent_expiration_days
    }
  }
}

这种方式更直观,每个变量对应一个桶的参数,适合桶数量不多的场景。

内容的提问来源于stack exchange,提问作者Jatin Mehrotra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:40:28