Docker 在使用terraform和localstack时,如何装载lambda代码? 太长,读不下去了

Docker 在使用terraform和localstack时,如何装载lambda代码? 太长,读不下去了,docker,lambda,terraform,localstack,Docker,Lambda,Terraform,Localstack,如何在terraform中配置我的提供程序,使其使用docker装载代码,并使用正确的函数目录执行lambda函数 我正在尝试运行一个简单的lambda函数来侦听dynamodb流事件。我的代码本身工作正常,但我遇到的问题是,在使用terraform时,函数执行器找不到要运行的函数。为了调试,我在localstack容器中设置了以下envardebug=true。我首先使用无服务器框架测试了我的代码,该框架按预期工作 来自serverless的成功函数执行日志显示: localstack

如何在terraform中配置我的提供程序,使其使用docker装载代码,并使用正确的函数目录执行lambda函数

我正在尝试运行一个简单的lambda函数来侦听dynamodb流事件。我的代码本身工作正常,但我遇到的问题是,在使用terraform时,函数执行器找不到要运行的函数。为了调试,我在localstack容器中设置了以下envar
debug=true
。我首先使用无服务器框架测试了我的代码,该框架按预期工作

来自serverless的成功函数执行日志显示:

localstack    | 2021-03-17T13:14:53:INFO:localstack.services.awslambda.lambda_executors: Running lambda cmd: docker run -i  -v "/Users/myuser/functions":/var/task -e AWS_REGION="$AWS_REGION" -e DOCKER_LAMBDA_USE_STDIN="$DOCKER_LAMBDA_USE_STDIN" -e LOCALSTACK_HOSTNAME="$LOCALSTACK_HOSTNAME" -e EDGE_PORT="$EDGE_PORT" -e _HANDLER="$_HANDLER" -e AWS_LAMBDA_FUNCTION_TIMEOUT="$AWS_LAMBDA_FUNCTION_TIMEOUT" -e AWS_LAMBDA_FUNCTION_NAME="$AWS_LAMBDA_FUNCTION_NAME" -e AWS_LAMBDA_FUNCTION_VERSION="$AWS_LAMBDA_FUNCTION_VERSION" -eAWS_LAMBDA_FUNCTION_INVOKED_ARN="$AWS_LAMBDA_FUNCTION_INVOKED_ARN" -e AWS_LAMBDA_COGNITO_IDENTITY="$AWS_LAMBDA_COGNITO_IDENTITY"   --rm "lambci/lambda:go1.x" "bin/dbchanges"
localstack    | 2021-03-17T13:14:54:DEBUG:localstack.services.awslambda.lambda_executors: Lambda arn:aws:lambda:us-east-1:000000000000:function:myService-local-dbchanges result / log output:
localstack    | null
地形:问题 但从terramform运行时,似乎找不到该函数,并出现以下日志失败:

localstack    | 2021-03-17T13:30:32:INFO:localstack.services.awslambda.lambda_executors: Running lambda cmd: docker run -i  -v "/tmp//zipfile.717163a0":/var/task -e AWS_REGION="$AWS_REGION" -e DOCKER_LAMBDA_USE_STDIN="$DOCKER_LAMBDA_USE_STDIN" -e LOCALSTACK_HOSTNAME="$LOCALSTACK_HOSTNAME" -e EDGE_PORT="$EDGE_PORT" -e _HANDLER="$_HANDLER" -e AWS_LAMBDA_FUNCTION_TIMEOUT="$AWS_LAMBDA_FUNCTION_TIMEOUT" -e AWS_LAMBDA_FUNCTION_NAME="$AWS_LAMBDA_FUNCTION_NAME" -e AWS_LAMBDA_FUNCTION_VERSION="$AWS_LAMBDA_FUNCTION_VERSION" -e AWS_LAMBDA_FUNCTION_INVOKED_ARN="$AWS_LAMBDA_FUNCTION_INVOKED_ARN" -e AWS_LAMBDA_COGNITO_IDENTITY="$AWS_LAMBDA_COGNITO_IDENTITY"   --rm "lambci/lambda:go1.x" "dbchanges"
localstack    | 2021-03-17T13:30:33:DEBUG:localstack.services.awslambda.lambda_executors: Lambda arn:aws:lambda:us-east-1:000000000000:function:dbchanges result / log output:
localstack    | {"errorType":"exitError","errorMessage":"RequestId: 4f3cfd0a-7905-12e2-7d4e-049bd2c1a1ac Error: fork/exec /var/task/dbchanges: no such file or directory"}
在检查了两个日志集之后,我注意到terraform+localstack docker executor装载的路径不同。在无服务器的情况下,它指向卷装载的正确文件夹;i、 e.
/Users/myuser/functions
在terraform中,它正在装载
/tmp//zipfile.somevalue
,这似乎是问题的根源

在我的无服务器配置文件中,lambda mountcode被设置为true,这使我相信这就是它正确装载和执行的原因

lambda:
      mountCode: True
所以我的问题是,我可以在terraform中做些什么,让docker容器实际执行上传的函数,或者告诉terraform装载正确的目录,以便它可以找到函数?我的terraform lambda函数定义为:

data "archive_file" "dbchangeszip" {
  type        = "zip"
  source_file = "../bin/dbchanges"
  output_path = "./zips/dbchanges.zip"
}

resource "aws_lambda_function" "dbchanges" {
  description      = "Function to capture dynamodb change"
  runtime          = var.runtime
  timeout          = var.timeout
  memory_size      = var.memory
  role             = aws_iam_role.lambda_role.arn
  handler          = "dbchanges"
  filename         = "./zips/dbchanges.zip"
  function_name    = "dbchanges"
  source_code_hash = data.archive_file.dbchangeszip.output_base64sha256
}
另外,还有一些其他的尝试

  • 将terraform中的处理程序设置为
    bin/handler
    以模拟无服务器

    • 解决了这个问题。当使用terraform时,存储的函数的s3 bucket没有定义,因此必须在terraform的资源定义中设置这两个

      例如:

      resource "aws_lambda_function" "dbchanges" {
        s3_bucket = "__local__"
        s3_key = "/Users/myuser/functions/"
        role             = aws_iam_role.lambda_role.arn
        handler          = "bin/dbchanges"
        # filename         = "./zips/dbchanges.zip"
        function_name    = "dbchanges"
        source_code_hash = data.archive_file.dbchangeszip.output_base64sha256
      }
      
      这两个重要的价值观是:

        s3_bucket = "__local__"
        s3_key = "/Users/myuser/functions/"
      
      其中,
      s3\u键
      是功能的绝对路径