微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何以模块化形式在Terraform中使用s3 lifeycle规则,即在单独的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-Fu也没有给出明确的答案。

解决方法

您可以将dynamic blocks与一般的local变量一起使用。 因此,您只需要更改局部变量,更改便会在使用此变量的所有位置反映出来。

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

但是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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。