簡體   English   中英

將 terraform 與 localstack 一起使用時,如何安裝 lambda 代碼?

[英]How can I mount lambda code when using terraform with localstack?

TLDR

How can I configure my provider in terraform so that it is using docker to mount code and the correct function directory to execute lambda functions?

我正在嘗試運行一個簡單的 lambda function 來監聽 dynamodb stream 事件。 我的代碼本身工作正常,但我遇到的問題是使用 terraform 時,function 執行程序找不到要運行的 function。 為了調試,我在我的 localstack 容器DEBUG=true中設置了以下環境變量。 我首先使用無服務器框架測試了我的代碼,它按預期工作。

來自 serverless 的成功 function 執行日志顯示:

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

Terraform:問題

但是從 terramform 運行時,似乎找不到 function 並且失敗並顯示以下日志:

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 執行程序安裝的路徑不同。 在無服務器的情況下,它指向正確的文件夾進行卷掛載; /Users/myuser/functions而在 terraform 中,它正在掛載/tmp//zipfile.somevalue ,這似乎是問題的根源。

在我的無服務器配置文件中,lambda mountcode 設置為 true,這讓我相信這就是它正確安裝和執行的原因。

lambda:
      mountCode: True

So my question is, what can I do in terraform so that the uploaded function actually gets executed by the docker container, or tell terraform to mount the correct directory so that it can find the function? 我的 terraform lambda function 定義是:

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
}

PS其他一些嘗試過的是

  • 將 terraform 中的處理程序設置為bin/handler以模仿無服務器

想通了這個問題。 使用 terraform 時,存儲函數的 s3 桶沒有定義,所以這兩個必須在 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_key是函數的絕對路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM