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

cmm*_*ser 18 directory amazon-s3 bucket amazon-web-services terraform

我能够使用此链接在亚马逊S3中创建一个桶.

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

resource "aws_s3_bucket" "b" {
    bucket = "my_tf_test_bucket"
    acl    = "private"
}
Run Code Online (Sandbox Code Playgroud)

现在我想在桶内创建文件夹,比方说Folder1.

我找到了创建S3对象的链接.但这有一个强制性参数source.我不确定这个值有什么,因为我的意图是在S3存储桶中创建一个文件夹.

小智 44

要在Mac或Linux上运行terraform,以下将执行您想要的操作

resource "aws_s3_bucket_object" "folder1" {
    bucket = "${aws_s3_bucket.b.id}"
    acl    = "private"
    key    = "Folder1/"
    source = "/dev/null"
}
Run Code Online (Sandbox Code Playgroud)

如果您在Windows上,则可以使用空文件.

虽然人们对于没有文件夹的s3会很迂腐,但是有很多操作都有一个对象占位符,用于键前缀(也称为文件夹)可以让生活更轻松.比如s3 sync,例如.

  • 感谢您提供工作答案,而不是对文件夹的性质迂腐. (14认同)
  • 我刚刚在这里测试了它,我能够使用 `content = ""` 而不是 `source = "/dev/null"` 创建文件夹。我使用的是 Linux,但我想它也应该适用于 Mac 和 Windows。我想说这可能是一个更好的解决方案,因为它是一个不依赖操作系统的解决方案。 (5认同)
  • 是否可以提供多个密钥? (2认同)
  • 在 Windows 上,我之前创建了一个空文件,它可以工作,但在基于 *nix 的东西的 /dev/null 后面我想我会尝试 Windows 等效的,它只是 nul 并且它也可以工作!所以在上面用 source = "nul" 替换 source = "/dev/null" 并且它起作用了。 (2认同)
  • 使用`application / x-directory`作为内容类型将文件指定为目录似乎没有记录在案的约定。因此,我成功地将`content_type =“ application / x-directory”添加到我的TF文件中。前往/sf/answers/3092595061/的提示 (2认同)

小智 24

这里的答案已经过时了,现在绝对可以通过 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/"
}
Run Code Online (Sandbox Code Playgroud)

如果您不提供对象的源,那么 Terraform 将创建一个空目录。

重要 - 请注意尾部斜杠,这将确保您获得一个目录而不是空文件。


Kar*_*n B 20

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",它将起作用.

  • AWS有一个创建文件夹按钮。应该有一个等效的terraform op来做同样的事情。如果那是在以斜杠结尾的路径上创建零内容文件,则terraform应该允许它,但我认为不会。 (2认同)

Ilh*_*cas 18

实际上,有一种规范的方式来创建它,而不依赖于操作系统,通过检查 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"
}
Run Code Online (Sandbox Code Playgroud)

注意尾部斜杠,否则会创建一个空文件

以上已与 Windows 操作系统一起使用,以使用 terraform s3_bucket_object 成功创建文件夹。