十二要素应用
twelve-factor-apps;云原生配置。
35 分钟
十二要素应用
Heroku 十二要素(12-Factor App) 写于 PaaS 时代,但今天仍是 Serverless 与容器化 的共同语言:配置外置、无状态进程、日志当事件流——违背这些要素的函数,上线后往往卡在冷启动、密钥泄露或「换环境就挂」。
学习目标
- 对照十二要素中与 Serverless 最相关的 5–6 条
- 理解「配置进环境变量」在 Lambda 里的落地方式
- 与 scale-stateless 的无状态原则对齐
与 Serverless 强相关的要素
| 要素 | 要点 | Lambda 落地 |
|---|---|---|
| III 配置 | 配置与代码分离 | 环境变量、SSM Parameter Store、Secrets Manager |
| IV 后端服务 | DB/队列当附加资源 | RDS、DynamoDB、SQS 通过 IAM 访问,不绑本机 |
| VI 进程 | 无状态、share-nothing | 实例内存不写 Session;见 srv-state |
| VIII 并发 | 通过进程模型扩展 | 平台按并发扩函数,不是你手动 fork |
| XI 日志 | 日志是事件流 | stdout → CloudWatch Logs,不轮转本地文件 |
| XII 管理进程 | 迁移/一次性任务独立 | Flyway 迁移常单独 Lambda 或 CI Job |
反模式:把 application-prod.yml 打进部署包、在 /tmp 存用户 Session、在函数全局变量里缓存「只能本实例读」的业务状态。
配置示例
# SAM template 片段:配置外置
Environment:
Variables:
TABLE_NAME: !Ref OrdersTable
STAGE: !Ref Stage
# 密钥用 Secrets Manager ARN,不要写进 repo
Spring Boot 习惯 @Value 与 profile;Lambda 里等价物是 启动时读环境变量 + IAM 角色,与 aws-iam 的最小权限一致。
与扩展性 track 的交叉
scale-stateless 讲 HTTP 服务无 Session;十二要素 VI 进程 把同一思想推广到 任意可替换进程。Serverless 把「进程」缩成 一次 invocation,原则不变。
练习
- 审计一个现有 Spring 模块:哪些配置应迁到环境变量?
- 对照十二要素官网,标出你最常违反的一条
- 画一张图:Lambda、DynamoDB、SQS 作为「附加资源」如何挂在函数外