【问题标题】:Terraform execute script before lambda creationTerraform 在创建 lambda 之前执行脚本
【发布时间】:2019-02-24 13:27:33
【问题描述】:

我有一个 terraform 配置,可以在 aws 上正确创建一个 lambda 函数,并提供一个 zip 文件。

我的问题是我总是必须先打包 lambda(为此我使用无服务器打包方法),所以我想在 terraform 创建 lambda 之前执行一个脚本来打包我的函数并将 zip 移动到正确的目录功能。

这可能吗?也许使用 null_resource 和 local-exec 的组合?

【问题讨论】:

    标签: aws-lambda terraform


    【解决方案1】:

    您已经提出了最佳答案:)

    当您将depends_on = ["null_resource.serverless_execution"] 添加到您的 lambda 资源时,您可以确保在上传 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

    【讨论】:

    • 如果您提供一个更有效的示例,这将是一个更好的答案。
    • 抱歉……现在好点了吗?
    • 谢谢@DJAlPee!我只是错过了“depends_on”选项
    【解决方案2】:

    答案已经给出,但我一直在寻找一种方法来即时安装 NPM 模块、压缩然后部署 Lambda 函数以及超时(如果您的 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"
        }
      }
    }
    

    【讨论】:

    • 这在 terraform v0.13.5 中仍然有效吗?我在运行计划和应用时遇到问题,创建的 zip 没有 node_module 文件夹。
    猜你喜欢
    • 2020-08-08
    • 2019-01-09
    • 2020-05-01
    • 2017-06-11
    • 2021-05-22
    • 2023-03-10
    • 2020-07-16
    • 2017-08-09
    • 1970-01-01
    相关资源
    最近更新 更多