如何以模块化形式在 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
}
}
}
}
这不会检查错误,当然也不完整 - 它只是实现了您的示例。
中查看更完整的通用示例
目前,我在我的 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
}
}
}
}
这不会检查错误,当然也不完整 - 它只是实现了您的示例。
中查看更完整的通用示例