代码之家  ›  专栏  ›  技术社区  ›  Manoj Acharya

地形中的相对路径

  •  2
  • Manoj Acharya  · 技术社区  · 7 年前

    我正在尝试使用terraform创建AWS lambda函数。

    • 地球化
        • main.tf
        • 档案/
        • main.tf
      • main.tf

    /terraform/lambda/files/lambda_function.py .

    每当我应用terraform时,我都有一个“null_资源”,它在本地机器中执行一些命令,这些命令将压缩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_函数”资源如下所示。

    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函数中的实际代码不会更改。 此外,如果我删除所有地形状态文件并再次应用,新的更改将毫无问题地传播。

    可能的原因是什么?

    1 回复  |  直到 7 年前
        1
  •  7
  •   Manoj Acharya    7 年前

    而不是使用 null_resource ,我用了 archive_file 检测到新更改时自动创建zip文件的数据源。接下来,我从lambda资源中的归档文件数据中获取了一个引用 source_code_hash 属性

    归档文件数据源

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