From ac1071f3741d745c1902c2baec092e0f62acc5ba Mon Sep 17 00:00:00 2001 From: bcarranza Date: Mon, 4 Sep 2023 15:34:44 -0600 Subject: [PATCH 1/5] s3 folders structure --- terraform-modules/aws/s3/folders/main.tf | 27 +++++++++++++++++++ terraform-modules/aws/s3/folders/variables.tf | 13 +++++++++ 2 files changed, 40 insertions(+) create mode 100644 terraform-modules/aws/s3/folders/main.tf create mode 100644 terraform-modules/aws/s3/folders/variables.tf diff --git a/terraform-modules/aws/s3/folders/main.tf b/terraform-modules/aws/s3/folders/main.tf new file mode 100644 index 000000000..508e02b23 --- /dev/null +++ b/terraform-modules/aws/s3/folders/main.tf @@ -0,0 +1,27 @@ +resource "aws_s3_bucket" "example" { + bucket = var.bucket_name +} + +# Recursive function to create folders +locals { + recursive_create_folders = flatten([ + for folder in var.folder_structure : + [ + module.create_folder[folder.key].path, + local.create_subfolders(folder.subfolders, folder.key) + ] + ]) +} + +# Function to create subfolders recursively +locals { + create_subfolders = function(subfolders, parent_folder_key) { + return [ + for subfolder in subfolders : + [ + module.create_folder["${parent_folder_key}/${subfolder.key}"].path, + local.create_subfolders(subfolder.subfolders, "${parent_folder_key}/${subfolder.key}") + ] + ] + } +} \ No newline at end of file diff --git a/terraform-modules/aws/s3/folders/variables.tf b/terraform-modules/aws/s3/folders/variables.tf new file mode 100644 index 000000000..b417e28ec --- /dev/null +++ b/terraform-modules/aws/s3/folders/variables.tf @@ -0,0 +1,13 @@ +variable "bucket_name" { + description = "The name of the S3 bucket" +} + +variable "folder_structure" { + description = "The folder structure to create in S3 (list of objects)" + type = list(object({ + key = string + subfolders = list(object({ + key = string + })) + })) +} \ No newline at end of file From 2841bb38753f0dfc87a472454f8704bcc4fd08c4 Mon Sep 17 00:00:00 2001 From: bcarranza Date: Mon, 4 Sep 2023 15:52:11 -0600 Subject: [PATCH 2/5] recursive --- terraform-modules/aws/s3/folders/main.tf | 47 ++++++++++++++++-------- 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/terraform-modules/aws/s3/folders/main.tf b/terraform-modules/aws/s3/folders/main.tf index 508e02b23..57f27af76 100644 --- a/terraform-modules/aws/s3/folders/main.tf +++ b/terraform-modules/aws/s3/folders/main.tf @@ -1,27 +1,44 @@ -resource "aws_s3_bucket" "example" { +data "aws_s3_bucket" "existing_bucket" { bucket = var.bucket_name } # Recursive function to create folders locals { - recursive_create_folders = flatten([ - for folder in var.folder_structure : - [ - module.create_folder[folder.key].path, - local.create_subfolders(folder.subfolders, folder.key) - ] - ]) + recursive_create_folders = flatten(local.create_folders(var.folder_structure)) } -# Function to create subfolders recursively +# Function to create folders recursively locals { - create_subfolders = function(subfolders, parent_folder_key) { + create_folders = function(folders) { return [ - for subfolder in subfolders : - [ - module.create_folder["${parent_folder_key}/${subfolder.key}"].path, - local.create_subfolders(subfolder.subfolders, "${parent_folder_key}/${subfolder.key}") - ] + for folder in folders : + concat( + [ + { + key = folder.key + source = "/dev/null" # Use an empty file as the source + content_type = "application/octet-stream" + }, + ], + local.create_folders(folder.subfolders) + ) ] } +} + +# Create folders using aws_s3_bucket_object +resource "aws_s3_bucket_object" "folder_structure" { + for_each = { + for folder in local.recursive_create_folders : + folder.key => { + key = folder.key + source = folder.source + content_type = folder.content_type + } + } + + bucket = data.aws_s3_bucket.existing_bucket.id + key = each.value.key + source = each.value.source + content_type = each.value.content_type } \ No newline at end of file From 7436f973473afca41bba6401d5b1b402d9a37471 Mon Sep 17 00:00:00 2001 From: bcarranza Date: Mon, 4 Sep 2023 16:34:14 -0600 Subject: [PATCH 3/5] s3 folders --- terraform-modules/aws/s3/folders/README.md | 30 ++++++++++++ terraform-modules/aws/s3/folders/main.tf | 48 ++----------------- terraform-modules/aws/s3/folders/variables.tf | 18 ++++--- 3 files changed, 46 insertions(+), 50 deletions(-) create mode 100644 terraform-modules/aws/s3/folders/README.md diff --git a/terraform-modules/aws/s3/folders/README.md b/terraform-modules/aws/s3/folders/README.md new file mode 100644 index 000000000..0ebec5aca --- /dev/null +++ b/terraform-modules/aws/s3/folders/README.md @@ -0,0 +1,30 @@ +## Requirements + +No requirements. + +## Providers + +| Name | Version | +|------|---------| +| [aws](#provider\_aws) | n/a | + +## Modules + +No modules. + +## Resources + +| Name | Type | +|------|------| +| [aws_s3_object.directory_structure](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_object) | resource | + +## Inputs + +| Name | Description | Type | Default | Required | +|------|-------------|------|---------|:--------:| +| [bucket\_name](#input\_bucket\_name) | The name of the S3 bucket | `any` | n/a | yes | +| [folder\_structure](#input\_folder\_structure) | The folder structure to create in S3.
Example usage:
[
"folder1",
"folder2",
"folder3",
"folder4/subfolder1/subfolder2"
] | `list(string)` | n/a | yes | + +## Outputs + +No outputs. diff --git a/terraform-modules/aws/s3/folders/main.tf b/terraform-modules/aws/s3/folders/main.tf index 57f27af76..3e4c74216 100644 --- a/terraform-modules/aws/s3/folders/main.tf +++ b/terraform-modules/aws/s3/folders/main.tf @@ -1,44 +1,6 @@ -data "aws_s3_bucket" "existing_bucket" { - bucket = var.bucket_name -} - -# Recursive function to create folders -locals { - recursive_create_folders = flatten(local.create_folders(var.folder_structure)) -} - -# Function to create folders recursively -locals { - create_folders = function(folders) { - return [ - for folder in folders : - concat( - [ - { - key = folder.key - source = "/dev/null" # Use an empty file as the source - content_type = "application/octet-stream" - }, - ], - local.create_folders(folder.subfolders) - ) - ] - } -} - -# Create folders using aws_s3_bucket_object -resource "aws_s3_bucket_object" "folder_structure" { - for_each = { - for folder in local.recursive_create_folders : - folder.key => { - key = folder.key - source = folder.source - content_type = folder.content_type - } - } - - bucket = data.aws_s3_bucket.existing_bucket.id - key = each.value.key - source = each.value.source - content_type = each.value.content_type +resource "aws_s3_object" "directory_structure" { + for_each = var.folder_structure + bucket = var.bucket_name + key = "${each.value}/" + content_type = "application/x-directory" } \ No newline at end of file diff --git a/terraform-modules/aws/s3/folders/variables.tf b/terraform-modules/aws/s3/folders/variables.tf index b417e28ec..c1cd03a91 100644 --- a/terraform-modules/aws/s3/folders/variables.tf +++ b/terraform-modules/aws/s3/folders/variables.tf @@ -3,11 +3,15 @@ variable "bucket_name" { } variable "folder_structure" { - description = "The folder structure to create in S3 (list of objects)" - type = list(object({ - key = string - subfolders = list(object({ - key = string - })) - })) + type = list(string) + description = <<-EOT + The folder structure to create in S3. + Example usage: + [ + "folder1", + "folder2", + "folder3", + "folder4/subfolder1/subfolder2" + ] + EOT } \ No newline at end of file From 76067569256843ad7fcfca09a603a831ac1406b8 Mon Sep 17 00:00:00 2001 From: bcarranza Date: Mon, 4 Sep 2023 16:45:13 -0600 Subject: [PATCH 4/5] for each map --- terraform-modules/aws/s3/folders/main.tf | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/terraform-modules/aws/s3/folders/main.tf b/terraform-modules/aws/s3/folders/main.tf index 3e4c74216..a14ccd9dd 100644 --- a/terraform-modules/aws/s3/folders/main.tf +++ b/terraform-modules/aws/s3/folders/main.tf @@ -1,6 +1,11 @@ +locals { + folder_structure_map = { for idx, folder in var.folder_structure : idx => folder } +} + resource "aws_s3_object" "directory_structure" { - for_each = var.folder_structure - bucket = var.bucket_name - key = "${each.value}/" + for_each = local.folder_structure_map + + bucket = aws_s3_bucket.example.id + key = each.value content_type = "application/x-directory" } \ No newline at end of file From 94ccf88e1333ae68792d04f992663dcb2d143d92 Mon Sep 17 00:00:00 2001 From: bcarranza Date: Mon, 4 Sep 2023 16:53:55 -0600 Subject: [PATCH 5/5] fix --- terraform-modules/aws/s3/folders/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/terraform-modules/aws/s3/folders/main.tf b/terraform-modules/aws/s3/folders/main.tf index a14ccd9dd..e5251feda 100644 --- a/terraform-modules/aws/s3/folders/main.tf +++ b/terraform-modules/aws/s3/folders/main.tf @@ -5,7 +5,7 @@ locals { resource "aws_s3_object" "directory_structure" { for_each = local.folder_structure_map - bucket = aws_s3_bucket.example.id + bucket = var.bucket_name key = each.value content_type = "application/x-directory" } \ No newline at end of file