Terraform не загружает новый ZIP - PullRequest
0 голосов
/ 20 декабря 2018

Я хочу использовать Terraform для развертывания моих лямбда-функций.Я сделал что-то вроде:

provider "aws" {
    region = "ap-southeast-1"
}

data "archive_file" "lambda_zip" {
    type = "zip"
    source_dir = "src"
    output_path = "build/lambdas.zip"
}

resource "aws_lambda_function" "test_terraform_function" {
    filename = "build/lambdas.zip"
    function_name = "test_terraform_function"
    handler = "test.handler"
    runtime = "nodejs8.10"
    role = "arn:aws:iam::000000000:role/xxx-lambda-basic"
    memory_size = 128
    timeout = 5
    source_code_hash = "${data.archive_file.lambda_zip.output_base64sha256}"
    tags = {
        "Cost Center" = "Consulting"
        Developer = "Jiew Meng"
    }
}

Я обнаружил, что когда нет изменений в test.js, terraform правильно обнаруживает отсутствие изменений

No changes. Infrastructure is up-to-date.

Когда я изменяю файл test.jsterraform обнаруживает изменение:

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  ~ update in-place

Terraform will perform the following actions:

  ~ aws_lambda_function.test_terraform_function
      last_modified:    "2018-12-20T07:47:16.888+0000" => <computed>
      source_code_hash: "KpnhsytFF0yul6iESDCXiD2jl/LI9dv56SIJnwEi/hY=" => "JWIYsT8SszUjKEe1aVDY/ZWBVfrZYhhb1GrJL26rYdI="

Зиппает новый zip-архив, однако не обновляет функцию новым ZIP-архивом.Кажется, что он думает, так как имя файла не меняется, оно не загружается ... Как я могу исправить это поведение?

=====

Следуя некоторым ответам здесь, я попытался:

  • Использование null_resource
  • Использование S3 bucket /объект с etag

и он не обновляется ... Почему это так?

Ответы [ 4 ]

0 голосов
/ 23 декабря 2018

Вам необходимо позаботиться о двух вещах:

  • загрузить zip-файл на S3, если его содержимое изменилось
  • обновить функцию Lambda, если содержимое zip-файла изменилось

Я вижу, что вы заботитесь о последнем с source_code_hash.Я не понимаю, как вы справляетесь с первым.Это может выглядеть так:

resource "aws_s3_bucket_object" "zip" {
  bucket               = "${aws_s3_bucket.zip.bucket}"
  key                  = "myzip.zip"
  source               = "${path.module}/myzip.zip"
  etag                 = "${md5(file("${path.module}/myzip.zip"))}"
}

etag является наиболее важным вариантом здесь.

0 голосов
/ 20 декабря 2018

Я столкнулся с той же проблемой, и я решил, что она автоматически публикует функции Lambda с помощью аргумента publish .Для этого просто установите publish = true в вашем aws_lambda_function ресурсе.

Обратите внимание, что ваша функция будет версионирована после этого, и каждое изменение будет создавать новую.Поэтому вам следует убедиться, что вы используете ссылку на атрибут qualified_arn, если вы ссылаетесь на функцию в любом другом коде Terraform.

0 голосов
/ 20 декабря 2018

Я создал этот модуль, чтобы облегчить некоторые проблемы, связанные с развертыванием Lambda с Terraform: https://registry.terraform.io/modules/rojopolis/lambda-python-archive/aws/0.1.4

Это может быть полезно в этом сценарии.По сути, он заменяет источник данных «archive_file» специализированным лямбда-источником архивных данных, чтобы лучше управлять стабильным хэшем исходного кода и т. Д.

0 голосов
/ 20 декабря 2018

Существует обходной путь для обновления ресурса, если имена целевых лямбда-файлов равны src/main.py и src/handler.py.Если вам нужно управлять несколькими файлами, добавьте их один за другим.

resource "null_resource" "lambda" {
  triggers {
    main    = "${base64sha256(file("src/main.py"))}"
    handler = "${base64sha256(file("src/handler.py"))}"
  }
}

data "archive_file" "lambda_zip" {
  type        = "zip"
  source_dir  = "src"
  output_path = "build/lambdas.zip"

  depends_on = ["null_resource.lambda"]
}

Дайте мне знать, если это работает для вас.

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