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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:19:16