Serverless Framework 深度解析:如何部署 SAM 和 CloudFormation 项目
前言
Serverless Framework 作为业界领先的无服务器应用框架,近期增强了对 AWS SAM 和 CloudFormation 项目的支持。本文将深入探讨这一功能的实现原理、使用方法和最佳实践,帮助开发者更好地利用 Serverless Framework 的强大能力来管理基础设施即代码。
功能概述
Serverless Framework 对 SAM/CloudFormation 的支持目前处于实验阶段,但已经提供了核心功能:
- ✅ 支持部署 JSON/YAML 格式的 SAM/CFN 模板
- ✅ 支持移除已部署的 SAM/CFN 模板
- ✅ 部分支持在模板中使用 Serverless 变量
- ✅ 支持通过 Serverless Compose 组合多个服务
- ✅ 支持通过
sls info
查看堆栈信息
快速入门
基础部署示例
假设我们有一个标准的 SAM 模板 template.yml
:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: 示例 RESTful 服务
Resources:
ExampleFunction:
Type: AWS::Serverless::Function
Properties:
Runtime: nodejs20.x
Handler: index.handler
CodeUri: '.'
Events:
ListCustomers:
Type: Api
Properties:
Path: /
Method: any
对应的 Lambda 处理函数 index.js
:
export const handler = async (event) => {
return {
statusCode: 200,
body: JSON.stringify('Hello from Lambda!'),
}
}
部署命令非常简单:
serverless deploy --stack my-dev-stack
配置管理
samconfig.toml 文件解析
Serverless Framework 能够识别项目中的 samconfig.toml
文件,但只会使用其中与框架相关的配置项:
version = 0.1
[default.deploy.parameters]
stack_name = "my-dev-stack"
region = "us-east-1"
template_file = "template.yml"
重要说明:由于 samconfig.toml
的结构是基于 SAM CLI 命令设计的,Serverless Framework 只会使用 <stage>.global.parameters
和 <stage>.deploy.parameters
配置,无论你运行的是什么命令。
核心功能详解
1. 模板部署
部署 SAM/CloudFormation 模板的核心命令:
sls deploy
支持的关键选项:
--stack
:堆栈名称(如未在 samconfig.toml 中指定则必须提供)--bucket
:部署使用的 S3 存储桶--region
:目标区域(默认 us-east-1)--stage
:部署阶段(默认 dev)
当前限制:暂不支持部署 AWS Lambda Layers、容器化 Lambda 和 Step Functions 资源。
2. 模板移除
移除已部署的堆栈:
sls remove
选项与部署命令类似。需要注意的是,如果使用了自定义部署存储桶,该存储桶不会被自动清空或删除。
3. 服务信息查询
获取堆栈输出信息:
sls info
文件格式支持
Serverless Framework 对模板文件的支持非常灵活:
- 支持 JSON 和 YAML 两种格式
- 支持
template.yml
、template.yaml
和template.json
三种命名方式 - 可通过
samconfig.toml
中的template_file
参数指定模板文件
变量系统集成
Serverless Framework 的变量系统可以无缝集成到 SAM/CloudFormation 模板中,目前支持以下变量类型:
-
AWS 相关变量:
${aws:accountId}
${aws:region}
-
跨堆栈引用:
${cf:another-service-dev.functionPrefix}
-
命令行选项:
${opt:<option>}
-
环境变量:
${env:ENV_VAR}
-
文件引用:
${file(./myCustomFile.yml)}
-
参数存储:
${ssm:/path/to/service/id}
应用示例:
Resources:
ExampleFunction:
Type: AWS::Serverless::Function
Properties:
Environment:
Variables:
STAGE: ${env:USER}
REGION: ${aws:region}
服务组合能力
Serverless Compose 功能允许将多个 SAM/CloudFormation 堆栈与传统 Serverless 服务组合管理:
基础组合示例
serverless-compose.yml
配置:
services:
traditional-service:
path: traditional-service
sam-service:
path: sam-service
params:
traditionalServiceOutput: ${traditional-service.exampleOutput}
在 SAM 模板中引用参数:
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
Environment:
Variables:
FRAMEWORK_OUTPUT: ${param:traditionalServiceOutput}
阶段化参数管理
支持为不同环境配置不同参数:
stages:
dev:
params:
STRIPE_API_KEY: 'stripe-api-dev-key'
prod:
params:
STRIPE_API_KEY: 'stripe-api-prod-key'
最佳实践建议
-
命名规范:建议在
samconfig.toml
中明确指定堆栈名称,避免每次部署都需要提供--stack
参数 -
环境隔离:充分利用 Serverless Compose 的阶段化参数管理功能,实现开发、测试和生产环境的隔离配置
-
变量使用:优先使用
${env:VAR}
引用环境变量,而不是直接在模板中硬编码敏感信息 -
组合服务:对于复杂应用,将基础设施组件拆分为多个服务并通过 Serverless Compose 管理依赖关系
-
版本控制:将
samconfig.toml
和serverless-compose.yml
纳入版本控制,但注意排除敏感信息
总结
Serverless Framework 对 SAM 和 CloudFormation 的支持为开发者提供了更灵活的基础设施管理方式。通过本文介绍的功能和最佳实践,开发者可以:
- 复用现有的 SAM/CloudFormation 模板
- 利用 Serverless Framework 的强大部署能力
- 通过变量系统实现配置的动态化
- 使用服务组合功能管理复杂应用
随着功能的不断完善,Serverless Framework 将成为管理无服务器基础设施的更全面解决方案。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考