【发布时间】:2020-06-24 17:42:24
【问题描述】:
我目前正在为我的服务实现图像存储架构。
正如我在一篇文章中所读到的,移动整个
是个好主意
图片上传和下载到外部云对象存储的流量。
https://medium.com/@jgefroh/software-architecture-image-uploading-67997101a034
我注意到有许多云对象存储提供商:
- 亚马逊 S3
- 谷歌云存储
- Microsoft Azure Blob 存储
- 阿里巴巴对象存储
- Oracle 对象存储
- IBM 对象存储
- Backblaze B2 对象
- 超大规模对象存储
- Aruba 对象存储
- OVH 对象存储
- DreamHost DreamObjects
- Rackspace 云文件
- 数字海洋空间
- 芥末热对象存储
我的第一选择是 Amazon S3,因为
我几乎所有的系统基础设施都位于 AWS 上。
但是我发现这个对象存储存在很多问题。
(以下如有错误请指正)
1) 昂贵的日志交付
AWS 对所有操作请求收费。如果我必须为所有请求付费,我希望查看所有请求日志。我想尽快得到这些日志。 AWS S3 提供日志传递,但延迟很大,并且每个日志在其他 S3 存储桶中作为单独的文件提供,因此每个日志都是一个单独的 S3 写入请求。写入请求的成本更高,每 100 万个请求的成本约为 5 美元。每当发出请求时,还有另一种触发 AWS Lambda 的选项,但是每 1M lambda 调用也需要额外花费 0.2 美元。总而言之 - 在我看来,S3 请求的日志交付方式非常昂贵。
2) 无法为整个存储桶全局配置最大对象内容长度。
我还没有找到为整个存储桶配置最大对象大小(内容长度)限制的可能性。简而言之 - 我希望有可能阻止上传大于所选存储桶指定限制的文件。我知道可以在预签名的 PUT url 中指定上传文件的内容长度,但是我认为这应该可以为整个存储桶全局配置。
3) 无法直接在存储桶上配置每 IP 数每分钟的请求速率限制。
因为所有 S3 请求都是收费的,所以我希望有可能
限制将在我的存储桶上从一个 IP 号发出的请求的限制。
我想防止一个IP号的大量上传和下载
我希望它可以为整个存储桶配置。
我知道附加到 Cloudfront 的 AWS WAF 可以提供此功能
然而,这样的 WAF 检查请求太昂贵了!
您必须为每 100 万个检查请求支付 0.60 美元。
直接 Amazon S3 请求每 100 万个请求花费 0.4 美元,
所以完全没有意义,而且完全没有利润
使用 AWS WAF 作为 S3 请求的速率限制选项,作为 DOS 攻击的“钱包保护”。
4) 无法创建“一次性 - 上传”预签名 URL。
只要未过期,生成的预签名 URL 就可以多次使用。
这意味着您可以使用相同的预签名 URL 多次上传一个文件。
如果 AWS S3 API 能够提供创建“一次性上传”预签名 URL 的可能性,那就太好了。我知道我可以自己实现这样的“一次性上传”功能。
例如看这个链接https://serverless.com/blog/s3-one-time-signed-url/
但是在我看来,这样的功能应该直接通过 S3 API 提供
5) 对 S3 的每个请求都是收费的!
假设您创建了一个私有存储桶。
但是没有人可以访问其中的数据....
互联网上的任何人都可以在您的存储桶上运行批量请求...
亚马逊将向您收取所有被禁止的 403 请求的费用!!!
有人可以“掏空我的钱包”不是很舒服
任何时候只要知道我的桶的名字!
这远非安全!,特别是如果你给某人
带有存储桶地址的直接 S3 预签名 URL。
每个知道bucket名称的人都可以运行批量403请求并耗尽我的钱包!
有人已经在这里问过这个问题,我想这仍然是一个问题
https://forums.aws.amazon.com/message.jspa?messageID=58518
在我看来,禁止的 403 请求根本不应该收费!
6) 无法通过 NaCL 规则阻止到 S3 的网络流量
因为对 S3 的每个请求都是收费的。
我希望有可能完全阻止
在较低网络层中到我的 S3 存储桶的网络流量。
因为 S3 存储桶不能放在私有 VPC 中
我无法通过 NaCl 规则阻止来自特定 IP 号码的流量。
我认为 AWS 应该为 S3 存储桶提供这样的 NaCl 规则
(我的意思是 NaCL 规则而不是仅阻止应用层的 ACL 规则)
由于所有这些问题,我正在考虑使用 nginx
作为对我的私有 S3 存储桶发出的所有请求的代理
此解决方案的优点:
- 我可以免费对 S3 的请求进行速率限制
- 我可以在我的 nginx 上免费缓存图像 - 减少对 S3 的请求
- 我可以使用 Lua Resty WAF 添加额外的安全层 (https://github.com/p0pr0ck5/lua-resty-waf)
- 我可以快速切断请求正文大于指定的请求
- 我可以使用 openresty 提供额外的请求身份验证
(可以在每个请求上执行自定义 lua 代码)
- 我可以轻松快速地从我的 EC2 nginx 机器上获取所有访问日志,并使用 cloud-watch-agent 将它们转发到 Cloud Watch。
这种解决方案的缺点:
我必须通过我的 EC2 机器将所有流量传输到 S3,并使用自动扩展组扩展我的 EC2 nginx 机器。
对于知道我的存储桶名称的每个人来说,仍然可以从 Internet 直接访问 S3 存储桶!
(无法在私有网络中隐藏 S3 存储桶)
我的问题
您认为这种在对象存储前使用反向代理 nginx 服务器的方法好吗?
或者更好的方法是寻找替代的云对象存储提供商,而不是代理对象存储请求?
我非常感谢替代存储提供商的建议。
有关给定推荐的此类信息将是首选。
对象存储提供程序名称
A. INGRESS 流量的价格是多少?
B. EGRESS 流量的价格是多少?
C. REQUESTS 的价格是多少?
D. 有哪些付款方式可用?
E. 是否有长期协议?
F. 数据中心在哪里?
G. 是否提供与 S3 兼容的 API?
H. 它是否提供对所有请求日志的完全访问权限?
一、是否为桶提供每IP每分钟可配置的速率限制?
J. 是否允许在私有网络中隐藏对象存储或仅允许来自特定 IP 号的网络流量?
在我看来,一个完美的云对象存储提供商应该:
1) 提供桶上所有请求的访问日志(IP 号、响应码、内容长度等)
2) 提供对每分钟每个 IP 数的桶请求进行速率限制的可能性
3) 提供在网络层切断来自恶意 IP 号码的流量的可能性
4) 提供在私有网络中隐藏对象存储桶或仅授予指定 IP 号码访问权限的可能性
5) 禁止 403 请求不收费
我会非常感谢所有的答案、cmets 和建议
最好的问候
【问题讨论】:
标签: amazon-web-services nginx amazon-s3 object-storage cloud-object-storage