尝试调用 Go AWS Lambda 函数时权限被拒绝



我创建了一个 AWS Lambda 函数,我正在使用 Webhook 调用 API 网关 下面是我用go build -o main.go构建的代码,因为我一直在阅读您必须指定扩展名。

package main
import (
"context"
"fmt"
"github.com/aws/aws-lambda-go/lambda"
)
func HandleRequest(ctx context.Context) (string, error) {
return fmt.Sprintf("Hello!"), nil
}
func main() {
lambda.Start(HandleRequest)
}

问题是,即使我对上传的 S3 函数.zip具有公有权限以及角色权限,我仍然收到权限错误。

{
"errorMessage": "fork/exec /var/task/main: permission denied",
"errorType": "PathError"
}

您正在尝试运行 go 源代码文件。 您需要运行二进制文件:

# Build the binary for your module
GOOS=linux go build main.go
# Package the binary, note we're packaging "main", not "main.go" here:
zip function.zip main
# And upload "function.zip" this package to Lambda

有关更多详细信息(包括在其他平台上运行此过程的说明(,请参阅 AWS Lambda 部署文档

此外,您需要在 zip 文件中设置可执行位。 有很多方法可以做到这一点,如果你想在Windows上做到这一点,你需要运行一个像这样的python脚本:

import zipfile
import time
def make_info(filename):
info = zipfile.ZipInfo(filename)
info.date_time = time.localtime()
info.external_attr = 0x81ed0000
info.create_system = 3
return info
zip_source = zipfile.ZipFile("source_file.zip")
zip_file = zipfile.ZipFile("dest_file.zip", "w", zipfile.ZIP_DEFLATED)
for cur in zip_source.infolist():
zip_file.writestr(make_info(cur.filename), zip_source.open(cur.filename).read(), zipfile.ZIP_DEFLATED)
zip_file.close()

这将需要source_file.zip,并将其重新打包为具有相同内容的dest_file.zip,但为所有文件设置了可执行位。

当我尝试在本地调用无服务器函数时,我遇到了同样的问题,我暂时禁用了 selinux 并调用了该函数并且它已成功运行。

我遇到了同样的问题,您必须确保二进制文件的名称与处理程序的名称相似。这应该已经是你的情况了:

$ unzip -l main.zip 
Archive:  main.zip
Length      Date    Time    Name
---------  ---------- -----   ----
21477357  11-13-2020 00:02   main

更棘手的是,您应该确保二进制文件具有正确的权限,正如Anon Coward在评论中强调的那样:

$ ls -l bin/main 
-rwxrwxr-x 1 root root 19325838 nov.  12 03:23 bin/main

这应该使您的二进制文件可执行。

就我而言,我无法chmod 755二进制文件,因为我在 VM 中装载的共享文件夹下的 Ubuntu VM 中工作,所以我最终得到了这些perms,我无法更改它们:

$ ls -l bin/main 
-rwxrwx--- 1 root vboxsf 19325838 Nov 12 02:23 bin/main

如果有人有答案,我很想知道为什么我无法更改 vm 内文件的组和烫发。

最新更新