簡體   English   中英

如何使用 terraform 在亞馬遜 S3 存儲桶中創建文件夾

[英]How to create a folder in an amazon S3 bucket using terraform

我能夠使用此鏈接在亞馬遜 S3 中創建一個存儲桶。

我使用以下代碼創建了一個存儲桶:

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

現在我想在存儲桶中創建文件夾,比如Folder1

我找到了創建 S3 對象的鏈接 但這有一個強制參數source 我不確定這個值是什么,因為我的目的是在 S3 存儲桶中創建一個文件夾。

對於在 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 同步。

實際上,有一種規范的方法可以創建它,而不依賴於操作系統,通過在 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 操作系統一起使用,成功使用 terraform s3_bucket_object 創建文件夾。

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”之類的鍵名創建對象,它會起作用。

這里的答案已經過時了,現在絕對可以通過 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 將創建一個空目錄。

重要 - 請注意尾部斜杠,這將確保您獲得目錄而不是空文件

舊答案,但如果您使用文件夾指定密鑰(尚不存在),terraform 將自動為您創建文件夾

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

v0.12.8引入了一個新的fileset()函數,它可以與for_each結合使用以原生支持此功能:

新的功能:

lang/funcs:新的文件集函數,用於查找與 glob 模式匹配的靜態本地文件。 #22523

此函數的示例用法如下(來自此處):

# 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"
}

我想在此討論中補充一點,您可以通過為資源提供一組字符串來創建一組空文件夾:

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"]
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM