如何使用 Terraform 在 Amazon S3 存储桶中创建文件夹
How to create a folder in an amazon S3 bucket using terraform
我能够使用此 link 在 Amazon S3 中创建存储桶。
我使用以下代码创建了一个桶:
resource "aws_s3_bucket" "b" {
bucket = "my_tf_test_bucket"
acl = "private"
}
现在我想在存储桶中创建文件夹,比如说 Folder1
。
我找到了用于创建 S3 对象的 link。但是这个有一个强制参数source
。我不确定这个值必须是什么,因为我的目的是在 S3 存储桶中创建一个文件夹。
S3 不支持文件夹。对象可以有带斜杠的前缀名称,看起来像文件夹,但这只是对象名称的一部分。所以没有办法在 terraform 或其他任何东西中创建文件夹,因为 S3 中没有文件夹这样的东西。
http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html
http://docs.aws.amazon.com/AWSImportExport/latest/DG/ManipulatingS3KeyNames.html
如果您想假装,您可以在名为 "Folder1/" 的存储桶中创建一个零字节对象,但这不是必需的。您可以只创建具有 "Folder1/File1" 等键名的对象,它会起作用。
对于 Mac 或 Linux 上的 运行 terraform,以下将执行您想要的操作
resource "aws_s3_bucket_object" "folder1" {
bucket = "${aws_s3_bucket.b.id}"
acl = "private"
key = "Folder1/"
source = "/dev/null"
}
如果您使用的是 windows,则可以使用空文件。
虽然人们会对 s3 没有文件夹感到迂腐,但在许多操作中,为键前缀(也称为文件夹)提供对象占位符可以让生活更轻松。例如 s3 同步。
旧答案,但如果您使用文件夹(尚不存在)指定密钥,terraform 将自动为您创建文件夹
terraform {
backend "s3" {
bucket = "mysql-staging"
key = "rds-mysql-state/terraform.tfstate"
region = "us-west-2"
encrypt = true
}
}
实际上,有一种创建它的规范方法,无需 OS 依赖,方法是在 UI 上检查网络,您会看到内容 headers,如: https://whosebug.com/users/1554386/alastair-mccormack ,
从 UI.
可见,现在 S3 确实支持文件夹
这就是实现它的方法:
resource "aws_s3_bucket_object" "base_folder" {
bucket = "${aws_s3_bucket.default.id}"
acl = "private"
key = "${var.named_folder}/"
content_type = "application/x-directory"
kms_key_id = "key_arn_if_used"
}
请注意结尾的斜杠,否则会创建一个空文件
以上已与 Windows OS 一起使用以使用 terraform s3_bucket_object.
成功创建文件夹
v0.12.8 引入了一个新的 fileset()
函数,它可以与 for_each
结合使用以原生支持:
NEW FEATURES:
lang/funcs: New fileset function, for finding static local files that
match a glob pattern. (#22523)
该函数的示例用法如下(来自here):
# Given the file structure from the initial issue:
# my-dir
# |- file_1
# |- dir_a
# | |- file_a_1
# | |- file_a_2
# |- dir_b
# | |- file_b_1
# |- dir_c
# And given the expected behavior of the base_s3_key prefix in the initial issue
resource "aws_s3_bucket_object" "example" {
for_each = fileset(path.module, "my-dir/**/file_*")
bucket = aws_s3_bucket.example.id
key = replace(each.value, "my-dir", "base_s3_key")
source = each.value
}
在撰写本文时,v0.12.8 已发布一天(发布于 2019-09-04),因此 https://www.terraform.io/docs/providers/aws/r/s3_bucket_object.html 上的文档尚未引用它。我不确定这是不是故意的。
顺便说一句,如果你使用上面的,记得在你的项目中 update/create version.tf
像这样:
terraform {
required_version = ">= 0.12.8"
}
此处的答案已过时,现在绝对可以通过 Terraform 在 S3 中创建一个空文件夹。使用aws_s3_object资源,如下:
resource "aws_s3_bucket" "this_bucket" {
bucket = "demo_bucket"
}
resource "aws_s3_object" "object" {
bucket = aws_s3_bucket.this_bucket.id
key = "demo/directory/"
}
如果您不提供对象的源,那么 terraform 将创建一个空目录。
重要 - 请注意尾部的斜杠,这将确保您获得目录而不是空文件
我想在此讨论中补充一点,您可以通过为资源提供一组字符串来创建一组空文件夹:
resource "aws_s3_object" "default_s3_content" {
for_each = var.default_s3_content
bucket = aws_s3_bucket.bucket.id
key = "${each.value}/"
}
其中 var.default_s3_content
是一组字符串:
variable "default_s3_content" {
description = "The default content of the s3 bucket upon creation of the bucket"
type = set(string)
default = ["folder1", "folder2", "folder3", "folder4", "folder5"]
}
我能够使用此 link 在 Amazon S3 中创建存储桶。
我使用以下代码创建了一个桶:
resource "aws_s3_bucket" "b" {
bucket = "my_tf_test_bucket"
acl = "private"
}
现在我想在存储桶中创建文件夹,比如说 Folder1
。
我找到了用于创建 S3 对象的 link。但是这个有一个强制参数source
。我不确定这个值必须是什么,因为我的目的是在 S3 存储桶中创建一个文件夹。
S3 不支持文件夹。对象可以有带斜杠的前缀名称,看起来像文件夹,但这只是对象名称的一部分。所以没有办法在 terraform 或其他任何东西中创建文件夹,因为 S3 中没有文件夹这样的东西。
http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html http://docs.aws.amazon.com/AWSImportExport/latest/DG/ManipulatingS3KeyNames.html
如果您想假装,您可以在名为 "Folder1/" 的存储桶中创建一个零字节对象,但这不是必需的。您可以只创建具有 "Folder1/File1" 等键名的对象,它会起作用。
对于 Mac 或 Linux 上的 运行 terraform,以下将执行您想要的操作
resource "aws_s3_bucket_object" "folder1" {
bucket = "${aws_s3_bucket.b.id}"
acl = "private"
key = "Folder1/"
source = "/dev/null"
}
如果您使用的是 windows,则可以使用空文件。
虽然人们会对 s3 没有文件夹感到迂腐,但在许多操作中,为键前缀(也称为文件夹)提供对象占位符可以让生活更轻松。例如 s3 同步。
旧答案,但如果您使用文件夹(尚不存在)指定密钥,terraform 将自动为您创建文件夹
terraform {
backend "s3" {
bucket = "mysql-staging"
key = "rds-mysql-state/terraform.tfstate"
region = "us-west-2"
encrypt = true
}
}
实际上,有一种创建它的规范方法,无需 OS 依赖,方法是在 UI 上检查网络,您会看到内容 headers,如: https://whosebug.com/users/1554386/alastair-mccormack ,
从 UI.
可见,现在 S3 确实支持文件夹这就是实现它的方法:
resource "aws_s3_bucket_object" "base_folder" {
bucket = "${aws_s3_bucket.default.id}"
acl = "private"
key = "${var.named_folder}/"
content_type = "application/x-directory"
kms_key_id = "key_arn_if_used"
}
请注意结尾的斜杠,否则会创建一个空文件
以上已与 Windows OS 一起使用以使用 terraform s3_bucket_object.
成功创建文件夹v0.12.8 引入了一个新的 fileset()
函数,它可以与 for_each
结合使用以原生支持:
NEW FEATURES:
lang/funcs: New fileset function, for finding static local files that match a glob pattern. (#22523)
该函数的示例用法如下(来自here):
# Given the file structure from the initial issue:
# my-dir
# |- file_1
# |- dir_a
# | |- file_a_1
# | |- file_a_2
# |- dir_b
# | |- file_b_1
# |- dir_c
# And given the expected behavior of the base_s3_key prefix in the initial issue
resource "aws_s3_bucket_object" "example" {
for_each = fileset(path.module, "my-dir/**/file_*")
bucket = aws_s3_bucket.example.id
key = replace(each.value, "my-dir", "base_s3_key")
source = each.value
}
在撰写本文时,v0.12.8 已发布一天(发布于 2019-09-04),因此 https://www.terraform.io/docs/providers/aws/r/s3_bucket_object.html 上的文档尚未引用它。我不确定这是不是故意的。
顺便说一句,如果你使用上面的,记得在你的项目中 update/create version.tf
像这样:
terraform {
required_version = ">= 0.12.8"
}
此处的答案已过时,现在绝对可以通过 Terraform 在 S3 中创建一个空文件夹。使用aws_s3_object资源,如下:
resource "aws_s3_bucket" "this_bucket" {
bucket = "demo_bucket"
}
resource "aws_s3_object" "object" {
bucket = aws_s3_bucket.this_bucket.id
key = "demo/directory/"
}
如果您不提供对象的源,那么 terraform 将创建一个空目录。
重要 - 请注意尾部的斜杠,这将确保您获得目录而不是空文件
我想在此讨论中补充一点,您可以通过为资源提供一组字符串来创建一组空文件夹:
resource "aws_s3_object" "default_s3_content" {
for_each = var.default_s3_content
bucket = aws_s3_bucket.bucket.id
key = "${each.value}/"
}
其中 var.default_s3_content
是一组字符串:
variable "default_s3_content" {
description = "The default content of the s3 bucket upon creation of the bucket"
type = set(string)
default = ["folder1", "folder2", "folder3", "folder4", "folder5"]
}