如何通过 CloudFlare 从 S3 提供文件

Posted

技术标签:

【中文标题】如何通过 CloudFlare 从 S3 提供文件【英文标题】:How to serve files from S3 via CloudFlare 【发布时间】:2018-06-06 14:32:27 【问题描述】:

假设用户的头像已上传并存储在 Amazon S3 上,我们有一个名为 mywebsite.com 的域,我想使用 CloudFlare 来缓存 S3 存储桶中的文件。我该怎么做?

【问题讨论】:

【参考方案1】:

我们可以在 cloudflare 网站上找到的文档相当隐晦,我不得不在 Google 上进行了很多搜索才能使其正常工作。所以这是我的解决方案,可能并不全面,但可能足以开始使用。

1) 创建一个名为avatars.mywebsite.com的存储桶

2) 向其中添加以下策略。政策,而不是 CORS。


    "Version": "2012-10-17",
    "Id": "http referer policy",
    "Statement": [
        
            "Sid": "CloudFlare Requests",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::avatars.mywebsite.com/*",
            "Condition": 
                "IpAddress": 
                    "aws:SourceIp": [
                        "103.21.244.0/22",
                        "103.22.200.0/22",
                        "103.31.4.0/22",
                        "104.16.0.0/12",
                        "108.162.192.0/18",
                        "131.0.72.0/22",
                        "141.101.64.0/18",
                        "162.158.0.0/15",
                        "172.64.0.0/13",
                        "173.245.48.0/20",
                        "188.114.96.0/20",
                        "190.93.240.0/20",
                        "197.234.240.0/22",
                        "198.41.128.0/17"
                    ]
                
            
        
    ]

我认为它的作用是限制对存储桶的访问,以便只能使用属于 CloudFlare 的那些 IP 访问它,并且可以在他们的网站上的某个地方找到。另外我相信IdSid 可以包含任何对您的情况有意义的信息。

3) 在CloudFlare DNS 管理器中添加 CNAME 记录。名称应为avatars,值应为avatars.mywebsite.com.s3.amazonaws.com

4) 现在,如果您想从您的网站访问存储桶中具有类似user/1/avatar.jpg 的路径的文件,请使用以下 src:

https://avatars.mywebsite.com/user/1/avatar.jpg

5) 值得指出的是,如果使用 HTTPS,可能需要在 CloudFlare 仪表板中将 SSL 级别从 Full(Strict) 更改为 Full

【讨论】:

不错。 “我相信它的作用是限制对存储桶的访问,以便只能使用这些 IP 访问它” 从技术上讲,它所做的不是限制存储桶,而是允许未经身份验证的私有访问当源 IP 是列出的地址之一时,对象。如果对象 ACL、存储桶策略和存储桶 ACL 不将存储桶中的内容对所有人公开,则最终效果是相似的。 Sid(Statement ID)确实是一个不透明的标签,方便起见,服务不解释。 嗨,我有几个问题。当这些 IP 发生变化时,Cloudflare 会通知您吗?他们现在与两年前发表这篇文章时不同。我想知道如果某些 CF IP 在更改时被此存储桶阻止,是否会导致问题。此外,这使 Cloudflare 能够缓存您的头像图像,对吗?【参考方案2】:

如果您将 s3 存储桶用于私有和公共对象,则此解决方案更适合。除非 IP 属于 Cloudflare,否则它会限制公共访问。所以它用自定义域透明地替换了 s3.amazonaws.com。


    "Version": "2012-10-17",
    "Id": "http referer policy",
    "Statement": [
        
            "Sid": "CloudFlare Requests",
            "Effect": "Deny",
            "Principal": 
                "AWS": "*"
            ,
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::avatars.mywebsite.com/*",
            "Condition": 
                "NotIpAddress": 
                    "aws:SourceIp": [
                        "173.245.48.0/20",
                        "103.21.244.0/22",
                        "103.22.200.0/22",
                        "103.31.4.0/22",
                        "141.101.64.0/18",
                        "108.162.192.0/18",
                        "190.93.240.0/20",
                        "188.114.96.0/20",
                        "197.234.240.0/22",
                        "198.41.128.0/17",
                        "162.158.0.0/15",
                        "104.16.0.0/12",
                        "172.64.0.0/13",
                        "131.0.72.0/22",
                        "2400:cb00::/32",
                        "2606:4700::/32",
                        "2803:f800::/32",
                        "2405:b500::/32",
                        "2405:8100::/32",
                        "2a06:98c0::/29",
                        "2c0f:f248::/32"
                    ]
                
            
        
    ]

P.S:别忘了更新 CloudFlare 服务器列表https://www.cloudflare.com/ips/

【讨论】:

我已经尝试了上述解决方案,并且还更新了cloudflare DNS中的CNAME。但是,当我尝试访问存储桶中的对象时,即使将存储桶更改为公共,我也会被拒绝访问。还有什么要检查的吗?

以上是关于如何通过 CloudFlare 从 S3 提供文件的主要内容,如果未能解决你的问题,请参考以下文章

如何降低数据传输成本? Amazon S3 --> Cloudflare --> 访客

带有 Cloudflare 的 S3 不允许直接访问

如何通过节点 expressjs 从 s3 提供静态网站?

如何开通 CloudFront 和 Route 53

使用 cloudflare 将 CNAME 分配给我在亚马逊 S3 中的静态网站存储桶

如何使用提供的 url 从 s3 下载文件?