Terraform лямбда source_code_hash обновление с тем же кодом - PullRequest
0 голосов
/ 05 октября 2018

У меня успешно установлена ​​AWS Lambda с Terraform:

resource "aws_lambda_function" "lambda" {
  filename                       = "dist/subscriber-lambda.zip"
  function_name                  = "test_get-code"
  role                           = <my_role>
  handler                        = "main.handler"
  timeout                        = 14
  reserved_concurrent_executions = 50
  memory_size                    = 128
  runtime                        = "python3.6"
  tags                           = <my map of tags>
  source_code_hash               = "${base64sha256(file("../modules/lambda/lambda-code/main.py"))}"
  kms_key_arn                    = <my_kms_arn>
  vpc_config {
    subnet_ids         = <my_list_of_private_subnets>
    security_group_ids = <my_list_of_security_groups>
  }
  environment {
    variables = {
      environment = "dev"
    }
  }
}

Теперь, когда я запускаю команду terraform plan, она говорит, что мой ресурс лямбды нужно обновить, потому что source_code_hash изменился, но яне обновлял лямбда-кодовую базу Python (версия которой находится в папке того же репо):

  ~ module.app.module.lambda.aws_lambda_function.lambda
  last_modified:                     "2018-10-05T07:10:35.323+0000" => <computed>
  source_code_hash:                  "jd6U44lfe4124vR0VtyGiz45HFzDHCH7+yTBjvr400s=" => "JJIv/AQoPvpGIg01Ze/YRsteErqR0S6JsqKDNShz1w78"

Я полагаю, это потому, что она сжимает мои источники Python каждый раз, и источник меняется.Как я могу избежать этого, если нет изменений в коде Python?Является ли моя гипотеза последовательной, если я не изменил кодовую базу Python (я имею в виду, почему тогда изменяется хэш)?

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Я собираюсь добавить свой ответ в отличие от предоставленного @ 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"))}".Но это все еще требует, чтобы я запустил тф дважды.

0 голосов
/ 05 октября 2018

Это потому, что вы хэшируете только main.py , но загружаете dist / subscriber-lambda.zip .Terraform сравнивает хеш с хешем, который он вычисляет при загрузке файла в лямбду.Поскольку хеширование выполняется для двух разных файлов, вы получаете разные хеш-коды.Попробуйте запустить хэш для того же файла, который загружается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...