AWS Lambda调用Glue start_job_run时字符串格式化错误咨询
问题原因及解决方案
报错触发原因
- 直接触发源是异常捕获分支的日志打印代码
logger.error('ERROR DETAILS', e):Pythonlogging模块的日志方法要求第一个参数为格式化字符串,后续传入的参数会按顺序替换字符串内的%类占位符。你的格式化字符串没有任何占位符,却传入了第二个参数e,执行时就会抛出not all arguments converted during string formatting错误。 - 间歇性出现的原因:只有
start_job_run调用真的抛出异常(如Glue并发超限、API限流、参数非法等)进入except块时,才会触发该日志打印错误,正常运行时不会走到该分支,因此表现为偶发。 - 你最初定位到
start_job_run行是因为该方法抛出的原始异常进入except块后,日志打印代码又抛出了新的异常,覆盖了原始异常信息,导致你看不到Glue启动失败的真实原因。
排查解决步骤
- 优先修复异常分支的日志打印写法,释放原始异常信息,可选写法如下:
- 用f-string拼接异常:
logger.error(f'ERROR DETAILS: {e}') - 用logging原生占位符:
logger.error('ERROR DETAILS: %s', e) - 需要打印完整异常栈时:
logger.error('ERROR DETAILS', exc_info=e)
- 用f-string拼接异常:
- 日志修复完成后重新运行代码,即可获取
start_job_run抛出的真实异常,针对常见异常的处理方案如下:- 若为Glue API限流错误:即使你设置了任务最大并发为17,短时间批量调用API也可能触发限流,可给
start_job_run调用增加指数退避重试逻辑,或在循环内加100-200ms的短延迟 - 若为参数类型错误:确认
CONFIG_PATH、job_key_name均为字符串类型,Glue运行参数仅支持字符串传入,非字符串类型需要先做类型转换 - 若为权限错误:确认Lambda执行角色拥有
glue:StartJobRun权限,无权限边界、资源策略的额外限制
- 若为Glue API限流错误:即使你设置了任务最大并发为17,短时间批量调用API也可能触发限流,可给
- 可选优化:给boto3的glue_client配置默认重试策略,自动处理偶发的服务端错误、限流错误。
内容的提问来源于stack exchange,提问作者Aatisha
相关产品推荐
相关产品推荐

