OpenWhisk中collection定义及动作操作报“资源不在当前集合”错误的诱因
一、OpenWhisk 中“collection”的实际定义
OpenWhisk 会将所有托管的实体资源按类型划分到独立的资源集合(collection)中,每个集合对应一类固定的资源类型,不同集合之间完全独立计数、独立管理,不存在跨集合的资源名自动映射。
当前OpenWhisk内置的核心集合包括:
actions集合:所有托管动作的存储域triggers集合:所有事件触发器的存储域rules集合:所有关联触发器与动作的规则存储域packages集合:所有自定义资源包的存储域
当用户通过CLI、API操作某类资源时,系统会优先在指定操作对应的集合内检索匹配名称的资源,不会跨集合、跨资源层级自动匹配同名实体。
二、动作操作时抛出“Resource by this name exists but is not in this collection”错误的常见原因
这个报错的核心逻辑是:系统在全租户范围内检索到了与输入名称匹配的资源,但这个资源不属于当前你正在操作的资源集合/指定的资源层级,因此无法执行对应的增删改操作。
结合实际落地场景,典型的触发原因分为两类:
- 跨类型集合的同名资源冲突
同名称的资源分别存在于不同类型的集合中,比如在triggers集合里创建了一个叫order-close的触发器,之后尝试通过动作操作接口删除同名叫order-close的动作时,系统会检索到这个同名资源实际属于triggers集合,不在当前操作的actions集合内,就会抛出该错误。 - 资源嵌套路径不匹配(本次遇到的场景)
OpenWhisk的资源全路径结构为/命名空间/[自定义包名]/资源名,如果操作资源时只输入了资源短名,系统默认只会去命名空间根层级的actions集合(也就是没有归入任何自定义包的动作所在的集合)里检索目标资源。
从实际执行的CLI查询结果可以看到当前的资源分布:
从返回的动作列表可以看到,异常的动作实际全路径是$ wsk -i rule list rules $ wsk -i trigger list triggers $ wsk -i action list actions /guest/getgoods/getgoods private rust:1.34 $ wsk -i action delete getgoods error: Unable to delete action 'getgoods': Resource by this name exists but is not in this collection. (code tv2u2w09oog8Z5y2ONGuGvLCvBErctga)/guest/getgoods/getgoods:这个动作被归入了名叫getgoods的自定义包下,属于包内的actions层级,根本不在guest命名空间的根级actions集合里。
这个问题的来源是wskdeploy工具的部署逻辑:在使用wskdeploy部署Rust编写的动作时,如果配置文件没有显式指定动作所属的包名,工具会自动创建和动作同名的自定义包,将动作嵌套到包路径下,导致资源实际路径和用户预期的根路径动作不匹配。
后续验证的结果也能佐证这个逻辑:更换动作名称后,直接通过wsk action create部署的同类型Rust动作,因为没有经过wskdeploy的自动包路径映射,会直接放到命名空间根级的actions集合中,所有操作都可以正常执行。
对应解决方式
- 执行动作的删除、更新操作时,优先参考
wsk action list返回的完整资源路径,输入带命名空间、包名的完整路径,不要只输入资源短名,比如本次场景下正确的删除命令为wsk -i action delete /guest/getgoods/getgoods。 - 使用wskdeploy部署资源时,在配置文件中显式指定动作所属的包名,避免工具自动生成同名嵌套路径,导致资源路径和预期不一致。
- 操作资源前先核对所有同名字段的资源类型,避免跨集合的同名实体导致的操作路径不匹配。
内容的提问来源于stack exchange,提问作者kingledion
相关产品推荐
相关产品推荐

