Я собираюсь добавить свой ответ в отличие от предоставленного @ ODYN-Kon.
Поле хеша исходного кода в ресурсе "aws_lambda_function" не сравнивается с каким-то хешем загружаемого zip-файла.Вместо этого хэш просто проверяется на соответствие сохраненному состоянию Terraform с момента последнего запуска.Итак, в следующий раз, когда вы запустите Terraform, он вычисляет хеш фактического файла python, чтобы увидеть, изменился ли он.Если это так, предполагается, что zip был изменен, и ресурс функции Lambda необходимо запустить снова.Source_code_hash может иметь любое значение, которое вы хотите ему дать, или оно может быть полностью опущено.Вы можете установить для нее постоянную некоторой произвольной строки, и тогда она никогда не изменится, если вы не отредактируете свою конфигурацию Terraform.
Теперь проблема в том, что Terraform предполагает, что вы обновили zip-файл.Предполагая, что у вас есть только один каталог или один файл в zip-архиве, вы можете использовать источник данных Terraform archive_file для создания zip-файла.У меня есть случай, когда я не могу использовать это, потому что мне нужны каталог и файл (JS world: source + node_modules /).Но вот как вы можете использовать это:
data "archive_file" "lambdaCode" {
type = "zip"
source_file = "lambda_process_firewall_updates.js"
output_path = "${var.lambda_zip}"
}
Альтернативно, вы можете заархивировать весь каталог, если вы замените инструкцию "source_file" на source_dir = "node_modules"
Как только вы это сделаете,Вы можете ссылаться на хеш-код файла zip-архива для вставки в блок resource "aws_lambda_function" "lambda" {
как "${data.archive_file.lambdaCode.output_base64sha256}"
для поля source_hash.Затем, каждый раз, когда изменяется zip, функция lambda обновляется.И файл архива источника данных знает, что каждый раз, когда файл_источника изменяется, он должен восстановить zip.
Так вот, я не стал разбираться с основной причиной в вашем случае, но, надеюсь, мне помогли добраться до лучшего места.Вы можете проверить сохраненное состояние Terraform через: tf state list
- в котором перечислены элементы сохраненного состояния.Вы можете найти тот, который соответствует вашему лямбда-функциональному блоку, а затем выполнить tf state show <state-name>
.Например, для одного, над которым я работаю:
tf state show aws_lambda_function.test-lambda-networking
дает около 30 строк вывода, в том числе:
source_code_hash = 2fKX9v / duluQF0H6O9 + iRnID2gokhfpXIXpxyeVBUM0 =
Вы можете сравнить хеш с помощью команд командной строки.Пример на MacOS: sha256sum my-lambda.zip
, где sha256sum был установлен brew install coreutils
.
Как уже упоминалось, использование archive_file не работает, если у вас есть несколько элементов zip, которые не изолированы в одном каталоге,Я думаю, что это часто случается, поэтому я бы хотел, чтобы ребята из Hashicorp расширили archive_file для поддержки нескольких.Я даже пошел смотреть код Go, но это проект дождливого дня.Один из вариантов, который я использую, - принять source_code_hash равным "${base64sha256(file("my-lambda.zip"))}"
.Но это все еще требует, чтобы я запустил тф дважды.