代码之家  ›  专栏  ›  技术社区  ›  ibrahim jamil

带有terraform的go-aws lambda中出现exec格式错误

  •  1
  • ibrahim jamil  · 技术社区  · 2 年前

    实际上,在使用terraform调用golang lambda时,我遇到了一个非常罕见的问题。因此,基本上,我使用像lambda这样的地形来部署我的所有资源,使用golang的api网关。问题是,当我使用terraform将我的golang lambda二进制.zip文件部署到lambda时,在用route检查请求时,它返回exec格式错误。terraform的所有代码都很好,当我测试简单的js lambda函数时,格式化也很好。我想这是二进制体系结构的问题,但我使用的二进制arch与aws上使用的lambda相同。如果有人能帮忙的话,我也会使用provide.al2来解决exec格式错误的问题。

    一些调试信息

    1-目录结构

    - infra
      -- helloGO
           -- main.go
           -- main // binary file
      -- terraform
           -- main.tf
      -- hello.zip // with main binary file
    
    

    2-地形lambda函数资源

    resource "aws_lambda_function" "hello" {
      function_name = "hello"
      filename         = "../hello.zip" // taking filename from root ./hello.zip
    
      runtime = "go1.x" # nodejs16.x go1.x
      handler = "main"  # function.handler
      role = aws_iam_role.hello_lambda_exec.arn
      timeout = 3
    }
    
    

    3-构建命令

    buildGO: cleanGO
        GOOS=linux GOARCH=amd64 CGO_ENABLED=0 cd ./helloGo/ && go build -o ./ main.go
        cd ./helloGo/ && chmod +x main
        cd ./helloGo/ && zip ../hello.zip main
    

    这将创建构建文件main和包,并将其作为main.zip根目录,以供lambda地形文件使用。 (amd64可执行x86_64)

    我尝试过提供的解决方案,比如用amd64构建,但不知道它lambda调用go说二进制文件不能用这个可执行文件执行

    1 回复  |  直到 2 年前
        1
  •  1
  •   erik258    2 年前

    我想这是二进制体系结构的问题,但我使用的二进制arch与aws上使用的lambda相同

    你有正确的环境设置,但你为错误的命令设置了它们。

    GOOS=linux GOARCH=amd64 CGO_ENABLED=0 cd ./helloGo/ && go build -o ./ main.go
    

    该行设置GOOS、GOARCH和CGO_ENABLED cd 命令,不适用 go build

    试试这个:

    cd ./helloGo/ && GOOS=linux GOARCH=amd64 CGO_ENABLED=0  go build -o ./ main.go
    
    推荐文章