Terraform: Почему эта попытка связать ресурсы не работает? - PullRequest
0 голосов
/ 10 января 2019

Загрузка AWS Lambda требует создания zip-архива с необходимым исходным кодом и библиотеками. Для использования NodeJS в качестве языка для Lambda более типично случай, когда вы хотите, чтобы исходный файл и каталог node_modules были включены в zip-архив. Поставщик архива Terraform предоставляет ресурс file_archive, который хорошо работает, когда его можно использовать. Его нельзя использовать, если вам нужно больше, чем 1 файл или 1 каталог. См. запрос функции . Чтобы обойти это, я придумал этот код ниже. Он выполняет шаги, но не в требуемой последовательности. Запустите его один раз, и он обновит zip-файл, но не загружает его в AWS. Я запускаю его снова и загружаю в AWS.

# This resource checks the state of the node_modules directory, hoping to determine,
# most of the time, when there was a change in that directory. Output
# is a 'mark' file with that data in it. That file can be hashed to
# trigger updates to zip file creation.
resource "null_resource" "get_directory_mark" {
    provisioner "local-exec" {
        command     = "ls -l node_modules > node_modules.mark; find node_modules -type d -ls >> node_modules.mark"
        interpreter = ["bash", "-lc"]
    }

    triggers = {
        always = "${timestamp()}" # will trigger each run - small cost.
    }
}

resource "null_resource" "make_zip" {
    depends_on = ["null_resource.get_directory_mark"]

    provisioner "local-exec" {
        command     = "zip -r ${var.lambda_zip} ${var.lambda_function_name}.js node_modules"
        interpreter = ["bash", "-lc"]
    }

    triggers = {
        source_hash  = "${sha1("${file("lambda_process_firewall_updates.js")}")}"
        node_modules = "${sha1("${file("node_modules.mark")}")}"                  # see above
    }
}

resource "aws_lambda_function" "lambda_process" {
    depends_on       = ["null_resource.make_zip"]
    filename         = "${var.lambda_zip}"
    function_name    = "${var.lambda_function_name}"
    description      = "process items"
    role             = "${aws_iam_role.lambda_process.arn}"
    handler          = "${var.lambda_function_name}.handler"
    runtime          = "nodejs8.10"
    memory_size      = "128"
    timeout          = "60"
    source_code_hash = "${base64sha256(file("lambda_process.zip"))}"
}

Другие связанные обсуждения включают в себя: этот вопрос о хешировании кода , (см. Мой ответ) и эту проблему GitHub .

...