Amazon web services 如何使用Terraform管理数百个AWS S3存储桶

Amazon web services 如何使用Terraform管理数百个AWS S3存储桶,amazon-web-services,amazon-s3,terraform,lifecycle,Amazon Web Services,Amazon S3,Terraform,Lifecycle,我希望使用Terraform管理数百个AWS S3 bucket,并希望通过定义bucket名称的可变列表数组以及一些其他S3资源特定参数来创建所有这些bucket,使用for_循环遍历该列表,然后使用该数组的结果来定义bucket配置。我们遇到的问题是生命周期规则。根据bucket需求,我们的bucket有几个不同的生命周期规则,但在1000个bucket中,我们可能有10个不同的生命周期规则。使用aws cli管理bucket生命周期非常简单,这是它自己的特定命令: aws s3api pu

我希望使用Terraform管理数百个AWS S3 bucket,并希望通过定义bucket名称的可变列表数组以及一些其他S3资源特定参数来创建所有这些bucket,使用for_循环遍历该列表,然后使用该数组的结果来定义bucket配置。我们遇到的问题是生命周期规则。根据bucket需求,我们的bucket有几个不同的生命周期规则,但在1000个bucket中,我们可能有10个不同的生命周期规则。使用aws cli管理bucket生命周期非常简单,这是它自己的特定命令:

aws s3api put-bucket-lifecycle-configuration --bucket my-bucket --lifecycle-configuration file://lifecycle_1.json
我们可以从lifecycle_X.json文件的简短列表中选择修改规则

我们遇到的问题是,地形资源“aws_s3_bucket”中的lifecycle属性不是或不能是模板?显然,它是版本11中的一个模板,但由于版本12,它必须是一些代码块。我想做的是这样的:

locals {
  lifecycle_rule_1 = [
    id      = "rule1"
    prefix  = ""
    enabled = true
    expiration = [ 
      {   
        days = 30
    }
  ]
  lifecycle_rule_2 = [
    id      = "rule2"
    prefix  = ""
    enabled = true
    expiration = [ 
      {   
        days = 60
    }
  ]
}

resource "aws_s3_bucket" "bucket" {
  for_each = locals.bucket_definitions
  bucket = "my-bucket"
  acl    = "private"
  lifecycle_rule = [locals.lifecycle_rule_1]
}

这里有没有人提出过类似的问题和解决方案?
谢谢

遗憾的是,这种功能不受支持。GitHub上已经有了未来的请求:

因此,您必须定义“单独”的组件,如文档中所示


另一种方法是使用自定义解决方案来设置生命周期,例如通过AWS CLI或通过AWS SDK使用。

您可以在
本地
中创建映射,如下所示:

locals {
  lifecycle_rules = {
    lifecycle_rule_1 = {
      id      = "rule1"
      prefix  = ""
      enabled = true
      expiration = [ 
        {   
          days = 30
        }
      ]
    }
    lifecycle_rule_2 = {
      id      = "rule2"
      prefix  = ""
      enabled = true
      expiration = [
        {   
          days = 60
        }
      ]
    }
  }
}
然后像这样使用它们:

resource "aws_s3_bucket" "bucket" {
  for_each = local.bucket_definitions
  bucket = each.value.bucket
  acl = each.value.acl
  lifecycle_rule {
    id = local.lifecycle_rules[each.value.lifecycle_rule_name].id
    prefix = local.lifecycle_rules[each.value.lifecycle_rule_name].prefix
    enabled = local.lifecycle_rules[each.value.lifecycle_rule_name].enabled
    expiration = local.lifecycle_rules[each.value.lifecycle_rule_name].expiration
  }
}
基本上,您需要在
local.bucket\u定义.lifecycle\u规则\u名称
中创建完全相同的名称之间的映射,以与上面在
local.lifecycle\u规则
中定义的映射键相匹配
此外,您可能需要在lifecycle_规则映射中有一些默认值,以防您的一些规则使用的属性不完全相同