代码之家  ›  专栏  ›  技术社区  ›  Yu Chen little_birdie

terraform s3 bucket对象的etag在每次应用时都会不断更新

  •  2
  • Yu Chen little_birdie  · 技术社区  · 5 年前

    我将把aws lambda代码作为zip文件上传到s3存储桶中。

    我为s3 bucket对象声明了一个资源:

    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实际上并不是每次都在更新(上一次更新是在console中签入的)。但是,它看起来确实像是一个新的s3 bucket对象被上传到 apply .

    1 回复  |  直到 5 年前
        1
  •  1
  •   bwest    5 年前

    ZIP存档默认包含元数据,如时间戳,这会导致哈希值不同,即使源文件不是。手动构建存档时,可以使用 --no-extra -X 旗帜。我不确定Terraform是否支持这个标志。

    从ZIP手册页:

    -X

    不要保存额外的文件属性(os/2上的扩展属性、uid/gid和unix上的文件时间)。zip格式使用额外的 包含每个条目的附加信息的字段。一些额外的 字段特定于特定系统,而其他字段则适用 所有系统。通常,当zip从现有的 存档,读取它知道的额外字段,删除其余字段,然后添加 适用于该系统的额外字段。带-x,拉链 旧字段,仅包括Unicode和Zip64附加字段 (当前不能禁用这两个额外字段)。

    否定此选项,-x-,包括所有默认的额外选项 字段,但也复制任何无法识别的额外字段。