如何使用terraform在亚马逊S3桶中创建文件夹

时间:2016-05-27 20:38:45

标签: amazon-web-services amazon-s3 directory bucket terraform

我能够使用此link在亚马逊S3中创建一个存储桶。

我使用以下代码创建了一个存储桶:

Folder1

现在我想在存储桶中创建文件夹,比如source

我找到了用于创建S3对象的link。但是这有一个强制参数with open(filename, 'wb') as output output.write("some text") output.write("some more text") # ... output.write("and some more text") 。我不确定这个值是什么,因为我的意图是在S3存储桶中创建一个文件夹。

4 个答案:

答案 0 :(得分:34)

要在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 sync。例如。

答案 1 :(得分:15)

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”等键名创建对象即可。

答案 2 :(得分:2)

实际上,有一种规范的方式可以创建它,而不必依赖于操作系统,方法是在UI上检查网络,使您看到内容标头,如https://stackoverflow.com/users/1554386/alastair-mccormack

这些天,S3确实支持从UI可见的文件夹。

这是您可以实现的方式:

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成功创建文件夹。

答案 3 :(得分:0)

v0.12.8引入了一个新的fileset()函数,可以与for_each结合使用以原生地支持此功能:

  

新功能:

     lang / funcs:新的文件集功能,用于查找静态本地文件   匹配全局模式。 (#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上的文档尚未引用它。我不确定这是否是故意的。


顺便说一句,如果您使用上面的方法,请记住要像这样在项目中更新/创建version.tf

terraform {
  required_version = ">= 0.12.8"
}