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

时间:2019-05-13 07:05:35

标签: amazon-web-services amazon-s3 terraform terraform-provider-aws

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

  1. 上传的版本输出为null。我希望有一些version_id,例如1、2、3
  2. 再次运行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}"
}

2 个答案:

答案 0 :(得分:1)

您不应该使用Terraform来执行此操作。 Terraform应该用来编排和配置您的基础结构及其配置,而不是文件。就是说,terraform无法识别文件上的更改。除非更改名称,否则terraform不会更新状态。

此外,最好使用shutil.make_archive来做到这一点。像这样:

local-exec

答案 1 :(得分: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中的MD5哈希不同,并计划相应地更新该对象。


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