基于镜像的Go语言Lambda函数启动报错:权限被拒绝
解决Lambda容器镜像
Permission denied报错问题 问题根源
你的报错/bin/sh: ./lambda-handler: Permission denied主要来自两个核心问题:
- 编译生成的Go二进制文件缺少执行权限
- Go编译时未生成静态二进制,导致Lambda的provided.al2最小化环境无法加载依赖库
修复方案
修改Dockerfile并调整Go编译参数,以下是修正后的完整配置:
FROM public.ecr.aws/docker/library/golang:1.19 as build-image WORKDIR /src COPY go.mod go.sum main.go ./ # 静态编译Go二进制,脱离系统库依赖 RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o lambda-handler FROM public.ecr.aws/lambda/provided:al2 COPY --from=build-image /src/lambda-handler . # 明确赋予执行权限,覆盖Lambda运行用户的权限需求 RUN chmod 755 ./lambda-handler # 使用绝对路径作为ENTRYPOINT,避免工作目录解析问题 ENTRYPOINT ["/var/task/lambda-handler"]
关键修改说明
静态编译Go二进制:
Lambda的provided.al2是无依赖的最小化环境,没有预装Go运行时组件。添加CGO_ENABLED=0 GOOS=linux参数会强制生成静态链接的二进制文件,完全脱离系统库依赖,确保能在Lambda环境中运行。修正权限设置:
chmod 755直接赋予文件所有者读/写/执行权限,同时开放组和其他用户的读/执行权限,完全满足Lambda运行用户(非root)的执行要求。之前的o+rX仅开放了读权限和目录执行权限,并未赋予二进制文件本身执行权限。绝对路径ENTRYPOINT:
Lambda容器的默认工作目录为/var/task,使用绝对路径可以避免任何路径解析歧义,比相对路径更可靠。
验证步骤
- 重新执行
sam build构建镜像 - 部署后调用端点,或本地执行
sam local start-api测试,此时应正常返回Bye响应
内容的提问来源于stack exchange,提问作者Jared Zwick
相关产品推荐
相关产品推荐

