适用版本: 7.4-7.15
1. 错误异常的基本描述 #
snapshot lifecycle policy or policies [...] not found 表示你在读取 SLM policy 时,请求里指定了一个或多个 lifecycleIds,但 Elasticsearch 在当前集群元数据中没有找到对应 policy,因此返回 ResourceNotFoundException。源码显示,只有当请求指定了 ID 且最终匹配结果为空时,才会抛出这条错误;如果请求没带 ID,空列表会被当成正常结果返回。
这意味着问题不在执行 policy,而在“你请求的 policy 根本不存在”。
常见现象 #
- 调用
GET /_slm/policy/{policy_id}或批量读取多个 policy 时返回404。 - 某个自动化任务引用了旧 policy 名称,但该 policy 已被删除或改名。
- 集群迁移或环境切换后,业务侧仍请求不存在的 SLM policy ID。
- 手工查看全部 policy 时能看到列表为空,或目标 policy 名称已变化。
典型报错与异常栈 #
ResourceNotFoundException: snapshot lifecycle policy or policies [daily-backup] not found
2. 为什么会发生这个错误 #
SLM policy 存在于集群元数据里,不是普通索引文档。读取时 Elasticsearch 会按请求中的 lifecycleIds 过滤已有 policy;如果一个都匹配不到,就会抛出这条异常。
常见原因通常包括:
- policy 已被删除,但外部任务仍引用旧 ID。
- policy 改名后,调用方没有同步更新配置。
- 环境切换到了一个没有该 SLM policy 的新集群。
- 自动化脚本假定 policy 一定存在,没有先做存在性检查。
3. 如何排查和解决这个异常和解决这个异常 #
建议按“先确认 policy 是否真的不存在,再判断是配置漂移还是环境切换造成”的顺序处理:
- 列出当前全部 SLM policy,确认目标 ID 是否存在。
- 对照调用方配置,检查是否引用了过期名称。
- 如果是多环境部署,确认当前请求是否打到了错误环境。
- 如果 policy 应该存在但实际不存在,继续追查是谁在何时删除或改名。
相关 Elasticsearch API #
GET /_slm/policy:列出全部 SLM policy。GET /_slm/policy/{policy_id}:验证单个 policy 是否存在。PUT /_slm/policy/{policy_id}:在确认配置正确后重建缺失 policy。
排查时需要注意的问题 #
- 这不是执行失败,而是读取目标对象失败。
- 如果请求没带 policy ID,空结果是合法的;只有“指定了目标但没找到”才是异常。
- 不要把它和
snapshot lifecycle policy not found的单 policy 文案混淆,本页覆盖的是一个或多个 policy ID 的批量读取场景。
4. 如何解决这个错误 #
常用修复思路 #
- 修正调用方使用的 policy ID。
- 若 policy 被误删,按原配置重新创建。
- 在自动化脚本中增加存在性校验,避免把缺失 policy 当成执行失败。
- 对跨环境脚本做显式环境标识,避免请求错集群。
借助 INFINI 产品提升排障效率 #
- INFINI Console 适合核对当前集群配置、SLM policy 列表与调用时间线。
- INFINI Gateway 可帮助审计哪些上游系统在请求已经不存在的 policy ID。
5. 小结 #
snapshot lifecycle policy or policies not found 的本质很直接:请求目标不存在。处理重点是修正 policy ID、恢复缺失配置或纠正环境漂移,而不是把它当成 SLM 执行链路故障。
相关错误 #
- 快照生命周期策略未找到:单 policy 读取失败的相邻异常
- 无法执行快照生命周期保留策略:policy 存在但 retention 执行入口失败
- 执行快照生命周期策略失败:读取成功后进入 policy 执行阶段的相邻异常
- 删除多个快照失败:策略生效后进入仓库清理阶段的相邻异常
附:日志上下文 #
if (lifecycles.size() == 0) {
if (request.getLifecycleIds().length == 0) {
listener.onResponse(new GetSnapshotLifecycleAction.Response(Collections.emptyList()));
} else {
listener.onFailure(new ResourceNotFoundException("snapshot lifecycle policy or policies {} not found",
Arrays.toString(request.getLifecycleIds())));
}
}





