如何以模块化形式在 Terraform 中使用 s3 lifeycle 规则,即在单独的 JSON 中引用?

How do I use s3 lifeycle rules in Terraform in a modular form, i.e. referenced in separate JSON?

目前,我在我的 s3 资源下指定 lifecycle_rule:

resource "aws_s3_bucket" "bucket-name" {
  bucket = "bucket-name"
  
  lifecycle_rule {
    id = "Expiration Rule"
    enabled = true
    prefix = "reports/"

  expiration {
    days = 30
    }
  }
}

...但我想必须有一种方法可以使它更加模块化,比如将生命周期规则放入一个单独的 JSON 中,这样我就可以为多个 s3 存储桶引用它并减少编辑的需要每个资源。我知道一般如何做到这一点,并且已经使用其他资源做到了这一点,如下所示:

resource "aws_iam_policy" "devops-admin-write" {
  name = "devops-admin-s3"
  description = "Devops-Admin group s3 policy."
  policy = file("iam_policies/devops-admin-write.json")
}

...不同之处在于“lifecycle_rule”是一个参数而不是一个属性——我不清楚如何让它起作用。 Google-傅也没有给出明确的答案

您可以使用通过通用 local 变量执行的 dynamic blocks。 所以你只需要更改局部变量,更改将反映在所有使用该变量的地方。

为了使其更易于维护,我建议构建一个模块并重用该模块或使用现有模块。

但是 locals + dynamic 实现可能如下所示:

locals {
  lifecycle_rules = [
    {
      id      = "Expiration Rule"
      enabled = true
      prefix  = "reports/"
      expiration = {
        days = 30
      }
    }
  ]
}

resource "aws_s3_bucket" "bucket-name" {
  bucket = "bucket-name"
  
  dynamic "lifecycle_rule" {
    for_each = local.lifecycle_rules
   
    content {
      id      = lifecycle_rule.each.id
      enabled = lifecycle_rule.each.enabled
      prefix  = lifecycle_rule.each.prefix

      expiration {
        days = lifecycle_rule.each.expiration.days
      }
    }
  }
}

这不会检查错误,当然也不完整 - 它只是实现了您的示例。

our terraform s3-bucket module: find code here

中查看更完整的通用示例