EventBridge Scheduler把成功调用丢进DLQ
先说结论:问题不在你的Agent代码,而是EventBridge Scheduler的通用目标(universal targets)调用是同步等响应的。Scheduler发出API调用后等不到30秒就会判失败,但你的Agent完全不知情,继续跑完活、发完通知——于是你收到邮件,DLQ里也多了一条“失败”记录。
下一篇
Comfort Atlas:用cobe做3D地球 →
复现路径是这样的:
1. Schedule配置成直接调Bedrock AgentCore的invokeAgentRuntime
2. 这个API是阻塞的,要等Agent跑完才返回,30到75秒
3. Scheduler在~30秒处超时,标记invocation failed
4. Agent继续跑完,发SNS邮件,DLQ收到一条“失败”消息
根因不是bug,是设计预期。 Scheduler自带的重试策略里有个MaximumEventAgeInSeconds,但它管的是事件在重试间的最大年龄,不是单次调用的等待上限。所以那个30秒更像是个观测值,不是文档承诺值。
我怎么修的: 让Agent响应变快,而不是让搜索变快。入口函数把任务丢进后台立刻返回,Scheduler在窗口内拿到响应就完事,Agent继续跑完整场搜索。AgentCore对这个模式有原生支持——add_async_task注册后台任务,运行时在/ping上报HealthyBusy,session保持活跃不会被回收。这点很关键,因为AgentCore空闲15分钟就会终止session,没有任务追踪的话,后台工作看起来跟空闲一模一样。
关键代码:
# strong refs: asyncio只弱引用task
_background_tasks: set[asyncio.Task[Any]] = set()
async def _tracked_job_search(company: str, title: str, location: str) -> None:
"""注册为tracked async task,让ping报告HealthyBusy"""
task_id = app.add_async_task("job_search")
try:
await run_job_search(company, title, location)
finally:
app.complete_async_task(task_id)
@app.entrypoint
async def invoke(payload: dict[str, Any] | None = None) -> dict[str, Any]:
# ...参数校验...
if payload.get("sync"):
return await run_job_search(company, title, location)
# 异步路径:立刻返回,后台跑
task = asyncio.create_task(_tracked_job_search(company, title, location))
_background_tasks.add(task)
return {"status": "started"}这个坑给两个启发:一是别信Scheduler会耐心等你的慢服务,二是AgentCore的异步模式写得挺顺,CompleteAsyncTask和/ping状态配合,总算没白折腾。如果你也把长任务挂在Scheduler后面,建议直接测一下响应时间,别等DLQ报警才发现。
AI工具与大模型实操经验整理在Claude实战技巧汇总,有不少直接可参考的案例。
