如何编写 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/",
...
]
这会根据输入在存储桶中动态创建 fold
和 dir
文件夹。
如果您不需要使文件夹列表动态化(即对它们进行硬编码而不是变量输入),您也可以使用局部变量而不是变量。类似于:
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”的语法。将在给定的存储桶中创建空文件夹。
需要在 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/",
...
]
这会根据输入在存储桶中动态创建 fold
和 dir
文件夹。
如果您不需要使文件夹列表动态化(即对它们进行硬编码而不是变量输入),您也可以使用局部变量而不是变量。类似于:
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”的语法。将在给定的存储桶中创建空文件夹。