如何通过代码切换DynamoDB中“将相同设置应用到全局二级索引”选项?
给DynamoDB全局二级索引同步自动扩缩容设置
好的,我来帮你搞定这个问题~你提到的“将相同设置应用到全局二级索引”选项,本质就是把表的自动扩缩容配置(最小/最大容量、扩缩容策略)同步到所有GSI上。用Boto3实现的话,只需要针对每个GSI单独调用Auto Scaling的API,逻辑和表的配置完全一致,只是调整两个关键参数就行。
核心参数调整
和表的配置相比,针对GSI需要修改以下两个参数:
ResourceId:格式改为table/{表名}/index/{GSI名称}ScalableDimension:读容量对应dynamodb:index:ReadCapacityUnits,写容量对应dynamodb:index:WriteCapacityUnits
完整代码示例
下面是扩展你现有代码的版本,支持给表和所有GSI同步配置:
import boto3 def conf_auto_scaling_with_gsi(self, table_name): print(f"INFO :: Creating auto scaling for Table [{table_name}] and its GSIs") # -------------------------- # 保留你原来的表配置逻辑 # -------------------------- # 表的读容量自动扩缩容 self.as_c.register_scalable_target( ServiceNamespace='dynamodb', ResourceId=f'table/{table_name}', ScalableDimension='dynamodb:table:ReadCapacityUnits', MinCapacity=5, MaxCapacity=4000 ) # 表的写容量自动扩缩容 self.as_c.register_scalable_target( ServiceNamespace='dynamodb', ResourceId=f'table/{table_name}', ScalableDimension='dynamodb:table:WriteCapacityUnits', MinCapacity=5, MaxCapacity=4000 ) # -------------------------- # 自动获取表的所有GSI名称 # -------------------------- dynamodb_client = boto3.client('dynamodb') table_desc = dynamodb_client.describe_table(TableName=table_name) gsi_list = table_desc['Table'].get('GlobalSecondaryIndexes', []) if not gsi_list: print(f"INFO :: Table [{table_name}] has no Global Secondary Indexes") return # -------------------------- # 给每个GSI同步相同的扩缩容设置 # -------------------------- for gsi in gsi_list: gsi_name = gsi['IndexName'] print(f"INFO :: Applying auto scaling to GSI [{gsi_name}]") # GSI的读容量自动扩缩容 self.as_c.register_scalable_target( ServiceNamespace='dynamodb', ResourceId=f'table/{table_name}/index/{gsi_name}', ScalableDimension='dynamodb:index:ReadCapacityUnits', MinCapacity=5, MaxCapacity=4000 ) # GSI的写容量自动扩缩容 self.as_c.register_scalable_target( ServiceNamespace='dynamodb', ResourceId=f'table/{table_name}/index/{gsi_name}', ScalableDimension='dynamodb:index:WriteCapacityUnits', MinCapacity=5, MaxCapacity=4000 )
补充:同步扩缩容策略(如果有的话)
如果你给表配置了具体的扩缩容策略(比如目标追踪策略),也要给每个GSI创建对应的策略,参数和表的保持一致,同样调整ResourceId和ScalableDimension:
def add_scaling_policy_for_gsi(self, table_name, gsi_name): # 给GSI添加读容量扩缩容策略(和表的策略参数一致) read_policy_name = f"{table_name}-{gsi_name}-read-scaling" self.as_c.put_scaling_policy( PolicyName=read_policy_name, ServiceNamespace='dynamodb', ResourceId=f'table/{table_name}/index/{gsi_name}', ScalableDimension='dynamodb:index:ReadCapacityUnits', PolicyType='TargetTrackingScaling', TargetTrackingScalingPolicyConfiguration={ 'TargetValue': 70.0, # 和表的目标利用率保持一致 'PredefinedMetricSpecification': { 'PredefinedMetricType': 'DynamoDBReadCapacityUtilization' }, 'ScaleInCooldown': 300, 'ScaleOutCooldown': 300 } ) # 给GSI添加写容量扩缩容策略 write_policy_name = f"{table_name}-{gsi_name}-write-scaling" self.as_c.put_scaling_policy( PolicyName=write_policy_name, ServiceNamespace='dynamodb', ResourceId=f'table/{table_name}/index/{gsi_name}', ScalableDimension='dynamodb:index:WriteCapacityUnits', PolicyType='TargetTrackingScaling', TargetTrackingScalingPolicyConfiguration={ 'TargetValue': 70.0, 'PredefinedMetricSpecification': { 'PredefinedMetricType': 'DynamoDBWriteCapacityUtilization' }, 'ScaleInCooldown': 300, 'ScaleOutCooldown': 300 } )
关键说明
AWS控制台的“将相同设置应用到全局二级索引”选项,其实就是帮你自动执行了上面的步骤:遍历所有GSI,复制表的Min/Max容量和扩缩容策略配置。用代码实现的话,就是手动完成这个遍历和配置过程。
内容的提问来源于stack exchange,提问作者Ráfagan
相关产品推荐
相关产品推荐

