概述
官网,开源(GitHub,65.1K Star,4.8K Fork)、Python实现、功能强大的本地AWS云栈工具,让开发者能够在离线环境中开发和测试云端及无服务器应用。虽然项目已于26年3月23日归档,但完全不影响学习和使用,甚至很有学习的必要。官方文档。
使用云端环境的常见痛点:开发过程需持续联网、云服务费用累积、测试环境不稳定等。
LocalStack通过在本地模拟AWS云服务,完美解决这些问题,让开发效率提升数倍。支持超多种AWS服务的本地模拟,包括S3、DynamoDB、Lambda、SQS等核心服务。
优势:
- 完全离线开发:无需连接AWS云端,保护敏感数据
- 快速迭代测试:本地环境响应速度比云端快10倍以上
- 零成本实验:无需担心云服务费用超支
- 模拟各种云服务场景:包括异常情况
- 环境一致性:开发、测试、CI/CD环境保持一致
适合用户:
- 写AWS Lambda、用CDK或Terraform管理基础设施的后端开发者
- 需要在CI里跑集成测试、不想依赖真实云环境的团队
- 学AWS服务、想动手练但不想花钱的新手
Pro版本还支持更多API和高级功能。
原理
模块化设计,通过Gateway和Handler Chain实现对AWS API请求的解析和处理:

当客户端发送AWS API请求时,请求首先经过HTTP服务器,然后通过适配器转换为LocalStack内部的HTTP请求格式。Gateway组件负责将请求分发到相应的Handler Chain,经过一系列请求处理和响应处理后,最终返回模拟的AWS响应。
请求处理的三个关键阶段
- 请求接收与适配:HTTP服务器接收客户端请求,通过适配器转换为LocalStack内部格式
- 网关与上下文处理:网关组件创建请求上下文,包含服务、操作、区域等关键信息
- 处理链执行:请求经过一系列处理器处理,包括请求解析、服务路由和响应生成
采用API Stub与Provider分离的设计模式,使得代码结构清晰且易于扩展:

每个AWS服务(如SNS)都有对应的API Stub(SnsApi类)定义接口,以及Provider(SnsProvider类)实现具体逻辑。这种分层设计使得LocalStack能够灵活支持多种服务实现方式,包括纯LocalStack代码、基于Moto库或其他开源技术。
实现层次:
- API Stub:定义接口和方法存根
- Implementation:实际业务逻辑实现
- Backend:服务状态存储
Handler Chain是处理AWS请求的核心组件,负责请求的解析、路由和处理:

处理链从LocalStackAwsGateway开始,经过一系列处理器(如ServiceNameParser、RegionEnricher、AccountIdEnricher等)逐步丰富请求上下文,最终将请求路由到相应的服务实现。这种设计使得请求处理流程清晰可见,且易于扩展和定制。
处理链主要组件
- 资源路由:处理LocalStack特定资源的请求
- 服务名称解析:识别请求的目标AWS服务
- 区域和账户信息丰富:为请求添加区域和账户上下文
- 服务请求解析:将请求转换为服务特定的格式
- 服务延迟加载:根据请求动态加载所需的服务组件
- 请求路由:将请求分发到相应的服务处理器
- 响应处理:生成并格式化响应
架构组件:
- Gateway:请求入口点
- HandlerChain:请求处理链
- RequestHandler:核心请求处理器
- ServicePluginManager:服务插件管理器
代码生成机制
为保持与AWS API的兼容性,LocalStack采用基于AWS Smithy规范的代码生成机制:

通过解析AWS官方API规范(如SNS服务的API定义),利用ASF脚手架工具自动生成服务接口代码(Server-side stubs),确保模拟的API与AWS官方保持一致。这种机制大大降低了维护成本,使LocalStack能够快速跟进AWS API的更新。
代码生成流程:
- 读取AWS官方API元数据
- 通过Boto3工具生成代码框架
- 开发者只需实现具体的业务逻辑
安装
由于LocalStack是几乎纯Python开发,最快的安装方式可能就是基于pip安装:
bash
pip install localstack
在macOS下安装可能会失败:
bash
error: failed to run custom build command for `openssl-sys v0.9.117`
cargo:rustc-check-cfg=cfg(osslconf, values("OPENSSL_NO_OCB"))
Could not find openssl via pkg-config:
Could not run `PKG_CONFIG_ALLOW_SYSTEM_CFLAGS=1 pkg-config --libs --cflags openssl`
The pkg-config command could not be found.
Most likely, you need to install a pkg-config package for your OS.
Try `brew install pkgconf` if you have Homebrew.
分析:cryptography新版本在编译Rust扩展时找不到OpenSSL开发环境。
解决方法:
bash
python3 -m pip install --upgrade pip setuptools wheel
pip3 install --only-binary=:all: cryptography
再次重试,安装成功。
macOS也可考虑通过Brew安装:
bash
brew install localstack/tap/localstack-cli
但!!!
bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Homebrew on macOS is only supported on Apple Silicon processors!
还可源码安装:
bash
git clone https://gitcode.com/GitHub_Trending/lo/localstack
cd localstack
pip install -r requirements-dev.txt
# 启动
make start
编辑docker-compose.yml文件:
yml
version: '3.8'
services:
localstack:
image: localstack/localstack
ports:
- "4566:4566" # 主API端口
- "4510-4559:4510-4559" # 各服务端口
environment:
- SERVICES=s3,dynamodb,lambda,sqs
- DEBUG=1
- DATA_DIR=/tmp/localstack/data
volumes:
- ./localstack-data:/tmp/localstack/data
- /var/run/docker.sock:/var/run/docker.sock
使用Docker Compose安装:docker compose up -d。
生产环境,支持通过Helm部署:
bash
实战
安装成功后,执行localstack命令输出(有截取处理):
bash
WARNING: The 'localstack' CLI is deprecated. Use the 'lstk' CLI instead.
The 'localstack' CLI no longer receives updates.
Get started with 'lstk', the recommended way to run LocalStack:
https://docs.localstack.cloud/aws/developer-tools/running-localstack/lstk/
Continuing with the legacy CLI...
用法: localstack [OPTIONS] COMMAND [ARGS]...
选项:
-v, --version 查询版本
-d, --debug 启用调试模式
-p, --profile TEXT Set the configuration profile
-h, --help 帮助文档
命令:
auth Authenticate with your LocalStack account
completion 补全
config 配置管理
logs 日志
restart 重启
ssh Obtain a shell in LocalStack
start 启动
status 查询状态信息
stop 停止
update 更新
wait 等待
Advanced:
aws Access additional functionality on LocalStack AWS Services
dns Manage LocalStack DNS host config
ephemeral Manage ephemeral LocalStack instances
extensions (Preview) Manage LocalStack extensions
license (Preview) Manage and verify your LocalStack license
pod Manage the state of your instance via Cloud Pods.
replicator Start a replication job or check its status
state (Preview) Export, restore, and reset LocalStack state.
# 启动
localstack start -d
# 列出所有服务的状态
localstack status services
然后配合AWS CLI或AWS Local,命令行示例:
bash
# 使用AWS CLI测试S3服务
# 创建存储桶
aws --endpoint-url=http://localhost:4566 s3 mb s3://my-bucket
# 等价于
awslocal s3 mb s3://my-bucket
# 列出存储桶内容
awslocal s3 ls
awslocal s3 ls s3://my-bucket/
# 上传文件
awslocal s3 cp ./test.txt s3://my-bucket/
# 创建表
awslocal dynamodb create-table \
--table-name MyTable \
--attribute-definitions AttributeName=Id,AttributeType=S \
--key-schema AttributeName=Id,KeyType=HASH \
--provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5
# 插入数据
awslocal dynamodb put-item \
--table-name MyTable \
--item '{"Id": {"S": "1"}, "Name": {"S": "LocalStack"}}'
# 查询数据
awslocal dynamodb get-item \
--table-name MyTable \
--key '{"Id": {"S": "1"}}'
# 创建Lambda函数
awslocal lambda create-function \
--function-name my-function \
--runtime python3.8 \
--role arn:aws:iam::123456789012:role/lambda-role \
--handler lambda_function.lambda_handler \
--zip-file fileb://function.zip
# 调用Lambda函数
awslocal lambda invoke \
--function-name my-function \
--payload '{"key": "value"}' \
output.txt
# 列出数据流
awslocal kinesis list-streams
# 创建SQS队列
awslocal sqs create-queue --queue-name test-queue
支持不同AWS服务之间的联动,如S3触发Lambda函数:
bash
# 创建S3存储桶
awslocal s3 mb s3://trigger-bucket
# 创建Lambda函数
awslocal lambda create-function ...
# 配置S3触发器
awslocal lambda add-permission ...
CI/CD
结合GitHub Actions或Jenkins等CI工具,可在本地构建完整的CI/CD管道:
yml
# .github/workflows/local-test.yml
name: Local Test
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Start LocalStack
run: docker-compose up -d
- name: Run tests
run: pytest tests/
测试
还可用于建立完整的本地测试环境:
- 单元测试:针对具体服务功能
- 集成测试:验证多个服务间的协作
- 端到端测试:模拟真实业务场景
与流行的测试框架(如pytest)集成,实现自动化测试:
py
# tests/test_s3.py
import boto3
import pytest
@pytest.fixture(scope="module")
def s3_client():
return boto3.client('s3', endpoint_url='http://localhost:4566')
def test_s3_bucket_creation(s3_client):
bucket_name = "test-bucket"
s3_client.create_bucket(Bucket=bucket_name)
response = s3_client.list_buckets()
buckets = [b['Name'] for b in response['Buckets']]
assert bucket_name in buckets
进阶开发
自定义服务扩展,支持开发者添加自定义AWS服务或扩展现有服务功能。通过理解HandlerChain机制,可:
- 添加新的RequestHandler
- 集成第三方服务
- 自定义响应处理逻辑
性能优化建议
- DNS配置优化:设置DNS_ADDRESS=0避免权限问题
- 内存管理:合理配置Docker资源限制
- 网络设置:优化容器网络配置提升响应速度
bash
bash