Serverless Framework 深度解析:如何部署 SAM 和 CloudFormation 项目

Serverless Framework 深度解析:如何部署 SAM 和 CloudFormation 项目

serverless 无服务器框架——使用AWS Lambda、Azure Functions、Google Cloud Functions等构建无服务器架构的Web、移动和物联网应用程序! serverless 项目地址: https://gitcode.com/gh_mirrors/se/serverless

前言

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.ymltemplate.yamltemplate.json 三种命名方式
  • 可通过 samconfig.toml 中的 template_file 参数指定模板文件

变量系统集成

Serverless Framework 的变量系统可以无缝集成到 SAM/CloudFormation 模板中,目前支持以下变量类型:

  1. AWS 相关变量:

    • ${aws:accountId}
    • ${aws:region}
  2. 跨堆栈引用:

    • ${cf:another-service-dev.functionPrefix}
  3. 命令行选项:

    • ${opt:<option>}
  4. 环境变量:

    • ${env:ENV_VAR}
  5. 文件引用:

    • ${file(./myCustomFile.yml)}
  6. 参数存储:

    • ${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'

最佳实践建议

  1. 命名规范:建议在 samconfig.toml 中明确指定堆栈名称,避免每次部署都需要提供 --stack 参数

  2. 环境隔离:充分利用 Serverless Compose 的阶段化参数管理功能,实现开发、测试和生产环境的隔离配置

  3. 变量使用:优先使用 ${env:VAR} 引用环境变量,而不是直接在模板中硬编码敏感信息

  4. 组合服务:对于复杂应用,将基础设施组件拆分为多个服务并通过 Serverless Compose 管理依赖关系

  5. 版本控制:将 samconfig.tomlserverless-compose.yml 纳入版本控制,但注意排除敏感信息

总结

Serverless Framework 对 SAM 和 CloudFormation 的支持为开发者提供了更灵活的基础设施管理方式。通过本文介绍的功能和最佳实践,开发者可以:

  • 复用现有的 SAM/CloudFormation 模板
  • 利用 Serverless Framework 的强大部署能力
  • 通过变量系统实现配置的动态化
  • 使用服务组合功能管理复杂应用

随着功能的不断完善,Serverless Framework 将成为管理无服务器基础设施的更全面解决方案。

serverless 无服务器框架——使用AWS Lambda、Azure Functions、Google Cloud Functions等构建无服务器架构的Web、移动和物联网应用程序! serverless 项目地址: https://gitcode.com/gh_mirrors/se/serverless

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

史恋姬Quimby

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值