如何编写 Terraform 模块在同一个 google 云存储桶中创建多个文件夹?

How to write Terraform module to create multiple folders in same google cloud storage bucket?

需要在 Google 云存储桶中创建多个文件夹。我知道可以创建存储桶,但不确定如何在同一个存储桶中创建多个文件夹。

我认为下面是存储桶中一个文件夹的代码。

resource "google_storage_bucket" "storage_bucket" {
  name          = "my-test-bucket"
  location      = "us-east4"

  project       = "my-project"
}

resource "google_storage_bucket_object" "my_folder" {
  name          = "fold/"
  bucket        = "${google_storage_bucket.storage_bucket.name}"
}

任何人都可以告诉我如何为多个文件夹做吗?

已更新以添加来自 raj S 的回答的内容。


您可以使用一组字符串和 for_each。如下所示:

variable "folders" {
  type    = set(string)
  default = []
}

resource "google_storage_bucket" "storage_bucket" {
  name     = "my-test-bucket"
  location = "us-east4"
  project  = "my-project"
}


resource "google_storage_bucket_object" "folder" {
  for_each = var.folders

  name    = each.key
  bucket  = google_storage_bucket.storage_bucket.name
  content = "folder_content"
}

然后一个例子输入:

folders = [
  "fold/",
  "dir/",
  ...
]

这会根据输入在存储桶中动态创建 folddir 文件夹。

如果您不需要使文件夹列表动态化(即对它们进行硬编码而不是变量输入),您也可以使用局部变量而不是变量。类似于:

locals {
  folders = toset([
    "fold/",
    "dir/",
    ...
  ])
}

resource "google_storage_bucket" "storage_bucket" {
  name     = "my-test-bucket"
  location = "us-east4"
  project  = "my-project"
}


resource "google_storage_bucket_object" "folder" {
  for_each = local.folders

  name    = each.key
  bucket  = google_storage_bucket.storage_bucket.name
  content = "folder_content"
}

正确答案是:“文件夹不存在”。

你可以检查一下,在你的文件夹上使用 gsutil

gsutil ls -la gs://<bucket>/fake-folder/
         0  2022-03-17T19:32:39Z  gs://<bucket>/fake-folder/#1647545559507877  metageneration=1

您可以看到您有 1 个文件,大小为 0,名称中没有字符。但是你有一个对象生成(#XXXXXX 值)。


因此,在云存储上创建文件夹只是一种人为表现,而不是技术特征。所有文件都存放在根目录(bucket),文件名是文件的完整路径,包括“文件夹”。按照惯例,/ 是人类的文件夹分隔符,但它在技术上是错误的。

直接后果是如果文件夹不存在,您可以在任何文件夹事件中创建任何文件。因为文件夹不存在!!

为避免错误,必须指定“内容”或“来源”,可以使用以下代码。

resource "google_storage_bucket_object" "folder" {
  for_each = local.folders

  name   = each.key
  content = "folder_content"
  bucket = google_storage_bucket.storage_bucket.name
}

这是按照地形“google_storage_bucket_object”的语法。将在给定的存储桶中创建空文件夹。