You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 19:17:27