Terraform S3存储桶对象的etag每次更新都会不断更新

时间:2019-01-23 15:37:30

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

我正在将AWS Lambda代码作为zip文件上传到S3存储桶中。

我为S3存储桶对象声明了一个资源:

resource "aws_s3_bucket_object" "source-code-object" {
  bucket = "${aws_s3_bucket.my-bucket.id}"
  key = "source-code.zip"
  source = "lambda_source_code/source-code.zip"
  etag = "${base64sha256(file("lambda_source_code/source-code.zip"))}"
}

我也有一个数据声明来压缩我的代码:

data "archive_file" "source-code-zip" {
  type = "zip"
  source_file = "${path.module}/lambda_source_code/run.py"
  output_path = "${path.module}/lambda_source_code/source-code.zip"
}

terraform apply的输出不断向我显示对哈希的更改:

  ~ aws_s3_bucket_object.source-code-object
      etag: "old_hash" => "new_hash"

即使我的源代码没有任何变化。为什么会发生这种现象?我看到similar posts的Lambdas源代码不断变化,但实际上我的Lambdas并不是每次都更新(在控制台中检查了上一次更新时间)。但是,看起来确实每个apply上都有一个新的S3存储桶对象。

1 个答案:

答案 0 :(得分:1)

Zip存档默认包含元数据,例如时间戳,即使源文件没有差异,哈希也会导致哈希值不同。手动构建归档文件时,可以使用--no-extra-X标志来避免这种情况。我不确定Terraform是否支持此标志。

在zip手册页中:

  

-X

     

不要保存额外的文件属性(在OS / 2上为扩展属性,在Unix上为uid / gid和文件时间)。 zip格式使用了额外的   字段以包含每个条目的其他信息。一些额外的   字段特定于特定系统,而其他字段适用   所有系统。通常,当zip从现有文件中读取条目时   存档,它将读取它知道的额外字段,剥离其余字段,然后添加   适用于该系统的其他字段。使用-X,所有拉链条   旧字段,仅包含Unicode和Zip64额外字段   (当前这两个额外的字段无法禁用)。

     

否定此选项-X-包括所有默认的额外   字段,还可以复制所有无法识别的额外字段。