使用Serverless修改DynamoDB表新增Sort Key时CloudFormation依赖报错如何解决
报错根因
该错误是CloudFormation校验模板时发现,Resources区块中存在对名为DynamoDBTransactionsFinished的资源引用,但该资源未在模板中明确定义、或定义层级/语法错误无法被识别,导致依赖无法解析。
解决途径
- 核对资源名拼写与定义层级
全局搜索serverless.yml中所有DynamoDBTransactionsFinished字符串,确认两点:- 资源定义处的名称和所有引用处的拼写完全一致,大小写、特殊符号完全匹配
- DynamoDB表资源定义在正确层级:必须放在
resources.Resources节点下,层级错误会导致资源未被CloudFormation识别
正确的表定义示例参考:
resources: Resources: DynamoDBTransactionsFinished: Type: AWS::DynamoDB::Table Properties: TableName: TransactionsFinished AttributeDefinitions: - AttributeName: 你的HASH KEY名 AttributeType: S - AttributeName: 新增的SORT KEY名 AttributeType: S KeySchema: - AttributeName: 你的HASH KEY名 KeyType: HASH - AttributeName: 新增的SORT KEY名 KeyType: RANGE BillingMode: PAY_PER_REQUEST - 清理无效引用
逐一排查所有引用该资源的配置,同步修改或删除无效引用:- 检查其他资源的
DependsOn配置,若你之前删除/重命名了该表资源,需要同步修改对应依赖声明 - 检查IAM权限策略中是否存在
!Ref DynamoDBTransactionsFinished、!GetAtt DynamoDBTransactionsFinished.Arn之类的引用,和表的最新配置对齐 - 检查DynamoDB流、Lambda触发器等关联配置,确保引用的表资源名和定义一致
- 检查其他资源的
- 清理旧堆栈残留后重新部署
因为你已确认可以删除原有表无数据风险,可执行以下步骤做干净部署:- 执行
sls remove命令删除现有CloudFormation堆栈,清理所有旧资源 - 到AWS控制台DynamoDB页面确认原有表已被彻底删除,避免表名占用
- 执行
sls deploy重新部署更新后的配置
- 执行
- 强制部署跳过残留校验
若不需要保留现有堆栈的其他资源,可直接执行强制部署命令:sls deploy --force
该命令会让CloudFormation忽略残留依赖校验,直接按新模板创建资源,适配你无需保留旧表的场景。
内容的提问来源于stack exchange,提问作者Diego Rainero
相关产品推荐
相关产品推荐

