Terraform中的相对路径

15
我正在尝试使用terraform创建AWS Lambda函数。我的terraform目录如下:
  • terraform
    • iam-policies
      • main.tf
    • lambda
      • files/
      • main.tf
    • main.tf
我将Lambda函数存储在/terraform/lambda/files/lambda_function.py中。每当我运行terraform apply时,会执行一个"null_resource",在本地机器上执行一些命令来压缩Python文件。
variable "pythonfile" {
  description = "lambda function python filename"
  type        = "string"
}

resource "null_resource" "lambda_preconditions" {
  triggers {
    always_run = "${uuid()}"
  }
  provisioner "local-exec" {
    command = "rm -rf ${path.module}/files/zips"
  }
  provisioner "local-exec" {
    command = "mkdir -p ${path.module}/files/zips"
  }
  provisioner "local-exec" {
    command = "cp -R ${path.module}/files/${var.pythonfile} ${path.module}/files/zips/lambda_function.py"
  }
  provisioner "local-exec" {
    command = "cd ${path.module}/files/zips && zip -r lambda.zip ."
  }
}

我的“aws_lambda_function”资源看起来是这样的。

resource "aws_lambda_function" "lambda_function" {
  filename         = "${path.module}/files/zips/lambda.zip"
  function_name    = "${format("%s-%s-%s-lambda-function", var.name, var.environment, var.function_name)}"
  role             = "${aws_iam_role.iam_for_lambda.arn}"
  handler          = "lambda_function.lambda_handler"
  source_code_hash = "${base64sha256(format("%s/files/zips/lambda.zip", path.module))}", length(path.cwd) + 1, -1)}")}"
  runtime          = "${var.function_runtime}"
  timeout          = "${var.function_timeout}"
  memory_size      = "${var.function_memory}"

  environment {
    variables = {
      region      = "${var.region}"
      name        = "${var.name}"
      environment = "${var.environment}"
    }
  }

  vpc_config {
    subnet_ids         = ["${var.subnet_ids}"]
    security_group_ids = ["${aws_security_group.lambda_sg.id}"]
  }

  depends_on = [
    "null_resource.lambda_preconditions"
  ]
}

问题: 每当我更改lambda_function.py文件并再次应用terraform时,一切都正常,但lambda函数中的实际代码不会更改。 此外,如果我删除所有terraform状态文件并重新应用,则新更改会传播而不会出现任何问题。

可能的原因是什么?


你能具体说明一下“一切都正常,但是Lambda函数中的实际代码没有改变”吗?因为这里似乎并不是一切都正常(至少不是你期望的)。当你对“lambda_function.py”进行更改时,“terraform apply”的输出是什么?它会创建一个新的zip文件吗?它会更新“lambda_function”资源吗? - norbjd
@norbjd 每当我执行 terraform apply 命令时,它会创建 zip 文件并将代码上传到 Lambda,而且没有任何错误。但是当我更改 lambda_function.py 中的代码并执行 terraform apply 命令时,期望的结果应该是在 Lambda 控制台中更新函数代码。但实际上,lambda_function.py 中的更改未传播到 Lambda 函数。第二次尝试时没有错误。 - Manoj Acharya
第二个 terraform apply 是否创建了包含更新代码的 zip 文件? - norbjd
@norbjd 是的,第二个 apply 创建了更新后的 zip 文件,但是 Lambda 中的代码似乎没有改变。我检查了 zip 文件,里面的代码已经更新了。 - Manoj Acharya
1
顺便提一下,source_code_hash 语法有误(关闭括号/方括号的数量不一致)。第一个 apply 后,它的计算值是什么?如果第二个 applysource_code_hash 是相同的,那就说明 lambda 没有被更新(因为其他计算参数也是相同的)。 - norbjd
为了快速测试 source_code_hash 表达式是否是您的问题,您可以始终使用 source_code_hash = "${timestamp()}" 强制每次更新。 - Arin
1个回答

17

我没有使用null_resource,而是使用archive_file数据源,如果检测到新更改,则自动创建zip文件。接下来,在lambda资源的source_code_hash属性中引用了archive_file数据。

archive_file数据源

data "archive_file" "lambda_zip" {
  type        = "zip"
  output_path = "${path.module}/files/zips/lambda.zip"

  source {
    content  = "${file("${path.module}/files/ebs_cleanup_lambda.py")}"
    filename = "lambda_function.py"
  }
}

lambda资源

resource "aws_lambda_function" "lambda_function" {
  filename         = "${path.module}/files/zips/lambda.zip"
  function_name    = "${format("%s-%s-%s-lambda-function", var.name, var.environment, var.function_name)}"
  role             = "${aws_iam_role.iam_for_lambda.arn}"
  handler          = "lambda_function.lambda_handler"
  source_code_hash = "${data.archive_file.lambda_zip.output_base64sha256}"
  runtime          = "${var.function_runtime}"
  timeout          = "${var.function_timeout}"
  memory_size      = "${var.function_memory}"

  environment {
    variables = {
      region      = "${var.region}"
      name        = "${var.name}"
      environment = "${var.environment}"
    }
  }

  vpc_config {
    subnet_ids         = ["${var.subnet_ids}"]
    security_group_ids = ["${aws_security_group.lambda_sg.id}"]
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接