我在 Terraform 中配置 AWS Lambda 功能时遇到问题。现在,以下配置有效,因此即使我没有对其进行任何更改,功能部署每次都会顺利进行。这是因为生成的
source_code_hash
与之前的不同。
您是否知道如何做得更好,以便 terraform 检测代码中的更改,并且只有当它发现它们时才进行部署?
data "archive_file" "parser_service" {
type = "zip"
source_dir = "${path.module}/xxx"
output_path = "${path.module}/xxx.zip"
}
resource "aws_s3_object" "s3_object" {
bucket = var.lambda_bucket
key = "lambda_parser_${var.node_env}.zip"
source = "${path.module}/lambda_parser_${var.node_env}.zip"
etag = filemd5(data.archive_file.parser_service.output_path)
}
resource "aws_lambda_function" "parser_function" {
function_name = var.lambda_name
handler = "xxx/main.handler"
role = var.iam_role
runtime = var.runtime
memory_size = var.memory_size
timeout = var.timeout
s3_bucket = var.lambda_bucket
s3_key = aws_s3_object.s3_object.key
source_code_hash = filemd5("${path.module}/lambda_parser_${var.node_env}.zip")
depends_on = [aws_s3_object.s3_object]
}
感谢您的帮助! #编辑
我正在尝试使用:
source_code_hash = aws_s3_object.s3_object.etag
但是当我运行 terraform apply 时它会生成此错误:
provider "registry.terraform.io/hashicorp/aws" produced an invalid new value for .source_code_hash: was
│ cty.StringVal("ea34c83724a7cac5009bd03cb2388a33"), but now cty.StringVal("ce4f3d0e888dddf1d20d1dbeb36938e8-10").
您可以从
output_base64sha256
数据的 archive_file
输出属性获取哈希值,然后在 aws_lambda_function
定义中使用它:
source_code_hash = data.archive_file.parser_service.output_base64sha256
此外,由于您的
aws_lambda_file
已经引用了 aws_s3_object
资源,因此 depends_on
块是多余的。