Terraform中的相对路径

时间:2018-12-19 10:31:57

标签: amazon-web-services aws-lambda terraform terraform-provider-aws

我正在尝试使用terraform创建一个AWS lambda函数。 我的terraform目录看起来像

  • 地形
    • 国际政策
      • main.tf
    • lambda
      • 文件/
      • main.tf
    • main.tf

我的lambda函数存储在 /terraform/lambda/files/lambda_function.py 中。

每当我进行地形应用时,我都会有一个“ 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状态文件并再次应用,则新更改将毫无问题地传播。

这可能是什么原因?

1 个答案:

答案 0 :(得分:2)

我使用inline bool good_string(const char* a) { return true; } inline bool good_strings(const char* a, const char* b) { return good_string(a) && good_string(b); } inline bool good_strings(const char* a, const char* b, const char* c) { return good_strings(a, b) && good_string(c); } inline bool good_strings(const char* a, const char* b, const char* c, const char* d) { return good_strings(a, b, c) && good_string(d); } inline bool good_strings(const char* a, const char* b, const char* c, const char* d, const char* e) { return good_strings(a ,b, c, d) && good_string(e); } 数据源来代替null_resource,如果检测到新更改,该数据源会自动创建zip文件。接下来,我从lambda资源archive_file属性中的archive_file数据中获取了一个引用。

存档文件数据源

source_code_hash

lambda资源

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"
  }
}