如何用Serverless Framework为多环境配置DynamoDB ProvisionedThroughput
在Serverless Framework中管理多环境DynamoDB配置
完全可以在同一个serverless.yml里实现不同环境的DynamoDB配置隔离,甚至能灵活开启/关闭自动扩缩容功能。核心思路是利用自定义变量插值结合CloudFormation条件判断,让配置根据部署的环境(stage)自动切换。下面给你两种实用的实现方案:
方案1:内置自定义变量+条件渲染
这是最直接的方式,不需要额外插件,完全依赖Serverless Framework的原生能力。
步骤1:在serverless.yml中定义多环境配置
首先在custom块里按环境(比如dev/prod)定义好DynamoDB的专属配置:
service: my-serverless-app custom: dynamodbConfigs: dev: rcu: 1 wcu: 1 enableAutoScaling: false prod: rcu: 5 wcu: 5 enableAutoScaling: true autoScalingMax: 100 targetUsagePercent: 70 # 指定默认环境,避免部署时忘记传stage provider: name: aws runtime: nodejs18.x stage: ${opt:stage, 'dev'} # 默认用dev环境 region: us-east-1
步骤2:根据环境渲染DynamoDB表配置
接下来在resources块里定义DynamoDB表,通过${self:custom.dynamodbConfigs.${self:provider.stage}.xxx}引用对应环境的配置,同时用CloudFormation的Fn::If来判断是否启用自动扩缩容:
resources: Resources: MyDynamoDBTable: Type: AWS::DynamoDB::Table Properties: TableName: MyTable-${self:provider.stage} AttributeDefinitions: - AttributeName: id AttributeType: S KeySchema: - AttributeName: id KeyType: HASH # 基础读写容量,自动匹配当前环境 ProvisionedThroughput: ReadCapacityUnits: ${self:custom.dynamodbConfigs.${self:provider.stage}.rcu} WriteCapacityUnits: ${self:custom.dynamodbConfigs.${self:provider.stage}.wcu} BillingMode: PROVISIONED # 必须用PROVISIONED才能开启自动扩缩容 StreamSpecification: StreamViewType: NEW_IMAGE # 针对生产环境添加读容量自动扩缩容策略 ReadScalingPolicy: Type: AWS::ApplicationAutoScaling::ScalingPolicy Condition: IsProd # 只在prod环境创建 Properties: PolicyName: DynamoDBReadCapacityScalingPolicy PolicyType: TargetTrackingScaling ScalingTargetId: !Ref ReadScalingTarget TargetTrackingScalingPolicyConfiguration: TargetValue: ${self:custom.dynamodbConfigs.prod.targetUsagePercent} PredefinedMetricSpecification: PredefinedMetricType: DynamoDBReadCapacityUtilization ReadScalingTarget: Type: AWS::ApplicationAutoScaling::ScalableTarget Condition: IsProd Properties: MaxCapacity: ${self:custom.dynamodbConfigs.prod.autoScalingMax} MinCapacity: ${self:custom.dynamodbConfigs.prod.rcu} ResourceId: table/${self:resources.Resources.MyDynamoDBTable} ScalableDimension: dynamodb:table:ReadCapacityUnits ServiceNamespace: dynamodb # 同理添加写容量自动扩缩容策略 WriteScalingPolicy: Type: AWS::ApplicationAutoScaling::ScalingPolicy Condition: IsProd Properties: PolicyName: DynamoDBWriteCapacityScalingPolicy PolicyType: TargetTrackingScaling ScalingTargetId: !Ref WriteScalingTarget TargetTrackingScalingPolicyConfiguration: TargetValue: ${self:custom.dynamodbConfigs.prod.targetUsagePercent} PredefinedMetricSpecification: PredefinedMetricType: DynamoDBWriteCapacityUtilization WriteScalingTarget: Type: AWS::ApplicationAutoScaling::ScalableTarget Condition: IsProd Properties: MaxCapacity: ${self:custom.dynamodbConfigs.prod.autoScalingMax} MinCapacity: ${self:custom.dynamodbConfigs.prod.wcu} ResourceId: table/${self:resources.Resources.MyDynamoDBTable} ScalableDimension: dynamodb:table:WriteCapacityUnits ServiceNamespace: dynamodb # 定义环境判断条件 Conditions: IsProd: !Equals [${self:provider.stage}, 'prod']
步骤3:部署指定环境
部署时只需指定stage参数即可自动加载对应配置:
# 部署测试环境 serverless deploy --stage dev # 部署生产环境 serverless deploy --stage prod
方案2:使用独立环境配置文件
如果你的配置项很多,或者想把环境配置和主配置分离,可以用单独的YAML文件来存储各环境的配置,比如创建env/dev.yml和env/prod.yml:
env/dev.yml内容:
dynamodb: rcu: 1 wcu: 1 enableAutoScaling: false
env/prod.yml内容:
dynamodb: rcu: 5 wcu: 5 enableAutoScaling: true autoScalingMax: 100 targetUsagePercent: 70
然后在serverless.yml中通过file()函数加载对应环境的配置:
custom: # 加载对应stage的配置文件 envConfig: ${file(env/${self:provider.stage}.yml)} provider: name: aws runtime: nodejs18.x stage: ${opt:stage, 'dev'} region: us-east-1 # 后续引用配置时用${self:custom.envConfig.dynamodb.rcu}即可,其他逻辑和方案1一致
这种方式的好处是主配置文件更简洁,环境配置单独管理,适合团队协作场景。
关键注意事项
- 自动扩缩容仅支持PROVISIONED计费模式,不能用PAY_PER_REQUEST
- 部署生产环境时,确保AWS账号有
ApplicationAutoScaling相关的权限 - 如果需要给GSI配置自动扩缩容,只需复制上面的ScalingPolicy和ScalableTarget资源,修改
ResourceId为table/${tableName}/index/${indexName}即可
内容的提问来源于stack exchange,提问作者rhythm
相关产品推荐
相关产品推荐

