1、不论文件夹还是文件,在S3都是一个对象。
比如,S3桶里没有文件夹Test。直接向桶上传文件,文件名为Test/2020.txt
那用户在控制台中能看到Test文件夹,在CLI中也能看到Test/前缀
但它不是以单独的文件夹Test/存在的,而是以文件名的前缀存在的
如果将文件删除,就会看到所谓的“Test文件夹”就随之消失了
如果需要文件夹始终存在,建议单独在控制台做创建操作,其本质为创建一个名为"Test/"的对象
创建文件夹,其实就是单独创建一个名为"Test/“对象
2、S3开启 "服务器访问日志记录"
在为特定S3桶开启 "服务器访问日志"的时候,如果日志文件的目标存储桶选择的是本桶,那么将会产生额外的访问日志(访问桶就会产生日志,产生日志文件又相当于访问桶,这样循环就会产生额外的日志文件,不便于筛查)
为了方便后期筛查,可以定义日志文件的目标前缀:
① 如果定义的前缀末尾带有 ' / ' 符号,如 ' log/ ' 那么就会产生一个文件夹,并将日志文件存放到文件夹log中( 其实就是文件夹就是一个以特定前缀存在的对象 )
② 如果定义的前缀末尾没有' / ' 符号,那么所有的访问日志文件都会以用户设定的前缀存在桶的根目录下
S3访问日志不是开启之后立即就会产生日志文件,需要登上一段时间才会开始产生日志文件。
3、使用S3托管静态网站
步骤:
①
创建S3存储桶,命名与域名一致
②
控制台操作:a、权限->关闭 阻止全部公有访问权限,即先设置为公有可访问
b、属性->静态网站托管->使用此存储桶托管网站->索引文件设置为index.html->保存
c、上传代码文档到存储桶,其中设置的索引文档必须要存在于桶的根目录下。
重定向是可用于根据规则更改目标页面的属性。如果有重定向的需求 可以在
属性
->静态网站托管
处将页面重定向用于以下几种用例:1、Setting up the error pages based on http error code 根据http错误代码设置错误页面 2、Send certain types of request to a page 将某些类型的请求发送到页面 3、Send to a page for all unknown urls 发送到所有未知网址的页面 4、Open other pages 打开其他页面
③
输入桶的终端节点测试访问④ 如果有自己的域名,希望通过自己的域名进行访问,可以在域名提供商处添加一条CNAME解析,将该域名解析到S3的终端节点
实际项目生产环境中,比较注重安全问题,需要一些策略去限制访问权限:
1、桶设为公开,设置权限为只可读
2、桶设为公开,结合CloudFront 设置自定义标头来限制对桶的访问
这种方法有瑕疵,因为现实问题就是标头可以进行伪造,而且S3支持的标头也有限,所以不推荐
3、
不可行的方案是,桶设置为私有,使用CloudFront的OAI源访问身份这个特殊用户,对S3坐访问限制。但是这种方案仅适用于S3桶的对象访问,像静态网站托管这种自定义规则不适用官方解释:
如果您使用配置为网站终端节点的 Amazon S3 存储桶,则必须使用 CloudFront 将其设置为自定义源。您无法使用本主题中描述的源访问身份功能。但是,您可以 通过设置自定义标头和配置源来要求提供标头,限制对自定义源上内容的访问。有关更多信息,请参阅 在自定义源上限制对文件的访问。
4、桶设置为私有,结合CloudFront,通过对桶做策略,限制只有CloudFront的IP段才能访问此S3桶
附上CloudFront回源使用的 IP段 供参考:
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可以考虑自己的实际情况进行选用
第四种方法已测试,具体测试步骤如下:
①
创建S3存储桶,先设为公开访问
②
桶属性
->静态网站托管
->使用此存储桶托管网站
->设置索引文档、错误文档或重定向规则
->保存
,上传代码(index.html需要在桶的根目录下)
③
S3访问端点访问测试,是否可正常访问出于生产环境安全考虑,一般S3桶不允许公开访问权限,所以在这里尝试CloudFront + S3托管静态网站
④
S3桶关闭公共访问权限,并设置存储桶策略如下:{ "Version": "2012-10-17", "Id": "Policy1603677181839", "Statement": [ { "Sid": "Stmt1603676761051", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws-cn:s3:::zhijiabinfcchinatest/*" }, { "Sid": "Stmt1603677169337", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws-cn:s3:::zhijiabinfcchinatest/*", "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访问端点)
->HTTP\HTTPS自行选择
->允许的HTTP方法
->……
->备用域名(因为测试实用性所以这里我用了自己的域名)
->自行选择SSL
->创建分配
⑥
域名控制台给测试域名创建CNAME解析
⑦
域名访问测试测试过程遇到的问题:
1、CloudFront 域名访问测试:报错 403 The request could not be satisfied.
出现该错误原因可能是因为:
a、请求是通过 HTTP 发起的,但 CloudFront 分配配置为仅允许 HTTPS 请求
b、请求的备用域名 (CNAME) 未与 CloudFront 分配相关联
**解决办法:**就是在CloudFront 控制台检查这两个配置
可参考官方:https://aws.amazon.com/cn/premiumsupport/knowledge-center/resolve-cloudfront-bad-request-error/
4、S3对象转Glacier测试
如果希望降低S3备份存储的成本,应该考虑使用另一个AWS服务Amazon Glacier,在Glacier中存储数据的成本大概是S3中的1/3。
表1 使用S3和Glacier的区别
||S3|Glacier|
|-------|-------|-------|
|每GB容量成本|0.03$|0.01$|
|数据访问速度|立即可以访问|再提交请求3~5h后|
|持久性|设计为年度99.999999999%的数据持久性|设计为年度99.999999999%的数据持久性|
1、测试目标
从S3转到Glacier范围的时候,可以根据对象前缀、tag的k-v进行选定目标对象,因为S3中文件夹不能添加tag。
所以本次测试目标是:
① 测试能否根据文件夹的名称前缀将其内的文件转换到Glacier
② 测试能否根据文件tag的k-v将其转换到Glacier
树形目录结构如下图所示:
2、添加针对名称“test1”前缀的生命周期规则到存储桶
① 控制台,主菜单选择S3服务
② 选择现有存储桶并点击“管理”
③ 在“管理”标签栏下方,点击“添加生命周期规则”按钮
④ 输入规则名称,并根据前缀“test1”作为筛选条件,点击下一步
⑤ 选择“当前版本”为配置转换的目标,并点击“添加转换”,选择“创建指定天数后转换到Glacier”,将天数设置为最小的0天,并点击下一步
⑥ 省略“过期”的配置,直接点击下一步,显示出的规则细节,没有问题直接点击保存
移动对象到Glacier大概会花费24h左右的时间,从Glacier恢复数据到S3大概需要3~5h
即使生命周期规则时间设置为了0天,移动过程仍然会需要24h左右,在对象移动到Glacier之后,存储类别将会切换为Glacier
3、添加针对特定tag的k-v值的生命周期规则到存储桶
步骤不再赘述:
4、静待24h后出结果
如图,测试已成功。根据名称前缀、tag的key-value值所做的转换操作都已成功。