我正在将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存储桶对象。
答案 0 :(得分:1)
Zip存档默认包含元数据,例如时间戳,即使源文件没有差异,哈希也会导致哈希值不同。手动构建归档文件时,可以使用--no-extra
或-X
标志来避免这种情况。我不确定Terraform是否支持此标志。
在zip手册页中:
-X
不要保存额外的文件属性(在OS / 2上为扩展属性,在Unix上为uid / gid和文件时间)。 zip格式使用了额外的 字段以包含每个条目的其他信息。一些额外的 字段特定于特定系统,而其他字段适用 所有系统。通常,当zip从现有文件中读取条目时 存档,它将读取它知道的额外字段,剥离其余字段,然后添加 适用于该系统的其他字段。使用-X,所有拉链条 旧字段,仅包含Unicode和Zip64额外字段 (当前这两个额外的字段无法禁用)。
否定此选项-X-包括所有默认的额外 字段,还可以复制所有无法识别的额外字段。