目前,我在 s3 资源下指定生命周期规则:
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
变量执行。
因此,您只需要更改局部变量,更改就会反射(reflect)在使用该变量的所有地方。
为了使其更易于维护,我建议构建一个模块并重用该模块或使用现有模块。
但是 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
关于json - 如何以模块化形式在 Terraform 中使用 s3 生命周期规则,即在单独的 JSON 中引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64528488/