私有S3 + Cloudfront 部署静态网站

私有S3 + Cloudfront 部署静态网站

Scroll Down

前言:

生产环境都比较注重安全问题,如果我们仅使用 S3 来托管静态网站的话,S3 则必须要对外公开访问权限,虽说可以通过访问控制列表来限制访问者只对桶有只读权限,但用户还是直接接触到了S3桶

所以我们可以选择一个更优的方案,私有S3 + Cloudfront 托管静态网站,S3桶指定策略只有CloudFront的 IP段 具有GetObject的权限,这样既保证了隐私性,也能通过CloudFront提高访问速度,额外提一点,在如图所示的结构中,AWS CloudFront 前端会收取双向流量费用,但是 CLoudFront 、S3 这一段仅收取CloudFront 到 S3 的单向流量,从 S3 到 CloudFront 是不收取流量费用的。

image.png

如图所示,我们需要使用私有S3托管静态网站,前端连接CloudFront服务。所以我们的部署工作主要包含两个阶段:

阶段一:创建S3桶,托管静态网站,设置策略

阶段二:创建CLoudFront分配,将S3与CloudFront分配关联起来,为测试域名创建CNAME解析到CloudFront的域名

阶段一:创建S3桶,托管静态网站

说明:因为S3管理页面是不分区的——“全球”,所以在创建存储桶时,需要指定该存储桶所在的区域。这次测试部署的区域是中国北京,在为桶命名时可以根据具体项目进行命名,因为我是测试环境,所以名字就随便取了。

1、创建桶

由于我们是重新创建存储桶,所以不复制任何桶的设置

image.png

可以根据自己需求开启桶的版本控制、服务访问日志等

image.png

这里为了测试仅S3托管静态网站能否实现,所以暂时不禁止公共访问

image.png

2、上传代码

前端代码的index.html、error.html文档一定要在S3桶的根目录下

image.png

3、设置静态网站托管

S3桶界面,点击属性静态网站托管,设置索引文档、错误文档,如果有重定向请求可以自行设置

image.png

4、测试访问

本地url填入S3端点url值,测试能否正常访问

image.png

5、设置S3访问策略

测试没有问题之后,我们就需要将S3设置为私有(禁止公共访问权限),设置仅CloudFrontIP段具有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"
                    ]
                }
            }
        }
    ]
}

image.png

阶段二:创建CLoudFront分配,将S3与CloudFront分配关联起来,为测试域名创建CNAME解析到CloudFront的域名

1、CloudFront控制台,创建分配,填写源域名(S3桶的访问url)、默认缓存行为查看器协议策略(根据个人需求),允许的HTTP方法TTL

image.png

分配设置,备用域名填写测试域名(必须填写一个可用的域名,这里测试环境使用的是个人闲置的已备案域名),创建分配,完成

image.png

查看状态,直到状态变为已部署,表示设置部署成功了

image.png

2、域名控制台创建CNAME解析,值为CloudFront的域名

image.png

image.png

3、测试访问

image.png