【问题标题】:AWS SAM Deployment : Error fork/exec /var/task/myfunction : no such file or directory: PathErrorAWS SAM 部署:错误 fork/exec /var/task/myfunction:没有这样的文件或目录:PathError
【发布时间】:2020-04-04 18:42:57
【问题描述】:

我在 Golang 中开发了一组 Lambda 函数,并尝试使用 SAM 部署这些函数和 API 网关。

我在本地创建可执行文件,为每个 lambda 函数创建 zip 文件并将这些 zip 文件上传到 s3 存储桶。

我在 SAM 模板文件中给出了这个 S3 存储桶的引用。

我的 SAM 模板文件如下所示

myfunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: s3://<<my-bucket>>/bin/handlers/myfunction.zip
      Handler: myfunction
      Role: !GetAtt CFLambdaExecutionRole.Arn
      Events:
        Getcfdemoapi:
          Type: Api
          Properties:
            Path: /myfunction
            Method: get
        CreateCustomer:
          Type: Api
          Properties:
            Path: /myfunction
            Method: post
        UpdateCustomer:
          Type: Api
          Properties:
            Path: /customer
            Method: put
        DeleteCustomer:
          Type: Api
          Properties:
            Path: /myfunction
            Method: delete

部署成功。

我通过 API 网关调用了 lambda 函数。

我检查了 Cloud watch 日志并看到以下错误 -

错误 fork/exec /var/task/myfunction :没有这样的文件或目录: 路径错误

SAM模板有什么问题吗,与CodeUri和handler有关?

我正在 MacOS 上创建构建并使用以下命令进行构建 -

GOOS=linux GOARCH=amd64 go build

【问题讨论】:

  • myfunction.zip的结构是什么?
  • 你的问题可以添加功能代码吗?
  • 您能否将创建 ZIP 文件的步骤包括在内?还有里面的目录/文件?

标签: amazon-web-services aws-lambda aws-api-gateway aws-sam


【解决方案1】:

此特定错误可能是由许多问题引起的。我想到的三个是:

  1. 你的二进制文件不叫myfunction(你使用set Handler: myfunction,所以二进制文件必须命名为myfunction
  2. 二进制文件不在 ZIP 存档中
  3. 二进制文件位于 ZIP 存档中,但路径错误。

要解决此问题,您可以在包含 Lambda 函数代码的目录中运行以下命令。


第 1 步: 构建二进制文件并将名称显式设置为 myfunction

GOOS=linux GOARCH=amd64 go build -o myfunction

如果您不使用 -o 选项,二进制文件将以您正在构建的目录命名。因此,如果该目录本身未命名为 myfunction,则生成的二进制文件将具有错误的名称(请参阅可能的问题上面#1)。

第 2 步:创建 ZIP 存档

zip --junk-paths myfunction.zip myfunction

--junk-paths 选项将删除路径并将二进制文件放在 ZIP 存档的“根目录”中。 man page 说:

只存储已保存文件的名称(垃圾路径),不要存储目录名称。默认情况下,zip 将存储完整路径(相对于当前目录)。

这是为了避免上面列出的问题 #3。

要检查这是否按预期工作,您可以运行以下命令:

unzip -l myfunction.zip

这应该显示如下:

Archive:  myfunction.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
  2142872  12-01-2020 19:19   myfunction
---------                     -------
  2142872                     1 file

第 3 步: 将 ZIP 存档上传到 S3

要将 ZIP 存档上传到 S3,我建议您使用 AWS CLI。 AWS 控制台也可以工作。

使用 AWS CLI,您可以运行以下命令:

aws s3 cp myfunction.zip s3://<<my-bucket>>/bin/handlers/myfunction.zip

cp 命令的文档可在此处找到:cp documentation

【讨论】:

    猜你喜欢
    • 2022-01-08
    • 2020-01-27
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2022-06-11
    相关资源
    最近更新 更多