我应该使用 nginx 反向代理进行云对象存储吗?
Should I use nginx reverse proxy for cloud object storage?
我目前正在为我的服务实施图像存储架构。
正如我在一篇文章中读到的那样,整体移动
是个好主意
图像上传和下载流量到外部云对象存储。
https://medium.com/@jgefroh/software-architecture-image-uploading-67997101a034
我注意到有很多云对象存储提供商:
- 亚马逊 S3
- Google 云存储
- Microsoft Azure Blob 存储
- 阿里巴巴对象存储
- Oracle 对象存储
- IBM 对象存储
- Backblaze B2 对象
- Exoscale 对象存储
- Aruba 对象存储
- OVH 对象存储
- DreamHost DreamObjects
- Rackspace 云文件
- 数字海洋空间
- Wasabi 热对象存储
我的第一选择是 Amazon S3,因为
我几乎所有的系统基础设施都位于 AWS 上。
但是我发现这个对象存储有很多问题。
(以下任何地方如有错误请指正)
1) 昂贵的日志传送
AWS 对所有操作请求收费。如果我必须为所有请求付费,我希望看到所有请求日志。我想尽快获得这些日志。 AWS S3 提供日志传输,但有很大的延迟,并且每个日志都作为其他 S3 存储桶中的单独文件提供,因此每个日志都是一个单独的 S3 写入请求。写入请求的成本更高,每 1M 请求的成本约为 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 请求的费用为每 1M 请求 0.4 美元,
所以完全没有意义,完全没有利润
使用 AWS WAF 作为 S3 请求的速率限制选项作为 DOS 攻击的 "wallet protection"。
4) 无法创建 "one time - upload" 预签名 URL.
生成的预签名 URLs 可以多次使用,只要没有过期。
这意味着您可以使用相同的预签名 URL 多次上传一个文件。
如果 AWS S3 API 能够提供创建 "one time upload" 预签名 url 的可能性,那就太好了。我知道我可以自己实现这样的 "one time - upload" 功能。
例如看这个 link https://serverless.com/blog/s3-one-time-signed-url/
但是在我看来,此类功能应该直接通过 S3 API 提供
5) 对 S3 的每个请求都是收费的!
假设您创建了一个私有存储桶。
然而,没有人可以访问其中的数据......
互联网上的任何人都可以 运行 批量请求您的存储桶...
亚马逊将向您收取所有被禁止的 403 请求的费用!!!
有人可以"drain my wallet"不是很舒服
任何时候只知道我的桶的名字!
这远非安全!,特别是如果你给某人
使用存储桶地址直接 S3 预签名 URL。
每个知道桶名称的人都可以 运行 批量 403 请求并耗尽我的钱包!!!
这里已经有人问过这个问题了,我想这仍然是个问题
https://forums.aws.amazon.com/message.jspa?messageID=58518
在我看来禁止的 403 请求根本不应该收费!
6) 无法通过 NaCL 规则阻止到 S3 的网络流量
因为对 S3 的每个请求都是收费的。
我希望有可能完全阻止
到较低网络层中我的 S3 存储桶的网络流量。
因为S3 bucket不能放在私有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 机器。
知道我的存储桶名称的每个人仍然可以从互联网直接访问 S3 存储桶!
(无法在专用网络中隐藏 S3 存储桶)
我的问题
你觉得这种在对象存储前反向代理nginx服务器的做法好吗?
或者也许更好的方法是只找到替代的云对象存储提供商而不是代理对象存储请求?
我将非常感谢替代存储提供商的建议。
有关给定建议的此类信息将是首选。
对象存储提供商名称
一个。 INGRESS 流量的价格是多少?
B. EGRESS 流量的价格是多少?
C. REQUESTS 的价格是多少?
D. 有哪些付款选项可用?
E. 是否有长期协议?
F. 数据中心位于何处?
G.是否提供S3兼容API?
H. 它是否提供对所有请求日志的完全访问权限?
I. 它是否为存储桶提供每分钟每个 IP 数的可配置速率限制?
J. 是否允许在专用网络中隐藏对象存储或仅允许来自特定 IP 号码的网络流量?
在我看来,一个完美的云对象存储提供商应该:
1) 提供对bucket的所有请求的访问日志(IP号、响应码、content-length等)
2) 提供对每个 IP 数每分钟限制桶请求速率的可能性
3) 提供在网络层切断来自恶意IP号码的流量的可能性
4) 提供在专用网络中隐藏对象存储桶或仅允许指定 IP 号码访问的可能性
5)不对禁止的403请求收费
非常感谢所有的回答、评论和建议
最好的问候
使用 nginx 作为云对象存储的反向代理对于许多用例来说是一个好主意,您可以在线找到一些关于如何这样做的指南(至少对于 s3)。
我不熟悉所有云存储提供商提供的所有功能,但我怀疑他们中的任何一个都能为您提供 nginx 的所有功能和灵活性。
关于你的缺点:
缩放始终是一个问题,但您可以通过基准测试看到
即使在小型机器上,nginx 也可以处理大量吞吐量
AWS 中有解决方案。首先将您的 S3 存储桶设为私有,然后您可以:
- 仅允许从 EC2 instance/s 运行 您的 nginx 服务器
访问您的存储桶
- 为您的 S3 存储桶生成预签名 URL,并使用 nginx 将它们提供给您的客户端。
注意第二个问题的两个解决方案都需要一些开发
如果您拥有 AWS 基础设施并希望实施与本地 S3 兼容的 API,您可以查看 MinIO。
它是一种通过纠删码保护数据的高性能对象存储
我目前正在为我的服务实施图像存储架构。
正如我在一篇文章中读到的那样,整体移动
是个好主意
图像上传和下载流量到外部云对象存储。
https://medium.com/@jgefroh/software-architecture-image-uploading-67997101a034
我注意到有很多云对象存储提供商:
- 亚马逊 S3
- Google 云存储
- Microsoft Azure Blob 存储
- 阿里巴巴对象存储
- Oracle 对象存储
- IBM 对象存储
- Backblaze B2 对象
- Exoscale 对象存储
- Aruba 对象存储
- OVH 对象存储
- DreamHost DreamObjects
- Rackspace 云文件
- 数字海洋空间
- Wasabi 热对象存储
我的第一选择是 Amazon S3,因为
我几乎所有的系统基础设施都位于 AWS 上。
但是我发现这个对象存储有很多问题。
(以下任何地方如有错误请指正)
1) 昂贵的日志传送
AWS 对所有操作请求收费。如果我必须为所有请求付费,我希望看到所有请求日志。我想尽快获得这些日志。 AWS S3 提供日志传输,但有很大的延迟,并且每个日志都作为其他 S3 存储桶中的单独文件提供,因此每个日志都是一个单独的 S3 写入请求。写入请求的成本更高,每 1M 请求的成本约为 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 请求的费用为每 1M 请求 0.4 美元,
所以完全没有意义,完全没有利润
使用 AWS WAF 作为 S3 请求的速率限制选项作为 DOS 攻击的 "wallet protection"。
4) 无法创建 "one time - upload" 预签名 URL.
生成的预签名 URLs 可以多次使用,只要没有过期。
这意味着您可以使用相同的预签名 URL 多次上传一个文件。
如果 AWS S3 API 能够提供创建 "one time upload" 预签名 url 的可能性,那就太好了。我知道我可以自己实现这样的 "one time - upload" 功能。
例如看这个 link https://serverless.com/blog/s3-one-time-signed-url/
但是在我看来,此类功能应该直接通过 S3 API 提供
5) 对 S3 的每个请求都是收费的!
假设您创建了一个私有存储桶。
然而,没有人可以访问其中的数据......
互联网上的任何人都可以 运行 批量请求您的存储桶...
亚马逊将向您收取所有被禁止的 403 请求的费用!!!
有人可以"drain my wallet"不是很舒服
任何时候只知道我的桶的名字!
这远非安全!,特别是如果你给某人
使用存储桶地址直接 S3 预签名 URL。
每个知道桶名称的人都可以 运行 批量 403 请求并耗尽我的钱包!!!
这里已经有人问过这个问题了,我想这仍然是个问题
https://forums.aws.amazon.com/message.jspa?messageID=58518
在我看来禁止的 403 请求根本不应该收费!
6) 无法通过 NaCL 规则阻止到 S3 的网络流量
因为对 S3 的每个请求都是收费的。
我希望有可能完全阻止
到较低网络层中我的 S3 存储桶的网络流量。
因为S3 bucket不能放在私有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 机器。
知道我的存储桶名称的每个人仍然可以从互联网直接访问 S3 存储桶!
(无法在专用网络中隐藏 S3 存储桶)
我的问题
你觉得这种在对象存储前反向代理nginx服务器的做法好吗?
或者也许更好的方法是只找到替代的云对象存储提供商而不是代理对象存储请求?
我将非常感谢替代存储提供商的建议。
有关给定建议的此类信息将是首选。
对象存储提供商名称
一个。 INGRESS 流量的价格是多少?
B. EGRESS 流量的价格是多少?
C. REQUESTS 的价格是多少?
D. 有哪些付款选项可用?
E. 是否有长期协议?
F. 数据中心位于何处?
G.是否提供S3兼容API?
H. 它是否提供对所有请求日志的完全访问权限?
I. 它是否为存储桶提供每分钟每个 IP 数的可配置速率限制?
J. 是否允许在专用网络中隐藏对象存储或仅允许来自特定 IP 号码的网络流量?
在我看来,一个完美的云对象存储提供商应该:
1) 提供对bucket的所有请求的访问日志(IP号、响应码、content-length等)
2) 提供对每个 IP 数每分钟限制桶请求速率的可能性
3) 提供在网络层切断来自恶意IP号码的流量的可能性
4) 提供在专用网络中隐藏对象存储桶或仅允许指定 IP 号码访问的可能性
5)不对禁止的403请求收费
非常感谢所有的回答、评论和建议
最好的问候
使用 nginx 作为云对象存储的反向代理对于许多用例来说是一个好主意,您可以在线找到一些关于如何这样做的指南(至少对于 s3)。
我不熟悉所有云存储提供商提供的所有功能,但我怀疑他们中的任何一个都能为您提供 nginx 的所有功能和灵活性。
关于你的缺点:
缩放始终是一个问题,但您可以通过基准测试看到 即使在小型机器上,nginx 也可以处理大量吞吐量
AWS 中有解决方案。首先将您的 S3 存储桶设为私有,然后您可以:
- 仅允许从 EC2 instance/s 运行 您的 nginx 服务器 访问您的存储桶
- 为您的 S3 存储桶生成预签名 URL,并使用 nginx 将它们提供给您的客户端。
注意第二个问题的两个解决方案都需要一些开发
如果您拥有 AWS 基础设施并希望实施与本地 S3 兼容的 API,您可以查看 MinIO。
它是一种通过纠删码保护数据的高性能对象存储