Сценарий выполнения Terraform перед созданием лямбды - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть конфигурация terraform, которая правильно создает лямбда-функцию на aws с предоставленным zip-файлом.

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

Возможно ли это?Может быть, используя комбинацию null_resource и local-exec?

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Ответ уже дан, но я искал способ установить модули NPM на лету, zip, а затем развернуть функцию Lambda вместе с тайм-аутом, если размер вашей функции лямбда большой.Так что вот мой вывод может помочь кому-то еще.

#Install NPM module before creating ZIP

resource "null_resource" "npm" {
  provisioner "local-exec" {
    command = "cd ../lambda-functions/loadbalancer-to-es/ && npm install --prod=only"
  }
}

# Zip the Lamda function on the fly
data "archive_file" "source" {
  type        = "zip"
  source_dir  = "../lambda-functions/loadbalancer-to-es"
  output_path = "../lambda-functions/loadbalancer-to-es.zip"
  depends_on  = ["null_resource.npm"]
}


# Created AWS Lamdba Function: Memory Size, NodeJS version, handler, endpoint, doctype and environment settings
resource "aws_lambda_function" "elb_logs_to_elasticsearch" {
  filename      = "${data.archive_file.source.output_path}"
  function_name = "someprefix-alb-logs-to-elk"
  description   = "elb-logs-to-elasticsearch"
  memory_size   = 1024
  timeout       = 900
  timeouts {
  create = "30m"
  }
  runtime          = "nodejs8.10"
  role             = "${aws_iam_role.role.arn}"
  source_code_hash = "${base64sha256(data.archive_file.source.output_path)}"
  handler          = "index.handler"
  #  source_code_hash = "${base64sha256(file("/elb-logs-to-elasticsearch.zip"))}"


  environment {
    variables = {
      ELK_ENDPOINT = "someprefix-elk.dns.co"
      ELK_INDEX    = "test-web-server-"
      ELK_REGION   = "us-west-2"
      ELK_DOCKTYPE = "elb-access-logs"
    }
  }
}
0 голосов
/ 20 сентября 2018

Вы уже предложили лучший ответ:)

Когда вы добавляете depends_on = ["null_resource.serverless_execution"] к своему лямбда-ресурсу, вы можете убедиться, что упаковка будет выполнена до загрузки zip-файла.

Пример:

resource "null_resource" "serverless_execution" {
  provisioner "local-exec" {
    command = "serverless package ..."
  }
}

resource "aws_lambda_function" "update_lambda" {
  depends_on = ["null_resource.serverless_execution"]
  filename   = "${path.module}/path/to/package.zip"
  [...]
}

https://www.terraform.io/docs/provisioners/local-exec.html

...