Aaapite/localstack-aws-test
GitHub: Aaapite/localstack-aws-test
利用 Docker、AWS CLI 和 LocalStack 在本地搭建零成本的 AWS 实验环境,用于学习和验证 S3、DynamoDB 和 IAM 资源的创建与管理。
Stars: 0 | Forks: 0
# LocalStack AWS 测试
本仓库记录了我在本地使用 Docker、AWS CLI 和 LocalStack 搭建的一个小型 AWS 环境。我完成这个项目是为了学习 **IKB42603 云计算安全基础**,作为在不创建真实 AWS 账户计费资源的情况下,学习使用 AWS 服务的入门实践。
我的主要目标是确保命令行和浏览器控制台连接到同一个本地环境。我使用 AWS CLI 创建了相关资源,然后在 LocalStack Resource Browser 中逐一进行了验证。
## 构建内容
| 服务 | 资源 | 配置 |
|---|---|---|
| Amazon S3 | `ccse-demo-bucket` | 包含 `hello.txt` |
| Amazon DynamoDB | `Students` | 名为 `id` 的字符串分区键 |
| AWS IAM | `lab-student` | 本地测试用户 |
所有资源都在 `us-east-1` 区域的 LocalStack 账户 `000000000000` 下运行。
## 使用的工具
- Windows 11
- Git Bash
- Docker Desktop 29.1.2
- AWS CLI 2.36.14
- LocalStack 2026.7.1
- LocalStack Web Application / Resource Browser
## 设置过程
### 1. 前置条件检查
我首先检查了 Docker 和 AWS CLI 是否可用。我的第一次 Docker 测试失败了,因为虽然安装了 Docker Desktop,但其 Linux 引擎并未运行。

启动 Docker Desktop 后,`hello-world` 容器成功运行,并且 AWS CLI 返回了其版本信息。

### 2. 安全加载 LocalStack token
我从我的 LocalStack 工作区获取了一个 Developer Token。我没有将 token 直接放在 `export` 命令中,而是通过隐藏提示加载它,这样它就不会显示在屏幕上或 shell 历史记录中。
```
read -rsp "Paste your LocalStack token: " LOCALSTACK_AUTH_TOKEN
export LOCALSTACK_AUTH_TOKEN
```

### 3. 启动 LocalStack
我将 LocalStack 作为 Docker 容器运行,并将端口 `4566` 暴露为本地 AWS gateway。需要使用 `MSYS_NO_PATHCONV=1` 是因为 Git Bash 在 Windows 上会重写 Linux 风格的 Docker 卷路径。
```
MSYS_NO_PATHCONV=1 docker run -d --name localstack \
-p 4566:4566 \
-p 4510-4559:4510-4559 \
-e LOCALSTACK_AUTH_TOKEN="$LOCALSTACK_AUTH_TOKEN" \
-v /var/run/docker.sock:/var/run/docker.sock \
localstack/localstack
```
日志确认许可证已激活,并且实例已达到 `Ready` 状态。

### 4. 健康和许可证检查
```
docker ps --filter name=localstack
curl -s http://localhost:4566/_localstack/info
curl -s http://localhost:4566/_localstack/health
```
容器报告状态为 `healthy`,许可证标志为 `true`,并且 LocalStack 服务可用。

### 5. 将 AWS CLI 连接到本地 endpoint
我使用了一个名为 `localstack` 的独立 profile 以及虚拟凭证。这使得本地设置与任何真实的 AWS 配置保持隔离。
```
aws configure set aws_access_key_id test --profile localstack
aws configure set aws_secret_access_key test --profile localstack
aws configure set region us-east-1 --profile localstack
export AWS_PROFILE=localstack
export EP='--endpoint-url=http://localhost:4566'
```
STS 身份检查返回了账户 `000000000000`,这是预期的 LocalStack 账户。

### 6. 创建资源
```
# S3 bucket 和 object
aws $EP s3 mb s3://ccse-demo-bucket
echo "hello cloud" > hello.txt
aws $EP s3 cp hello.txt s3://ccse-demo-bucket/
# DynamoDB table
aws $EP dynamodb create-table \
--table-name Students \
--attribute-definitions AttributeName=id,AttributeType=S \
--key-schema AttributeName=id,KeyType=HASH \
--billing-mode PAY_PER_REQUEST
# IAM user
aws $EP iam create-user --user-name lab-student
```
在检查 Web 界面之前,我先通过 CLI 验证了这些资源。

## Resource Browser 结果
### S3
存储桶中包含了上传的 `hello.txt` 对象。

### DynamoDB
`Students` 表处于 active 状态,并且配置了 `id` 作为其字符串分区键。

### IAM
本地 IAM 服务包含了 `lab-student` 用户。

## 安全提示
- LocalStack 身份验证 token 是通过隐藏提示输入的,从未被提交。
- 我使用了带有虚拟凭证的专用 AWS profile。
- 每个 AWS 命令都被重定向到 `http://localhost:4566`。
- 截图中的账户 ID 是 LocalStack 的虚拟账户,不是真实的 AWS 账户。
- LocalStack 默认是临时的,因此在环境停止之前已捕获了相关证明。
## 学习心得
本次实验最有用的部分是了解命令行、API endpoint 和 Web 控制台是如何协同工作的。即使 Docker 引擎不可用,也可以安装 Docker CLI;而在 AWS CLI 与 LocalStack 通信之前,它需要一个显式的 endpoint。在 Git Bash 中创建资源,然后在浏览器中找到相同的资源,让它们之间的关系变得更加清晰。
## 参考资料
- [LocalStack 身份验证 token](https://docs.localstack.cloud/aws/getting-started/auth-token/)
- [LocalStack 安装](https://docs.localstack.cloud/aws/getting-started/installation/)
- [LocalStack Resource Browser](https://docs.localstack.cloud/aws/connecting/console/resource-browser/)
- [AWS CLI `get-caller-identity`](https://docs.aws.amazon.com/cli/latest/reference/sts/get-caller-identity.html)
## 作者
**Izzwan Syahfiq Bin Erwandi**
计算机系统安全学士,UniKL MIIT
标签:AWS, Docker, DPI, DynamoDB, LocalStack, S3, 安全防御评估, 本地开发环境, 测试, 请求拦截