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):部署到devstage - 预发布分支(
staging):部署到stagingstage - 主分支(
main):部署到prodstage
四、关键注意事项
- 确保所有栈在同一个AWS区域和stage下,否则无法跨栈获取资源输出。
- 流水线需配置具备对应资源部署权限的AWS凭证。
- 敏感信息(如数据库密码)使用SST的
Secret组件管理,避免硬编码。
内容的提问来源于stack exchange,提问作者Jordi
相关产品推荐
相关产品推荐

