0

我有一个 go 脚本,我正在使用运行时配置制作 Terraform 资源 aws_lambda_function:

  handler     = "main"
  memory_size = 512
  timeout     = 360
  runtime     = "go1.x"

在我的 go 代码中,我已经导入了模块:

"github.com/aws/aws-lambda-go/lambda"
"github.com/aws/aws-lambda-go/events"

以及 ecr-sync.go 的一段代码

 func main() {
        lambda.Start(HandleRequest)
    }
    
    func HandleRequest(ctx context.Context, event event.HandleRequest)(string,error) {
      return string(body),err
}

已部署 lambda 函数,但在测试该函数时,它会引发以下错误:

{
  "errorMessage": "fork/exec /var/task/main: no such file or directory",
  "errorType": "PathError"
}

有谁知道如何解决这个问题?我看到这篇文章https://github.com/serverless/serverless/issues/4710但我不确定如何通过管道设置构建配置,因为运行时配置是通过 terraform 设置的。

4

1 回答 1

1

“fork/exec /var/task/main:没有这样的文件或目录”

该错误意味着您的 lambda 压缩文件中的可执行文件未命名为main.

在 Go API for Lambda 中,处理程序必须在main包中,并且必须在main()函数中调用,就像您的一样。包名和函数名都不需要在任何地方设置。资源中的handler设置是指上传的 zip 文件中的可执行文件的文件名。

从错误中,很明显您的 zipfile 没有main. (/var/task来自 lambda 端的内部设置)。

已部署 lambda 函数,但在测试该函数时,它会引发以下错误:

是的,部署函数不会验证其处理程序配置是否与其 zipfile 匹配。该错误发生在运行时。包含扩展名的文件名无关紧要,但必须与您在 lambda 配置中指定的处理程序匹配。

要修复错误,请检查您的 zip 文件,并更新处理程序以指向可执行文件。请记住,必须编译 Go lambdas 并且必须在 zipfile 中提供可执行文件 - 与 Python 的 Javascript 等解释型语言不同,源代码不包含在 zipfile 中。

于 2021-12-02T15:00:26.417 回答