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}"
.......
.......
}
Работал на меня. С наилучшими пожеланиями.