Amplify跨账号迁移后GraphQL推送报资源循环依赖错误
Amplify GraphQL跨账号迁移推送报循环依赖错误排查方案
根因说明
该报错不是业务模型关联逻辑错误导致,属于Amplify CLI生成CloudFormation嵌套栈时的典型问题,常见触发场景:
- 跨账号/跨环境迁移时,本地
amplify/#current-cloud-backend和API构建目录残留旧环境资源引用,导致CLI生成模板时新旧资源依赖链混乱 - 双向
@connection关联字段上重复配置与模型级完全一致的@auth规则时,CLI会为冗余规则生成独立的自定义授权资源,归入报错中提到的CustomResourcesjson、ConnectionStack嵌套栈;这类资源同时依赖两端模型的DynamoDB表、IAM权限配置,而两端模型的表资源创建又反过来依赖关联GSI和对应授权资源,直接形成闭环依赖 - 10.x以下版本的Amplify CLI存在解析bug,会识别GraphQL注释内的
@connection指令,你注释掉的Building字段残留的关联配置会被错误纳入模板生成逻辑,额外增加无效依赖
排查步骤
- 先清理本地缓存排除环境残留影响:切到新开发环境后,删除
amplify/backend/api/<你的API名>/build构建目录,执行amplify pull --restore同步新账号的云端资源状态,先排除缓存导致的虚假依赖 - 核对本地Amplify CLI版本:跨环境迁移时本地CLI版本与原生产环境使用版本差超过2个大版本的话,生成的CloudFormation模板结构会存在差异,旧版嵌套栈逻辑和新版自定义资源逻辑不兼容也会触发循环依赖,先对齐版本再操作
- 检查Schema配置冗余:重点看关联字段是否重复配置权限、注释中是否残留带指令的关联定义
修复方案
- 精简Schema配置,删除冗余规则和无效注释内容,调整后示例如下:
模型级配置的
@auth规则会自动继承到所有字段,不需要在关联字段上重复配置完全一致的权限规则;同时完全删除注释掉的Building字段代码,避免CLI错误解析注释内容
type BuildingAdminBuilding @model(subscriptions: null) @aws_cognito_user_pools @auth(rules: [ { provider: apiKey, allow: public, operations: [read, create, update, delete] }, { # TODO TEMP ONLY - FOR TESTING UNTIL PROPER GROUPS ARE SETUP provider: userPools, allow: private, operations: [read, create, update, delete] }, ]) { id: ID! buildingAdmin: BuildingAdmin! @connection(name: "BuildingAdminBuilding") } type BuildingAdmin @model(subscriptions: null) @aws_cognito_user_pools @auth(rules: [ { provider: apiKey, allow: public, operations: [read, create, update, delete] }, { provider: userPools, allow: private, operations: [read, create, update, delete] } ]) { id: ID! user: User @connection(name: "BuildingAdminUser") buildings: [BuildingAdminBuilding] @connection(name: "BuildingAdminBuilding") }
- 执行全量缓存清理和模板预校验,不要直接推送:
# 清理本地构建缓存 rm -rf amplify/backend/api/<你的API名称>/build rm -rf node_modules/.cache # 重新生成代码配置 amplify codegen remove amplify codegen add # 本地预生成CloudFormation模板,检查是否还有依赖错误 amplify push --no-gqlcompile --dryrun
- 若dryrun校验通过,正常执行
amplify push即可完成资源部署。 - 如果预校验仍然报循环依赖,可手动打开
amplify/backend/api/<你的API名称>/build/cloudformation-template.json,搜索Resources下的DependsOn字段,找到BuildingAdmin、BuildingAdminBuilding两个资源互相冗余引用的条目(多为字段级冗余auth生成的CustomResource条目),删除重复依赖项后再执行推送。
内容的提问来源于stack exchange,提问作者Anang M
相关产品推荐
相关产品推荐

