Я пытаюсь создать лямбда-функцию AWS с помощью terraform. Моя директория terraform выглядит как

  • терраформа
    • iam-политики
      • main.tf
    • лямбда
      • файлы /
      • main.tf
    • main.tf

Моя лямбда-функция хранится внутри /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, все работает нормально, но фактический код в лямбда-функции не меняется. Кроме того, если я удалю все файлы состояния терраформирования и применю их снова, новое изменение распространяется без каких-либо проблем.

Что могло быть причиной этого?

10
Manoj Acharya 19 Дек 2018 в 13:31

1 ответ

Лучший ответ

Вместо использования null_resource я использовал источник данных archive_file, который автоматически создает zip-файл при обнаружении новых изменений. Затем я взял ссылку из данных archive_file в атрибуте лямбда-ресурса source_code_hash.

источник данных 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"
  }
}

Лямбда-ресурс

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}"]
  }
}
6
Manoj Acharya 5 Фев 2019 в 06:44