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

问题描述 投票:13回答:3

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

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

resource "aws_s3_bucket" "b" {
    bucket = "my_tf_test_bucket"
    acl    = "private"
}

现在我想在桶中创建文件夹,比如Folder1

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

amazon-web-services amazon-s3 directory bucket terraform
3个回答
38
投票

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


17
投票

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
投票

旧答案,但如果您指定了文件夹的密钥(尚不存在),terraform将自动为您创建文件夹

terraform {
  backend "s3" {
    bucket  = "mysql-staging"
    key     = "rds-mysql-state/terraform.tfstate"
    region  = "us-west-2"
    encrypt = true
  }
}

1
投票

实际上,有一种规范的方法来创建它,而不依赖于操作系统,通过在UI上检查网络,你会看到内容标题,如:https://stackoverflow.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操作系统一起使用,可使用terraform s3_bucket_object成功创建文件夹。

© www.soinside.com 2019 - 2024. All rights reserved.