为啥 terraform 会在 s3 存储桶中创建一个空目录?

Posted

技术标签:

【中文标题】为啥 terraform 会在 s3 存储桶中创建一个空目录?【英文标题】:Why does terraform create an empty directory in the s3 bucket?为什么 terraform 会在 s3 存储桶中创建一个空目录? 【发布时间】:2022-01-16 18:52:13 【问题描述】:

我有一个 Terraform 设置,它创建了一个 s3 存储桶和存储桶中的子目录。 由于某种原因,在每个目录中都使用空 / 和创建存储桶。

s3_bucket:
-/
-folder1:-/
         -some file
-folder2:-/

以此类推,每个目录都有一个空的 /。 这会导致我接下来的几个步骤出现问题,为什么会这样创建?如何在没有空 / 的情况下创建 s3 和文件夹?

resource "aws_s3_bucket_object" "object" 
  bucket = "$aws_s3_bucket.s3_ob.id"
  key    = "folder1/"
  source = "dummy.txt"


resource "aws_s3_bucket_object" "object2" 
  bucket = "$aws_s3_bucket.s3_ob.id"
  key    = "/folder2/"
  source = "dummy.txt"

【问题讨论】:

【参考方案1】:

发生这种情况是因为您的密钥以 / 结尾。您的代码所做的是将 dummy.txt 的内容写入 folder1/folder2/ 的键。 S3 是键值对象存储而不是文件系统。目录的概念只是我们通过用斜杠字符/ 分割键并调用每一步一个目录来逻辑地引入的东西,所以在这种情况下,是的,一个文件夹 1 和文件夹 2 已经创建,因为斜线后面没有任何文件名几乎是空的。

我假设您想要做的只是为您的文件提供一些传统文件系统意义上的名称,例如不要以 / 结束您的键名。

resource "aws_s3_bucket_object" "object" 
  bucket = "$aws_s3_bucket.s3_ob.id"
  key    = "folder1/dummy.txt"
  source = "dummy.txt"


resource "aws_s3_bucket_object" "object2" 
  bucket = "$aws_s3_bucket.s3_ob.id"
  key    = "/folder2/dummy.txt"
  source = "dummy.txt"

【讨论】:

以上是关于为啥 terraform 会在 s3 存储桶中创建一个空目录?的主要内容,如果未能解决你的问题,请参考以下文章

为啥此脚本无法在 s3 中创建存储桶?

无法在特定区域中创建s3存储桶

使用 CloudFormation 在 S3 存储桶中创建 Lambda 通知

Apache Hive 在 S3 存储桶错误中创建表

无法在 cloudformation 中创建带有事件的 s3 存储桶,以连接到它

如何将旧 S3 存储桶中的 Terraform 状态移动到新的 S3 存储桶?