You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于镜像的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"]

关键修改说明

  1. 静态编译Go二进制:
    Lambda的provided.al2是无依赖的最小化环境,没有预装Go运行时组件。添加CGO_ENABLED=0 GOOS=linux参数会强制生成静态链接的二进制文件,完全脱离系统库依赖,确保能在Lambda环境中运行。

  2. 修正权限设置:
    chmod 755直接赋予文件所有者读/写/执行权限,同时开放组和其他用户的读/执行权限,完全满足Lambda运行用户(非root)的执行要求。之前的o+rX仅开放了读权限和目录执行权限,并未赋予二进制文件本身执行权限。

  3. 绝对路径ENTRYPOINT:
    Lambda容器的默认工作目录为/var/task,使用绝对路径可以避免任何路径解析歧义,比相对路径更可靠。

验证步骤

  1. 重新执行sam build构建镜像
  2. 部署后调用端点,或本地执行sam local start-api测试,此时应正常返回Bye响应

内容的提问来源于stack exchange,提问作者Jared Zwick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 19:27:58