Terraform - 每次申请时将文件上传到 S3

Posted

技术标签:

【中文标题】Terraform - 每次申请时将文件上传到 S3【英文标题】:Terraform - Upload file to S3 on every apply 【发布时间】:2019-09-30 02:43:44 【问题描述】:

我需要将一个文件夹上传到 S3 Bucket。但是当我第一次申请时。它只是上传。但是我这里有两个问题:

    上传的版本输出为空。我希望有一些 version_id,例如 1、2、3 当再次运行terraform apply 时,它显示Apply complete! Resources: 0 added, 0 changed, 0 destroyed。我希望在运行 terraform apply 并创建新版本时一直上传。

我做错了什么?这是我的 Terraform 配置:

resource "aws_s3_bucket" "my_bucket" 
  bucket = "my_bucket_name"

  versioning 
    enabled = true
  


resource "aws_s3_bucket_object" "file_upload" 
  bucket = "my_bucket"
  key    = "my_bucket_key"
  source = "my_files.zip"


output "my_bucket_file_version" 
  value = "$aws_s3_bucket_object.file_upload.version_id"

【问题讨论】:

我不确定,但如果可能的话,你可以尝试使用这个:terraform.io/docs/providers/archive/d/archive_file.html 来生成 zip 文件。只需检查 terraform 是否将此新 zip 文件识别为已更改文件,然后使用新版本 id 再次上传新 zip 文件(包含相同内容)。 该行为与未在存储桶上启用版本控制一致。你能检查一下是不是真的吗? 【参考方案1】:

Terraform 仅在检测到配置和远程对象属性之间存在差异时才对远程对象进行更改。到目前为止,在您编写的配置中,配置仅包含文件名。它不包含有关文件内容的任何内容,因此 Terraform 无法对文件更改做出反应。

要进行后续更改,有几个选项:

您可以为每个新版本使用不同的本地文件名。 您可以为每个新版本使用不同的远程对象路径。 无论本地文件名或对象路径如何,您都可以使用对象 etag 让 Terraform 识别内容何时发生更改。

在这种情况下,这些中的最后一个似乎最接近您想要的。为此,请添加 etag 参数并将其设置为文件的 MD5 哈希:

resource "aws_s3_bucket_object" "file_upload" 
  bucket = "my_bucket"
  key    = "my_bucket_key"
  source = "$path.module/my_files.zip"
  etag   = "$filemd5("$path.module/my_files.zip")"

有了这个额外的参数,Terraform 将检测磁盘上文件的 MD5 哈希值何时与远程存储在 S3 中的不同,并计划相应地更新对象。


(我不确定version_id 发生了什么。只要在存储桶上启用了版本控制,它就应该可以工作。)

【讨论】:

【参考方案2】:

您不应该使用 Terraform 来执行此操作。 Terraform 应该编排和配置您的基础设施及其配置,而不是文件。也就是说,terraform 不知道文件的更改。除非您更改它们的名称,否则 terraform 不会更新状态。

另外,最好使用local-exec 来执行此操作。比如:

resource "aws_s3_bucket" "my-bucket" 
# ...

  provisioner "local-exec" 
     command = "aws s3 cp path_to_my_file $aws_s3_bucket.my-bucket.id"
  

【讨论】:

S3 通常用于存储在基础设施定义中引用的部署包,例如在 Lambda 或 Kinesis Analytics for Java 中。 S3 的这种使用完全符合“基础设施及其配置”,这就是 Terraform 为其提供资源以及您应该使用 Terraform 将某些文件上传到 S3 的原因。

以上是关于Terraform - 每次申请时将文件上传到 S3的主要内容,如果未能解决你的问题,请参考以下文章

强制 Terraform 每次都应用新的状态文件 - S3 文件上传场景

使用 Terraform 将文件上传到 AWS Secrets Manager

如何在 Azure Pipeline 上使用 Terraform 将文件上传到 Azure 存储?

将多个文件上传到 Terraform 中的多个 S3 存储桶

Terraform删除路由表,然后在第二次运行时将其添加(无更改)。错误或我缺少什么吗?

从 terraform 上传 AWS S3 中的多个文件