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 引擎错误](https://static.pigsec.cn/wp-content/uploads/repos/cas/fe/fee55cbc663a49c22064ec877a3a194cda40fe1b806aee1ed1aefb59d472fdf8.png) 启动 Docker Desktop 后,`hello-world` 容器成功运行,并且 AWS CLI 返回了其版本信息。 ![前置条件通过](https://static.pigsec.cn/wp-content/uploads/repos/cas/d7/d716b10dda13ab9cd77a0385341679611e620f0fd73f4860c980ab6299ffafc8.png) ### 2. 安全加载 LocalStack token 我从我的 LocalStack 工作区获取了一个 Developer Token。我没有将 token 直接放在 `export` 命令中,而是通过隐藏提示加载它,这样它就不会显示在屏幕上或 shell 历史记录中。 ``` read -rsp "Paste your LocalStack token: " LOCALSTACK_AUTH_TOKEN export LOCALSTACK_AUTH_TOKEN ``` ![已加载 token 但未暴露](https://static.pigsec.cn/wp-content/uploads/repos/cas/f0/f03e11e0b1279039a255f3c1630dfac91b7992bbda790df3f0cda1e77a03cb48.png) ### 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` 状态。 ![LocalStack 已就绪](https://static.pigsec.cn/wp-content/uploads/repos/cas/72/7271dd2df0f584a432565b75a072f9156e451f1c2b1d2ef792a19d4a26981e1c.png) ### 4. 健康和许可证检查 ``` docker ps --filter name=localstack curl -s http://localhost:4566/_localstack/info curl -s http://localhost:4566/_localstack/health ``` 容器报告状态为 `healthy`,许可证标志为 `true`,并且 LocalStack 服务可用。 ![健康检查](https://static.pigsec.cn/wp-content/uploads/repos/cas/40/4085a4b01e2e8f10e3a93a5c112cd77643f7792146370cbee3b610482f6d4583.png) ### 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 账户。 ![LocalStack STS 身份](https://static.pigsec.cn/wp-content/uploads/repos/cas/75/75682b80ee1b0d73ddf7cb8d0b7d12b3c9d1629bc8a06d02421c1d8ce73ba966.png) ### 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 验证了这些资源。 ![CLI 资源验证](https://static.pigsec.cn/wp-content/uploads/repos/cas/8a/8a770116213280e91e1f8889b5b4e188e1e25e1a8ada03077e9c78e4ba4d81e4.png) ## Resource Browser 结果 ### S3 存储桶中包含了上传的 `hello.txt` 对象。 ![S3 存储桶和对象](https://static.pigsec.cn/wp-content/uploads/repos/cas/09/09dec5dcd256df1deff4800118e6f464fbb672a3c199b1a08d966f04041a96e8.png) ### DynamoDB `Students` 表处于 active 状态,并且配置了 `id` 作为其字符串分区键。 ![DynamoDB Students 表](https://static.pigsec.cn/wp-content/uploads/repos/cas/ce/ce68634e7bfce14a7d1af38fc78d1c8bd34bf884f2fa777cf29758542c4ed31c.png) ### IAM 本地 IAM 服务包含了 `lab-student` 用户。 ![IAM lab-student 用户](https://static.pigsec.cn/wp-content/uploads/repos/cas/0c/0cad606e00181d4d3ee8d5d1c01574981ce2da8e472e308b99882a452644fa00.png) ## 安全提示 - 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, 安全防御评估, 本地开发环境, 测试, 请求拦截