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

SST分栈部署基础设施与服务及项目架构优化咨询

基于SST框架的分栈部署实现与项目组织优化方案

一、分栈部署核心实现方式

SST原生支持指定栈进行部署,结合你的流水线需求,可通过以下方式实现分栈部署:

1. 基础设施流水线部署

针对VPC、MSK、RDS、DocumentDB这类核心基础设施,流水线执行命令时指定对应栈即可:

# 按依赖顺序部署所有基础设施栈(SST会自动处理栈间依赖)
sst deploy --stage <环境名> --stack Vpc --stack Msk --stack Database --stack DocumentDB

触发条件:仅当基础设施代码库(IaC库)的指定分支(如main/infra-dev)有代码提交时触发。

2. 服务组件流水线部署

对于Lambda、API Gateway这类服务组件,每个服务对应一条独立流水线,仅部署自身关联的栈:

  • Consumer服务流水线:
    sst deploy --stage <环境名> --stack Consumer
    
  • Api服务流水线:
    sst deploy --stage <环境名> --stack Api
    

触发条件:对应服务代码库的分支提交时触发(如Consumer服务代码库的feature/*分支提交,仅触发Consumer栈部署)。

二、栈间依赖处理

服务栈需要引用基础设施栈的资源输出(如VPC ID、MSK集群ARN),需在栈定义中通过app.getStack()获取:

// stacks/posiciones/Consumer.js
import { StackContext, Function } from "@serverless-stack/resources";

export function Consumer({ app, stack }) {
  // 获取基础设施栈的资源输出
  const vpcStack = app.getStack("Vpc");
  const mskStack = app.getStack("Msk");

  new Function(stack, "ConsumerLambda", {
    vpc: vpcStack.vpc,
    environment: {
      MSK_CLUSTER_ARN: mskStack.clusterArn,
      DOCUMENTDB_ENDPOINT: app.getStack("DocumentDB").dbEndpoint
    },
    // 指向外部服务代码库的代码目录(流水线中需提前拉取服务代码到对应路径)
    code: "../consumer-service/src",
    handler: "index.handler"
  });
}

三、项目组织最优方案

结合你基础设施与服务代码分库的现状,可按以下方式优化结构:

1. IaC库结构保留并强化职责单一性

现有结构无需大幅调整,只需确保每个栈的职责单一:

./
├── cdk.context.json
├── package.json
├── sst.json
└── stacks
    ├── common
    │   ├── Config.js       # 抽离通用配置(如默认Function属性、环境变量模板)
    │   ├── Msk.js          # 仅负责MSK集群创建
    │   └── Vpc.js          # 仅负责VPC、子网、安全组创建
    ├── index.js            # 注册所有栈,维护栈依赖顺序
    ├── posiciones
    │   ├── Consumer.js     # 仅负责MSK消费者Lambda及相关资源
    │   └── DocumentDB.js   # 仅负责DocumentDB集群创建
    └── vistas
        ├── Api.js          # 仅负责API Gateway及关联Lambda
        └── Database.js     # 仅负责RDS实例创建

2. 服务代码库与IaC库的协作方式

  • 流水线中配置:部署服务栈前,先拉取对应服务代码库到IaC库的指定相对路径(如../consumer-service),确保SST能正确加载Lambda代码。
  • 通用配置复用:将Lambda的通用属性(如runtime、超时时间)抽离到stacks/common/Config.js,在stacks/index.js中统一设置:
    // stacks/common/Config.js
    export const defaultFunctionProps = {
      runtime: "nodejs18.x",
      timeout: 30,
      memorySize: 256
    };
    
    // stacks/index.js
    import { App } from "@serverless-stack/resources";
    import { defaultFunctionProps } from "./common/Config";
    // ... 其他栈导入
    
    export default function (app) {
      app.setDefaultFunctionProps(defaultFunctionProps);
      app.stack(Vpc)
         .stack(Msk)
         .stack(Database)
         .stack(DocumentDB)
         .stack(Consumer)
         .stack(Api);
    }
    

3. 环境隔离策略

利用SST的stage参数实现多环境隔离,不同分支对应不同stage:

  • 开发分支(dev):部署到dev stage
  • 预发布分支(staging):部署到staging stage
  • 主分支(main):部署到prod stage

四、关键注意事项

  • 确保所有栈在同一个AWS区域和stage下,否则无法跨栈获取资源输出。
  • 流水线需配置具备对应资源部署权限的AWS凭证。
  • 敏感信息(如数据库密码)使用SST的Secret组件管理,避免硬编码。

内容的提问来源于stack exchange,提问作者Jordi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:15:45