【发布时间】:2018-06-06 14:32:27
【问题描述】:
假设用户的头像已上传并存储在 Amazon S3 上,我们有一个名为 mywebsite.com 的域,我想使用 CloudFlare 来缓存 S3 存储桶中的文件。我该怎么做?
【问题讨论】:
标签: amazon-s3 cloudflare
假设用户的头像已上传并存储在 Amazon S3 上,我们有一个名为 mywebsite.com 的域,我想使用 CloudFlare 来缓存 S3 存储桶中的文件。我该怎么做?
【问题讨论】:
标签: amazon-s3 cloudflare
我们可以在 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 访问它,并且可以在他们的网站上的某个地方找到。另外我相信Id 和Sid 可以包含任何对您的情况有意义的信息。
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。
【讨论】:
Sid(Statement ID)确实是一个不透明的标签,方便起见,服务不解释。
如果您将 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/
【讨论】: