AWS Lambda容器报Runtime exited无原因错误但退出码0问题咨询
AWS Lambda容器报
Error: Runtime exited without providing a reason解决方案 错误根因
你使用的自定义容器未适配AWS Lambda的运行时规范:Lambda要求所有自定义容器镜像必须实现Lambda运行时API,用于和Lambda服务端交互,接收调用事件、上报执行结果。你当前的Dockerfile直接将备份命令作为CMD执行,脚本运行完成后直接退出进程,没有向Lambda服务端发送任务完成的信号,因此哪怕备份逻辑本身执行成功(文件正常上传S3、进程退出码为0),Lambda仍会判定运行时异常退出,抛出对应报错。
另外你的Dockerfile存在一个笔误:WORKDIR ${WORKSD}} 多写了一个右大括号,建议修正。
修复方案
这里提供两种可行的改造方式,可根据需求选择:
方案1:使用Lambda官方基础镜像改造(推荐,改造成本最低)
Lambda官方提供了预集成运行时的基础镜像,只需要把备份逻辑包装成处理函数即可,示例配置如下:
- 新增
handler.py文件,内容如下:
import os import subprocess def lambda_handler(event, context): # 执行原备份命令 backup_cmd = '''/usr/bin/mysqldump --host=${DB_HOST} --user=${DB_USER} --password=${DB_PASSWORD} --port=3306 \ --single-transaction \ --routines \ --triggers \ --events \ --add-drop-database \ --opt \ --add-locks \ --compress \ --databases ${DB_NAME} | gzip -9 | aws s3 cp - s3://${S3BUCKETNAME}/$(date +"%m-%d-%Y-%H-%M-%S")_${DB_NAME}.sql.gz''' subprocess.run(backup_cmd, shell=True, env=os.environ, check=True) return {"status": "success", "message": "备份完成"}
- 修改Dockerfile如下:
# 使用Lambda官方预集成Python运行时的Alpine基础镜像 FROM public.ecr.aws/lambda/python:3.9-alpine2023 ARG BUILD_ID ARG BUILD_DATE ARG VERSION=0.0.9 LABEL maintainer="Rostyslav Malenko" LABEL version="$VERSION" LABEL description="This is custom Alpine Docker Image for the create SQL dump from RDS to S3 directly." LABEL org.label-schema.build-date=$BUILD_DATE ENV BUILD_ID=${BUILD_ID} \ APPLICATION_VERSION=${VERSION} \ SERVICE_ROLE=backup \ NUMPROCS_WORKER=1 \ INSTALL_PACKAGES="gzip mysql-client aws-cli" \ WORKSD="/tmp" RUN apk -v --update add --no-cache ${INSTALL_PACKAGES} && \ rm -rf /var/cache/apk/* WORKDIR ${WORKSD} # 复制处理函数到镜像内 COPY handler.py ./ # 指定Lambda调用的handler入口 CMD ["handler.lambda_handler"]
方案2:自行实现Lambda运行时API(适合不想改动原有命令执行逻辑的场景)
可以在原有容器的CMD逻辑最后,调用Lambda运行时的完成接口上报结果,示例如下:
首先在INSTALL_PACKAGES环境变量中新增curl依赖,再修改CMD逻辑:
CMD /usr/bin/mysqldump --host=${DB_HOST} --user=${DB_USER} --password=${DB_PASSWORD} --port=3306 \ --single-transaction \ --routines \ --triggers \ --events \ --add-drop-database \ --opt \ --add-locks \ --compress \ --databases ${DB_NAME} | gzip -9 | aws s3 cp - s3://${S3BUCKETNAME}/$(date +"%m-%d-%Y-%H-%M-%S")_${DB_NAME}.sql.gz ; \ # 上报执行成功结果给Lambda服务端,对应环境变量为Lambda运行时自动注入,无需手动配置 curl -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/${AWS_LAMBDA_REQUEST_ID}/response" -d '{"status":"success"}'
验证
改造完成后重新构建镜像部署到Lambda,调用时就不会再出现该报错,备份逻辑仍会正常执行。
内容的提问来源于stack exchange,提问作者Rostyslav Malenko
相关产品推荐
相关产品推荐

