AWS Lambda容器运行aws-nuke返回退出码0却报Runtime.ExitError问题求助
这个问题我之前帮朋友排查过类似的,本质是Lambda容器运行时的机制和普通容器不一样——Lambda要求你的容器入口进程不能直接退出,哪怕任务已经正常完成了,否则会被判定为运行时异常,抛出Runtime.ExitError。
先看你的日志,aws-nuke确实正常执行完了(返回exit code 0,日志也显示没有可删除的资源),但问题就出在它执行完直接退出了,没有按照Lambda的运行时规范来通知任务完成。
给你几个可行的解决办法:
修改容器入口脚本,正确通知Lambda任务完成
不要把aws-nuke直接设为ENTRYPOINT/CMD,而是写一个shell脚本作为入口,在aws-nuke执行完成后,调用Lambda Runtime API来告知任务结束。比如写一个entrypoint.sh:#!/bin/sh # 执行你的aws-nuke命令,替换成实际参数 aws-nuke --config /path/to/config.yml --no-dry-run # 调用Lambda Runtime API通知任务完成 if [ -n "$AWS_LAMBDA_RUNTIME_API" ] && [ -n "$AWS_LAMBDA_REQUEST_ID" ]; then curl -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/${AWS_LAMBDA_REQUEST_ID}/response" -d '{"status": "completed"}' fi # 可选:如果怕API调用失败,也可以加个短时间的sleep再退出,不过推荐用API调用的方式 # sleep 5然后在Dockerfile里把这个脚本设为ENTRYPOINT,记得给脚本加执行权限(
RUN chmod +x /entrypoint.sh)。确保容器符合Lambda运行时规范
Lambda容器运行时的核心是要和Runtime API保持交互,或者说进程不能直接终止。哪怕你的任务是一次性的,也需要通过API来告知Lambda任务的状态,而不是直接exit。如果用的是自定义运行时,这点尤其重要。优化初始化耗时(可选但建议)
从日志里看到你的Init Duration有77秒,这已经非常长了,虽然这次没触发初始化超时,但长期来看可能会有问题。你可以试试给Lambda加内存(Lambda的内存和CPU是绑定的,内存越高CPU性能越好),或者提前在容器镜像里预加载aws-nuke的配置和依赖,减少扫描时的初始化时间。
另外补充下,我自己在Lambda容器里跑一次性清理工具的时候,也踩过这个直接退出的坑,用调用Runtime API的方法马上就解决了,亲测有效。
内容来源于stack exchange

