如何通过 CloudFlare 从 S3 提供文件
How to serve files from S3 via CloudFlare
假设用户的头像上传并存储在 Amazon S3 上,我们有一个名为 mywebsite.com
的域,我想使用 CloudFlare
来缓存 S3 存储桶中的文件.我该怎么做?
我们可以在 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
。
如果您将 s3 存储桶用于私有和 public 对象,则此解决方案更适合。它限制 public 访问,除非 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/
假设用户的头像上传并存储在 Amazon S3 上,我们有一个名为 mywebsite.com
的域,我想使用 CloudFlare
来缓存 S3 存储桶中的文件.我该怎么做?
我们可以在 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
。
如果您将 s3 存储桶用于私有和 public 对象,则此解决方案更适合。它限制 public 访问,除非 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/