首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Terraform在多个S3桶中创建多个文件夹

使用Terraform在多个S3桶中创建多个文件夹
EN

Stack Overflow用户
提问于 2021-04-06 19:49:44
回答 1查看 1.6K关注 0票数 2

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

代码语言:javascript
复制
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"
}

我称之为这个模块,如下所示:

代码语言:javascript
复制
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
  }
}

我面临问题,因为计数变量只能在资源块中设置一次。下面是警告问题的场景:

  1. If var.s3_folder_names < aws_s3_bucket.s3bucket.*.id.然后,我将无法访问S3桶列表的所有元素,如下面的

所示

代码语言:javascript
复制
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"
}

因此,由于这一点,我将无法在所有桶中创建这些文件夹。唯一的目标是在所有这些桶中创建相同的文件夹结构集。任何帮助都是非常感谢的。提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-06 22:45:08

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

代码语言:javascript
复制
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
        }
      }
  ]...)

}

然后使用for_each迭代这个结构。

代码语言:javascript
复制
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"
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66975597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档