amazon-web-services - AWS SAM 部署:错误 fork/exec /var/task/myfunction:没有这样的文件或目录:PathError
问题描述
我在 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:没有这样的文件或目录:PathError
SAM 模板中是否有与 CodeUri 和处理程序相关的问题?
我正在 MacOS 上创建构建并使用以下命令进行构建 -
GOOS=linux GOARCH=amd64 go build
解决方案
此特定错误可能是由许多问题引起的。我想到的三个是:
- 你的二进制文件没有被调用
myfunction
(你使用 setHandler: myfunction
因此,二进制文件必须被命名myfunction
) - 二进制文件不在 ZIP 存档中
- 二进制文件在 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 存档的“根”中。手册页说:
仅存储已保存文件的名称(垃圾路径),不要存储目录名称。默认情况下, 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 文档。
推荐阅读
- c++ - 根据 c++ 头文件和 cmake 命令分配输出名称
- git - 即使在提交/推送之后也无法摆脱“要提交的更改”消息
- input - 在 Godot 3.2.3 中由鼠标或游戏手柄操纵杆移动引起的单个按钮按下时的多个 input.event 触发器
- javascript - Discord.js 嵌入倒计时
- android - Firebase 身份验证仅在关闭并重新打开应用程序后有效
- javascript - 如何在不更改 var 参数的情况下选择所有复选框
- android - 如何制作充电电池模拟器(Android)?
- javascript - 在 js 按钮中附加 css 内联样式以进行悬停
- ansible - 阅读 ansible 字典以创建 ansible 事实
- python - 需要帮助理解python中的类继承