Terraform 资源 AWS LAMBDA GO 错误:“fork/exec /var/task/main:没有这样的文件或目录”

Posted

技术标签:

【中文标题】Terraform 资源 AWS LAMBDA GO 错误:“fork/exec /var/task/main:没有这样的文件或目录”【英文标题】:Terraform resource AWS LAMBDA GO Error : "fork/exec /var/task/main: no such file or directory" 【发布时间】:2022-01-08 22:47:21 【问题描述】:

我有一个 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 的 sn-p 代码

 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 设置的。

【问题讨论】:

【参考方案1】:

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

该错误表示您的 lambda 压缩文件中的可执行文件未命名为 main

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

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

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

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

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

【讨论】:

没错,它奏效了。我更改了处理程序 =“ecr-sync”,它在我的 zip 中找到了该文件并且它工作正常。我不确定我们在处理程序中给出的名称是什么,因为我没有找到关于它的好文档。感谢您的见解。这很有帮助。

以上是关于Terraform 资源 AWS LAMBDA GO 错误:“fork/exec /var/task/main:没有这样的文件或目录”的主要内容,如果未能解决你的问题,请参考以下文章

Terraform 0.11:aws_lambda_function 中的条件 vpc_config

Terraform:如何在单个资源块中提供多个 lambda 函数 zip 文件

使用 terraform 部署多个 lambda 函数

从 API Gateway 获取 terraform 中 AWS lambda 的端点

如何使用 Terraform 将资源动态附加到内联策略?

如何使用 AWS Lambda 脚本通过 Terraform 部署 AWS 基础设施