前言:
生产环境都比较注重安全问题,如果我们仅使用 S3 来托管静态网站的话,S3 则必须要对外公开访问权限,虽说可以通过访问控制列表
来限制访问者只对桶有只读权限,但用户还是直接接触到了S3桶
所以我们可以选择一个更优的方案,私有S3 + Cloudfront 托管静态网站,S3桶指定策略只有CloudFront的 IP段 具有GetObject
的权限,这样既保证了隐私性,也能通过CloudFront提高访问速度,额外提一点,在如图所示的结构中,AWS CloudFront 前端会收取双向流量费用,但是 CLoudFront 、S3 这一段仅收取CloudFront 到 S3 的单向流量,从 S3 到 CloudFront 是不收取流量费用的。
如图所示,我们需要使用私有S3托管静态网站,前端连接CloudFront服务。所以我们的部署工作主要包含两个阶段:
阶段一:创建S3桶,托管静态网站,设置策略
阶段二:创建CLoudFront分配,将S3与CloudFront分配关联起来,为测试域名创建CNAME解析到CloudFront的域名
阶段一:创建S3桶,托管静态网站
说明:因为S3管理页面是不分区的——“全球”,所以在创建存储桶时,需要指定该存储桶所在的区域。这次测试部署的区域是中国北京,在为桶命名时可以根据具体项目进行命名,因为我是测试环境,所以名字就随便取了。
1、创建桶
由于我们是重新创建存储桶,所以不复制任何桶的设置。
可以根据自己需求开启桶的版本控制、服务访问日志等
这里为了测试仅S3托管静态网站能否实现,所以暂时不禁止公共访问
2、上传代码
前端代码的index.html、error.html文档一定要在S3桶的根目录下
3、设置静态网站托管
S3桶界面,点击属性
,静态网站托管
,设置索引文档、错误文档
,如果有重定向请求可以自行设置
4、测试访问
本地url填入S3端点url值,测试能否正常访问
5、设置S3访问策略
测试没有问题之后,我们就需要将S3设置为私有(禁止公共访问权限),设置仅CloudFront
的IP段
具有S3桶的GetObject权限
权限
,存储桶策略
,自定义策略如下,然后组织公共访问权限
开启禁止公共访问
{
"Version": "2012-10-17",
"Id": "Policy1603677181839",
"Statement": [
{
"Sid": "Stmt1603676761051",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws-cn:s3:::桶名/*"
},
{
"Sid": "Stmt1603677169337",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws-cn:s3:::桶名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"52.82.128.0/19",
"36.103.232.0/25",
"36.103.232.128/26",
"58.254.138.0/25",
"58.254.138.128/26",
"111.51.66.0/24",
"116.129.226.0/25",
"116.129.226.128/26",
"118.193.97.64/26",
"118.193.97.128/25",
"119.147.182.0/25",
"119.147.182.128/26",
"120.52.12.64/26",
"120.52.22.96/27",
"120.52.39.128/27",
"120.52.153.192/26",
"120.232.236.0/25",
"120.232.236.128/26",
"120.253.240.192/26",
"120.253.241.160/27",
"120.253.245.128/26",
"120.253.245.192/27",
"180.163.57.0/25",
"180.163.57.128/26",
"210.51.40.0/24",
"223.71.11.0/27",
"223.71.71.96/27",
"223.71.71.128/25"
]
}
}
}
]
}
阶段二:创建CLoudFront分配,将S3与CloudFront分配关联起来,为测试域名创建CNAME解析到CloudFront的域名
1、CloudFront控制台,创建分配
,填写源域名
(S3桶的访问url)、默认缓存行为
,查看器协议策略
(根据个人需求),允许的HTTP方法
,TTL
在分配设置
,备用域名
填写测试域名(必须填写一个可用的域名,这里测试环境使用的是个人闲置的已备案域名),创建分配
,完成
查看状态,直到状态变为已部署
,表示设置部署成功了