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
相关产品推荐
相关产品推荐

