首页 > 解决方案 > 尝试调用 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"
}

标签: amazon-web-servicesgoamazon-s3aws-lambda

解决方案


您正在尝试运行 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 部署文档

此外,您需要在 zipfile 中设置可执行位。有很多方法可以做到这一点,如果你想在 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,但为所有文件设置可执行位。


推荐阅读