0

我目前正在为我的服务实现图像存储架构。 正如我在一篇文章中所读到的,将整个图像上传和下载流量
移动到外部云对象存储是一个好主意。https://medium.com/@jgefroh/software-architecture-image-uploading-67997101a034

我注意到有许多云对象存储提供商:

- Amazon S3
- Google 云存储
- Microsoft Azure Blob 存储
-阿里巴巴对象存储
- Oracle 对象存储
- IBM 对象存储
- Backblaze B2 对象
- Exoscale 对象存储
- Aruba 对象存储
- OVH 对象存储
- DreamHost DreamObjects
- Rackspace 云文件
-数字海洋空间
- Wasabi Hot Object Storage


我的第一选择是 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 请求的费用!只知道我的bucket的名字就可以随时“掏空我的钱包”,这不是很舒服!这远非安全!,特别是如果您直接向某人提供带有存储桶地址的 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 规则(我的意思是 NaCLs 规则而不是仅阻止应用程序层的 ACLs 规则)

由于所有这些问题,我正在考虑使用 nginx
作为对我的私有 S3 存储桶的所有请求的代理


该解决方案的优点:

  1. 我可以免费对 S3 的限制请求进行评级,但是我想要
  2. 我可以在我的 nginx 上免费缓存图像 - 对 S3 的请求更少
  3. 我可以使用 Lua Resty WAF 添加额外的安全层(https://github.com/p0pr0ck5/lua-resty-waf
  4. 我可以快速切断请求正文大于指定的请求
  5. 我可以使用 openresty 提供额外的请求身份验证
    (可以在每个请求上执行自定义 lua 代码)
  6. 我可以轻松快速地从我的 EC2 nginx 机器上获取所有访问日志,并使用 cloud-watch-agent 将它们转发到 cloud watch。

这种解决方案的缺点:

  1. 我必须通过我的 EC2 机器将所有流量传输到 S3,并使用自动缩放组扩展我的 EC2 nginx 机器。

  2. 对于知道我的存储桶名称的每个人来说,仍然可以从互联网直接访问 S3 存储桶!
    (无法在私有网络中隐藏 S3 存储桶)


我的问题

  1. 您认为这种在对象存储前使用反向代理 nginx 服务器的方法好吗?

  2. 或者更好的方法是只找到替代的云对象存储提供商而不是代理对象存储请求?
    我会非常感谢替代存储提供商的建议。
    有关给定推荐的此类信息将是首选。

对象存储提供程序名称

A. INGRESS 流量的价格是多少?
B. EGRESS 流量的价格是多少?
C. REQUESTS 的价格是多少?
D. 有哪些付款方式可用?
E. 是否有任何长期协议?
F. 数据中心位于哪里?
G. 是否提供与 S3 兼容的 API?
H. 它是否提供对所有请求日志的完全访问权限?
I. 它是否为桶提供每分钟每 IP 数的可配置速率限制?
J. 是否允许在私有网络中隐藏对象存储或仅允许来自特定 IP 号的网络流量?

在我看来,一个完美的云对象存储提供商应该:

1) 提供对存储桶发出的所有请求的访问日志(IP 号、响应代码、内容长度等)
2) 提供对每分钟每个 IP 号的存储桶请求进行速率限制的可能性
3) 提供在网络层切断来自恶意 IP 号码的流量的
可能性 4) 提供在私有网络中隐藏对象存储桶或仅授予指定 IP 号码访问权限的可能性
5) 对禁止的 403 请求不收费

我将非常感谢所有的答案、评论和建议
最好的问候

4

2 回答 2

2

使用 nginx 作为云对象存储的反向代理对于许多用例来说是一个好主意,您可以在网上找到一些关于如何这样做的指南(至少使用 s3)。

我不熟悉所有云存储提供商提供的所有功能,但我怀疑它们中的任何一个都能为您提供 nginx 的所有功能和灵活性。

关于你的缺点:

  1. 扩展始终是一个问题,但您可以通过基准测试看到,即使在小型机器中,nginx 也可以处理大量吞吐量

  2. AWS中有解决方案。首先将您的 S3 存储桶设为私有,然后您可以:

    • 仅允许从运行您的 nginx 服务器的 EC2 实例访问您的存储桶
    • 为您的 S3 存储桶生成预签名 URL,并使用 nginx 将它们提供给您的客户端。

请注意,您的第二个问题的两种解决方案都需要一些开发

于 2020-03-28T11:16:12.537 回答
1

如果您有 AWS 基础设施并希望实施本地 S3 兼容 API,您可以查看MinIO

它是一种高性能对象存储,通过纠删码保护数据保护

于 2020-03-31T12:54:41.447 回答