Abheenash/serverless-file-share
GitHub: Abheenash/serverless-file-share
基于 AWS 无服务器架构的自毁式文件分享应用,通过过期链接和自动销毁机制实现安全、临时的文件传输。
Stars: 0 | Forks: 0
# Serverless File Share — AWS 上的自毁式文件分享
通过会过期的链接分享文件。文件在静态时会被加密,链接会定时失效,文件本身也会在到期后销毁——不留痕迹。
**状态:** ✅ 所有阶段已完成 — 完整的 IaC + CI/CD([docs/stage5.md](docs/stage5.md))。请查看[架构图](docs/architecture.md)。公开构建。
## 截图
| 上传 | 分享链接 | 过期 |
|---|---|---|
|  |  |  |
## 关于本项目
一个小巧且真实的产品,演示了安全优先的 Serverless 架构:最小权限的 IAM、KMS 加密、通过预签名 URL 进行短期访问,以及完全自动化的数据生命周期。无需修补服务器,静态时的成本几乎为零。
## 目标架构
```
Sender/Recipient
│
├──> CloudFront ──> S3 (static web UI) [Stage 4]
│
└──> API Gateway ──> Lambda "issue-url"
│ │
│ └──> S3 files bucket (private, SSE-KMS)
│ ▲ presigned PUT/GET
└──> DynamoDB (metadata, TTL)
│ TTL expiry → DynamoDB Streams
└──> Lambda "reaper" ──> deletes object + metadata
(S3 lifecycle rule as backstop)
```
## 工作原理(规划)
1. 发送方请求 API 提供上传链接。Lambda 返回一个**预签名 PUT URL**(有效期较短),并将元数据项写入 DynamoDB,其 **TTL** 与文件的生命周期相匹配。
2. 文件最终存入一个**私有、使用 SSE-KMS 加密的存储桶**。Block Public Access 在账户范围内开启;任何内容都不会公开。
3. 分享链接是一个**预签名 GET URL**,其有效期由发送方选择(15 分钟到 7 天)。
4. 当 TTL 触发时,DynamoDB Streams 会触发 **reaper Lambda**,从而删除该 S3 对象及元数据项。S3 **生命周期规则**作为后备方案,以防 reaper 发生故障。
## 服务及其用途
| 服务 | 此处的角色 |
|---|---|
| S3 | 文件存储;后期也托管静态 UI |
| Lambda | issue-url(创建预签名 URL + 元数据)和 reaper(到期时删除) |
| API Gateway | HTTPS 前门、限流、后期的身份验证 |
| DynamoDB | 文件元数据;TTL 驱动自毁;Streams 触发 reaper |
| KMS | 用于静态 SSE-KMS 加密的客户管理密钥 |
| IAM | 每个 Lambda 一个最小权限角色 |
| EventBridge | 考虑用于过期的备选调度程序(记录了权衡取舍) |
| CloudFront + Route 53 | UI 分发 + 自定义域名(第 4 阶段) |
| Terraform + GitHub Actions | 基础设施即代码 + CI/CD(第 5 阶段) |
## 安全决策
- 到处开启 **Block Public Access**;访问文件的唯一方式是使用预签名 URL。
- 使用客户管理密钥的 **SSE-KMS**;密钥策略仅授予两个 Lambda 角色使用权限。
- **每个函数最小权限:** issue-url 角色可以对文件前缀执行 `s3:PutObject`/`s3:GetObject`,以及对数据表执行 `dynamodb:PutItem` —— 预签名 URL 授予的权限永远不会超过其签名者持有的权限。reaper 角色只能执行 `s3:DeleteObject` 和 `dynamodb:DeleteItem`。
- **一切皆为短期有效:** 上传 URL 在几分钟内即过期;下载有效期由发送方选择且设有上限。
- **代码中无密钥**;开启 CloudTrail 以提供完整的审计追踪。
## 路线图
- [x] 阶段 0 — 仓库、账户日常维护(IAM 管理员 + MFA、$5 预算警报)、AWS CLI
- [x] 阶段 1 — 手动 MVP:私有加密存储桶、通过 CLI 上传、预签名 GET、验证过期
- [x] 阶段 2 — API:Lambda + API Gateway 发布预签名 URL;带 TTL 的 DynamoDB 元数据
- [x] 阶段 3 — 自毁:TTL → Streams → reaper Lambda;生命周期兜底;SSE-KMS + 最小权限 IAM
- [x] 阶段 4 — S3 + CloudFront 上的最小化 Web UI(自定义域名已推迟 — 参见 docs/stage4.md)
- [x] 阶段 5 — Terraform 重构(`terraform/`,38 个资源)、GitHub Actions CI/CD、[架构图](docs/architecture.md)
**未来范围:** 身份验证(Cognito JWT)、自定义域名、可观测性等 — 在 [docs/future-scope.md](docs/future-scope.md) 中设计。
## 成本
专为在免费套餐中运行而设计:在业余爱好级别的使用量下,S3 + Lambda + DynamoDB 按需模式 + API Gateway 的成本仅需几美分。$5 的预算警报为账户提供保障。
由 Rajolu Abheenash 构建 — [github.com/Abheenash](https://github.com/Abheenash)
标签:AWS, DPI, 文件共享, 阅后即焚