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

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官方提供了预集成运行时的基础镜像,只需要把备份逻辑包装成处理函数即可,示例配置如下:

  1. 新增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": "备份完成"}
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:57:00