terraform не обнаруживает изменений в исходных лямбда-файлах

В моем main.tf У меня есть следующее:

data "template_file" "lambda_script_temp_file" {
  template = "${file("../../../fn/lambda_script.py")}"
}

data "template_file" "library_temp_file" {
  template = "${file("../../../library.py")}"
}

data "template_file" "init_temp_file" {
  template = "${file("../../../__init__.py")}"
}

data "archive_file" "lambda_resources_zip" {
  type        = "zip"
  output_path = "${path.module}/lambda_resources.zip"

  source {
    content   = "${data.template_file.lambda_script_temp_file.rendered}"
    filename  = "lambda_script.py"
  }

  source {
    content   = "${data.template_file.library_temp_file.rendered}"
    filename  = "library.py"
  }

  source {
    content   = "${data.template_file.init_temp_file.rendered}"
    filename  = "__init__.py"
  }
}

resource "aws_lambda_function" "MyLambdaFunction" {
  filename          = "${data.archive_file.lambda_resources_zip.output_path}"
  function_name     = "awesome_lambda"
  role              = "${var.my_role_arn}"
  handler           = "lambda_script.lambda_handler"
  runtime           = "python3.6"
  timeout           = "300"
}

Проблема в том, когда я изменяю один из исходных файлов, скажем lambda_script.pyпо новой terraform applyхотя файл архива (lambda_resources_zip) обновляется, скрипт лямбда-функции не обновляется (новый архивный файл не загружается).

Я знаю, что, чтобы избежать этого, я мог бы сначала запустить terraform destroy но это не вариант для моего варианта использования.

* Я использую Terraform v0.11.10

2 ответа

Решение

Я решил проблему, добавив следующую строку в определение ресурса:

source_code_hash  = "${data.archive_file.lambda_resources_zip.output_base64sha256}"

при изменении исходных файлов значение хэширования изменится и инициирует обновление исходного файла.

Это сработало для меня -

  • добавить эту строку
      source_hash     = "${data.archive_file.source.output_base64sha256}"

кs3 lambda bucketэто скажет, если какие-либо изменения были сделаны.

  • затем добавьте это в лямбда -
      source_code_hash = "${data.archive_file.source.output_base64sha256}"

Итак, ваш код должен выглядеть так:

      resource "aws_s3_object" "lambda_object" {
  source_hash     = "${data.archive_file.source.output_base64sha256}"
  bucket          = "${aws_s3_bucket.s3.bucket}"
  key             = "${var.key}"
  source          = data.archive_file.source.output_path
}

resource "aws_lambda_function" "lambda_" {
  function_name   = "lambda_name"
  source_code_hash = "${data.archive_file.source.output_base64sha256}"
  .......
  .......
}

Работал на меня. С наилучшими пожеланиями.

Другие вопросы по тегам