1. 开头:为什么在Ubuntu上装AWS SAM值得折腾
先说结论:如果你正在用Ubuntu做云原生开发,特别是涉及无服务器架构,AWS SAM这套东西迟早绕不开。我最早接触SAM是在一次内部项目迁移里,团队要把一堆Lambda函数从手动打包上传的原始流程里解放出来,当时对比了一圈工具,最后定下来用SAM。坦白讲,刚开始也踩了不少坑,尤其是Ubuntu环境下各种依赖、权限、Python版本的问题轮着来,网上的教程又零零散散,今天是这个版本,明天是那个参数,照着抄都容易翻车。所以这篇我把自己在Ubuntu上完整安装、配置、验证AWS SAM的流程整理出来,尽量把所有关键选择和踩坑点都讲透,你可以当一份可复现的操作手册用。
这篇文章适合谁?一是刚接触AWS无服务器开发、想在本地跑通SAM的入门者;二是已经在用其他工具、想切换到SAM工作流的开发者;三是需要在Ubuntu作为主力开发机或CI构建环境里部署SAM的运维或平台工程师。无论你属于哪一类,只要照着走一遍,大概半小时内能把环境搭好、跑通第一个示例项目。
我会按实际操作的顺序来讲:先解释为什么需要这套工具链,再讲环境准备阶段最容易出问题的地方,然后是安装的完整动作和参数选择,接着用一个小示例项目验证是否装成功,最后是常见问题排查和几个真正省时间的技巧。内容会有点长,但每一段都是实操里会碰到的东西。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心概念与工具链拆解:搞清楚SAM到底是个什么角色
2.1 SAM在AWS无服务器开发里的位置
AWS SAM(Serverless Application Model)本质上是一个开源框架,它把无服务器应用的资源定义用一种简化的语法描述出来,然后底层还是转换成AWS CloudFormation模板来执行部署。换句话说,SAM是站在CloudFormation肩膀上的一个更贴近开发者心智的抽象层。
为什么要多这一层抽象?举个例子:如果你直接写CloudFormation模板来定义一个Lambda函数加一个API Gateway接口,你需要分别写AWS::Lambda::Function、AWS::ApiGateway::RestApi、AWS::ApiGateway::Method,还要手动处理角色权限、策略、映射关系,一个最小的接口可能要上百行YAML。而用SAM,核心定义大概这么几行就够:
yaml复制AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.12
Events:
HelloWorldApi:
Type: Api
Properties:
Path: /hello
Method: get
Transform 声明告诉CloudFormation:这个模板需要用SAM的语义来解析,然后SAM会把简化的 AWS::Serverless::Function 展开成完整的函数、角色、事件源映射等资源。这也是为什么你在SAM模板里永远看不到传统CloudFormation那么多繁琐的IAM角色定义——SAM会自动生成默认的执行角色,当然你也可以显式覆盖。
2.2 SAM CLI的三大核心职责
理解了SAM是什么,再看CLI工具就清楚了。SAM CLI(即sam命令行工具)在本地主要做三件事:
第一,本地构建。sam build 会在一个隔离的环境里处理你的依赖。比如你用Python写的函数,它会读取 requirements.txt,在本地把依赖安装好,和代码一起组织成一个部署包;如果用Node.js,就解析 package.json。
第二,本地运行与调试。sam local start-api 可以在你本机启动一个模拟API Gateway的HTTP服务,点一下浏览器就能调你的Lambda函数;sam local invoke 则直接调用单个函数。这个能力非常实用,很多时候不用把代码部署上云,本地就能完成逻辑验证和联调。
第三,打包与部署。sam package(现在新版也可以直接用 sam deploy 一步完成)会把本地构建产物上传到S3,然后生成或更新CloudFormation堆栈,实现云上部署。
2.3 为什么在Ubuntu上装比Mac稍微麻烦一点
在macOS上装SAM通常一条Homebrew命令就解决了,但Ubuntu上需要你自己处理几个前置环境。我见过很多人在这一步卡住,不是因为SAM本身难装,而是前置的Python、pip、Docker、AWS CLI版本之间出了配合问题。
先说Python。SAM CLI是基于Python实现的,虽然新版CLI已经打包成了独立的二进制文件,对系统Python的依赖已经降低了很多,但部分功能(比如某些构建流程、插件机制)仍然要求
