Amazon web services 使用Terraform在多个S3存储桶中创建多个文件夹

Amazon web services 使用Terraform在多个S3存储桶中创建多个文件夹,amazon-web-services,terraform,terraform-provider-aws,Amazon Web Services,Terraform,Terraform Provider Aws,我希望创建一个S3 terraform模块,它可以获取要在所有这些存储桶中创建的存储桶名称和文件夹名称列表。 例如,在我的S3模块main.tf中。我有 resource "aws_s3_bucket_object" "folders" { count = var.create_folders ? length(var.s3_folder_names) : 0 bucket = element(aws_s3_bucket.s3bucket

我希望创建一个S3 terraform模块,它可以获取要在所有这些存储桶中创建的存储桶名称和文件夹名称列表。 例如,在我的S3模块main.tf中。我有

resource "aws_s3_bucket_object" "folders" {
    count = var.create_folders ? length(var.s3_folder_names) : 0
    bucket  = element(aws_s3_bucket.s3bucket.*.id, count.index)
    acl    = "private"
    key    = format("%s/",var.s3_folder_names[count.index])
    source = "/dev/null"
}
我正在调用此模块,如下所示:

variable "s3_bucket_name" {
  type = list
  description = "List of S3 bucket names"
default = ["bucket1","bucket-2"]
}
variable "s3_folder_names" {
  type        = list
  description = "The list of S3 folders to be created inside S3 bucket"
  default=["folder1/dev","folder2/qa"]

}
module "s3" {
  source = "../../../gce-nextgen-cloud-terraform-modules/modules/s3"
  create_folders = true
  s3_folder_names = var.s3_folder_names
  environment = var.environment
  s3_bucket_name = var.s3_bucket_name
  force_destroy = true
  bucket_replication_enabled = true
  tags = local.common_tags
  providers = {
    aws.main_region = aws.main_region
    aws.secondary_region = aws.secondary_region
  }
}
我面临这个问题,因为count变量只能在资源块中设置一次。以下是引发问题的场景:

  • 如果
    var.s3\u文件夹名称
    。 然后我将无法访问S3存储桶列表的所有元素,如下所示
  • 因此,由于这个原因,我将无法在所有存储桶中创建这些文件夹。唯一的目标是在所有这些bucket中创建相同的文件夹结构集。
    任何帮助都将不胜感激。提前谢谢

    您可以创建组合数据结构,例如:

    locals {
    
      buckets_and_folders = merge([
        for bucket in var.s3_bucket_name:
          {
            for folder in var.s3_folder_names:
            "${bucket}-${folder}" => {
              bucket = bucket
              folder = folder
            }
          }
      ]...)
    
    }
    
    然后您将使用
    对每个
    迭代此结构:

    resource "aws_s3_bucket_object" "folders" {
    
        for_each = var.create_folders ? local.buckets_and_folders : {}
    
        bucket  = each.value.bucket
        acl    = "private"
        key    = format("%s/", each.value.folder)
        source = "/dev/null"
    }
    

    为什么还要创建文件夹?你不需要,我不明白。我知道它们在S3中不是文件夹,而是对象。但从肉眼看,我们与它们一起工作,并将它们作为文件夹进行管理。因此,我需要使用terraform在每个S3存储桶中创建具有层次结构的子目录@谢谢你的帮助。我确实尝试过你的方法,但我得到的错误如下所示:var.s3_bucket_name是包含1个元素的字符串列表var.s3_folder_name是包含1个元素的字符串列表调用函数“merge”失败:参数必须是映射或对象,获得“tuple”.@HemantKumar你忘了合并结束时的
    ?这是我的错误,因为我经常混淆terraform,但现在我明白了,因为这些“…”是用于解压参数的,对吗?@HemantKumar是的,它会将列表解压为合并参数。如果答案是有帮助的,一旦它起作用,我们将不胜感激。谢谢你的帮助。它很有魅力。
    resource "aws_s3_bucket_object" "folders" {
    
        for_each = var.create_folders ? local.buckets_and_folders : {}
    
        bucket  = each.value.bucket
        acl    = "private"
        key    = format("%s/", each.value.folder)
        source = "/dev/null"
    }