我之前在折腾无服务器应用的时候,第一次接触AWS SAM就被它的安装流程折腾了一晚上。Ubuntu环境、Python版本、Docker依赖、权限配置,看起来都是小问题,叠在一起却能逼疯人。这篇东西就把我从零安装AWS SAM的完整过程整理出来,包括版本选型、依赖处理、本地调试、部署流程和常见问题排查,照着走一遍就能把环境跑起来,避免你重复踩坑。
如果你第一次听说SAM,我先用一句话说清楚它是什么:AWS SAM(Serverless Application Model)是AWS官方提供的无服务器应用模型,用一套简化后的模板语法描述Lambda函数、API Gateway、DynamoDB这些资源,让开发者可以用接近本地开发的方式去编写、调试和部署无服务器应用。简单理解,它就是CloudFormation的“化简版”,专门为Lambda这类事件驱动场景优化。在Ubuntu上把它装好,你的开发机才算真正具备无服务器应用的完整开发能力。
1. 安装前准备:Ubuntu环境与依赖梳理
1.1 为什么先确认系统版本和架构
很多人上来就执行安装命令,结果装完一跑就报错,然后开始怀疑人生。其实问题多半出在系统版本和CPU架构不匹配上。AWS SAM CLI的安装包区分x86_64和arm64,Ubuntu系统也有20.04、22.04、24.04等不同版本。版本差距影响Python版本和依赖库的兼容性,架构不匹配则直接决定你该下载哪个安装包。
先执行这两条命令,摸清楚自己的底子:
bash复制lsb_release -a
uname -m
lsb_release -a查看系统版本,uname -m查看CPU架构。绝大多数PC和服务器是x86_64,树莓派或部分ARM云服务器会输出aarch64。下载时对应选择x86_64或arm64的包,这一步错了后面全是坑。我遇到过有人拿arm64的笔记本下了x86_64的SAM CLI包,安装倒是没报错,真正执行sam init的时候直接提示无法执行二进制文件,排查半天才发现是架构问题。
系统版本方面,Ubuntu 20.04及以上带Python 3.8+,完全满足SAM CLI的要求。如果你还在用18.04这种老版本,建议先升级系统或者用pyenv管理Python版本,别在旧版系统上死磕。
1.2 安装Python与pip,版本锁定别贪新
SAM CLI本身是用Python编写的工具,虽然现在官方提供了独立的二进制发行包,系统里依然需要一个可用的Python环境来支撑构建流程和插件机制。我这里说的是推荐方案:直接用官方二进制包安装SAM CLI,但Python的pip还是要在系统里备好,因为后续你可能需要安装一些辅助工具。
bash复制sudo apt update
sudo apt install python3 python3-pip -y
python3 --version
pip3 --version
执行完确认Python版本在3.7以上即可。这里我不建议你为了追求“最新”去装Python 3.12或者3.13之类,因为AWS SAM在构建Node.js或Python运行时环境的镜像时,对系统Python版本并没有硬性要求,但pip版本过新反而可能在某些情况下跟系统包管理器冲突。稳妥起见,系统自带版本够用就行。
有一个细节需要注意:Ubuntu 22.04默认有python3命令,但pip3可能没有随python3一起安装。如果提示找不到pip3,手动执行sudo apt install python3-pip就行。安装完之后,我不建议直接sudo pip3 install全局装东西,最好用pip3 install --user把工具装在用户目录下,避免污染系统环境。这个习惯能帮你省掉很多版本冲突的麻烦。
1.3 Docker是绕不开的依赖,别偷懒
SAM CLI本地调试的核心机制是通过Docker拉起一个Lambda运行时的模拟环境,所以Docker不是可选项,是必选项。如果只想写模板不调试,那可以不装;但只要你打算用sam local invoke或sam local start-api,Docker就必须先跑起来。
安装Docker的方式很多,Ubuntu上最简单的就是直接装发行版自带的docker.io包:
bash复制sudo apt install docker.io -y
sudo systemctl start docker
sudo systemctl enable docker
docker --version
装完之后把当前用户加入docker组,这样不用每次敲sudo:
bash复制sudo usermod -aG docker $USER
newgrp docker
注意,执行完usermod之后当前终端要执行newgrp docker重新加载用户组,或者干脆注销重新登录。我早期就是没做这一步,直接去跑sam local invoke,白白为权限问题折腾了半小时。如果你不想用do
