如何将DynamoDB表及其GSI部署在不同CloudFormation栈中?
把DynamoDB表和GSI分离到不同CloudFormation栈的实现方法
这个需求挺实用的——不管是想拆分不同团队的管理权限,还是想独立更新GSI而不影响主表,都能用这种方式实现。咱一步步来:
核心思路
要实现分离,关键是第一个栈负责创建基础DynamoDB表,并输出表的关键标识(比如ARN和表名),然后第二个栈通过CloudFormation的跨栈引用功能,导入这些标识来创建和管理GSI。这样两个栈就解耦了,各自可以独立部署、更新。
步骤1:创建管理基础DynamoDB表的栈
先写第一个栈的模板(比如叫dynamodb-table-stack.yaml),这里只定义主表的结构,不包含任何GSI。同时要把表的ARN和名称作为输出,方便后续栈引用。
示例模板:
AWSTemplateFormatVersion: '2010-09-09' Description: 基础DynamoDB表栈 Resources: MyDynamoDBTable: Type: AWS::DynamoDB::Table Properties: TableName: MyMainTable AttributeDefinitions: - AttributeName: id AttributeType: S - AttributeName: category AttributeType: S # 后续GSI会用到这个属性,先提前定义好 KeySchema: - AttributeName: id KeyType: HASH ProvisionedThroughput: ReadCapacityUnits: 5 WriteCapacityUnits: 5 Outputs: DynamoDBTableArn: Value: !GetAtt MyDynamoDBTable.Arn Export: Name: MyDynamoDBTableArn # 导出的名称,要全局唯一 DynamoDBTableName: Value: !Ref MyDynamoDBTable Export: Name: MyDynamoDBTableName
部署这个栈的命令(用AWS CLI):
aws cloudformation deploy --template-file dynamodb-table-stack.yaml --stack-name dynamodb-main-table-stack
步骤2:创建独立管理GSI的栈
接下来写第二个栈的模板(比如叫dynamodb-gsi-stack.yaml),这里通过!ImportValue导入第一个栈的输出,然后定义GSI。
示例模板:
AWSTemplateFormatVersion: '2010-09-09' Description: DynamoDB GSI独立管理栈 Resources: MyDynamoDBGSI: Type: AWS::DynamoDB::Table Properties: TableName: !ImportValue MyDynamoDBTableName # 引用主表名称 AttributeDefinitions: - AttributeName: category AttributeType: S - AttributeName: timestamp AttributeType: N KeySchema: - AttributeName: id KeyType: HASH # 必须和主表的KeySchema一致 GlobalSecondaryIndexes: - IndexName: CategoryTimestampIndex KeySchema: - AttributeName: category KeyType: HASH - AttributeName: timestamp KeyType: RANGE Projection: ProjectionType: ALL ProvisionedThroughput: ReadCapacityUnits: 3 WriteCapacityUnits: 3 UpdateReplacePolicy: Retain # 更新时保留原GSI,防止意外删除 DeletionPolicy: Retain # 删除栈时保留GSI,避免误删数据 Outputs: DynamoDBGSIArn: Value: !GetAtt MyDynamoDBGSI.GlobalSecondaryIndexes.0.IndexArn Export: Name: MyDynamoDBGSIArn
部署这个栈的命令:
aws cloudformation deploy --template-file dynamodb-gsi-stack.yaml --stack-name dynamodb-gsi-stack
关键注意事项
- 更新顺序:如果需要修改主表的属性(比如新增用于GSI的属性),必须先更新主表栈,再更新GSI栈;反之,修改GSI时直接更新GSI栈即可,不会影响主表的正常运行。
- 删除顺序:删除栈的时候,必须先删GSI栈,再删主表栈。如果先删主表栈,GSI会被自动删除,可能导致数据丢失。
- 权限配置:部署GSI栈的IAM角色需要有
dynamodb:UpdateTable等权限,才能对主表添加/修改GSI。 - 性能影响:GSI的创建或更新会消耗主表的读写容量,建议在业务低峰期操作,避免影响线上业务。
- 全局唯一导出名称:跨栈引用的导出名称(比如
MyDynamoDBTableArn)在同一个AWS区域里必须是唯一的,不要和其他栈的导出重名。
内容的提问来源于stack exchange,提问作者Joey Yi Zhao
相关产品推荐
相关产品推荐

