使用 Terraform 在多个 S3 存储桶中创建多个文件夹
Create multiple folders within multiple S3 buckets with Terraform
我想创建一个 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
}
}
我遇到了问题,因为计数变量只能在资源块中设置一次。这是引起问题的场景:
- 如果
var.s3_folder_names < aws_s3_bucket.s3bucket.*.id
。
然后我将无法访问 S3 bucket list 的所有元素,如下所示
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"
}
因此,我将无法在所有存储桶中创建这些文件夹。唯一的目标是在所有这些存储桶中创建相同的文件夹结构集。
任何帮助将不胜感激。提前致谢!
您可以创建一个组合数据结构,例如:
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
:
迭代此结构
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 模块中 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
}
}
我遇到了问题,因为计数变量只能在资源块中设置一次。这是引起问题的场景:
- 如果
var.s3_folder_names < aws_s3_bucket.s3bucket.*.id
。 然后我将无法访问 S3 bucket list 的所有元素,如下所示
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"
}
因此,我将无法在所有存储桶中创建这些文件夹。唯一的目标是在所有这些存储桶中创建相同的文件夹结构集。 任何帮助将不胜感激。提前致谢!
您可以创建一个组合数据结构,例如:
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
:
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"
}