AWS S3 与 CloudFront 以及 S3 生命周期配置

AWS S3 与 CloudFront 以及 S3 生命周期配置
20180704 chenxin

发现一个S3权限问题.
在S3的s3-cdn-test存储桶(存储桶权限非公开)里创建test-cdn文件夹(貌似文件夹是不能设置权限的).
在test-cdn文件夹下创建的dir1/dir2/t.txt等文件夹与文件,权限为公开.

可以通过 https://s3.amazonaws.com/s3-cdn-test/test-cdn/dir1/dir2/t.txt 访问该文件.按照一般的权限说明来看的话,应该是不能访问的.
经过多次访问验证,test-cdn文件夹以及子文件夹均权限访问,但内部的所有文件均可以访问.

aws的解释:
蒙维AWS西南蒙老师:
关键是需要理解s3没有目录的概念,只有存储桶和文件两级概念,只是因为文件名支持正斜线,可以在控制台上显示为目录形式.
你可以设置iam策略让用户直接访问某个具体文件,所以就可以访问https://s3.amazonaws.com/s3-cdn-test/test-cdn/2.png了.
其实用命令行或sdk来理解s3存储桶的操作更直接些.

不缓存
排除部分文件或目录不在cdn节点上缓存,用户的请求直接回源.
precedence(优先级):数字小的先匹配.

配置文件结构: /xbzj-taihe-bei/ios_res/v2/*
配置缓存时间(用户自定义):将TTL默认的1天,修改为0

查看器使用HTTPS与cloudfront通信
https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/using-https-viewers-to-cloudfront.html

在未设置自己的HTTPS的情况下,访问自己的域名下文件(CNAME到CF的域名),只支持HTTP,不支持HTTPS:
https://xbzj-taihe-bei-cloudf.soomigame.com/test/t.txt 会报错
https://d107gs8ktc78p6.cloudfront.net/test/t.txt 可以正常访问
CF的"行为"里允许配置固定目录下的走HTTPS.

使用自己的域名访问CF的HTTPS(而不是CF自带的证书)
https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/using-https-alternate-domain-names.html

关于全球访问同一套源站的2个CDN部署说明
参考案例:
https://kekek.cc/post/global-cdn.html

同一套源站
关于全球同服CDN境内境外问题.使用同一个源站(S3),通过阿里云的智能DNS解析,将国内的用户CNAME解析到国内CDN,境外用户CNAME解析到cloudfront的域名.
如果境内CDN节点访问境外S3卡顿的话,可以另建1套源站放国内,保持国内和国外2个源站同步.

或者两套源站
境外用S3作源站,cloudfront访问S3.
境内用OSS做源站,阿里CDN访问OSS.
通过预热服来更新这2个源站(要测试预热服到国内OSS是否稳定).

智能解析(用于区分境内用户还是境外用户)
通过阿里云解析服务,将境内用户CNAME解析到境内CDN,境外用户CNAME解析到cloudfront地址.

cloudfront的访问日志收集便于问题分析
开启日志,需要先创建1个S3存储桶 xbzj-cloudfront-log,存储桶里建文件夹cf-logs,便于日志存放.
然后在Edit里开启:
Logging On
Bucket for Logs xbzj-cloudfront-log.s3.amazonaws.com
Log Prefix cf-logs/

日志格式说明
格式:https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html#BasicDistributionFileFormat

S3生命周期配置(过期自动删除)
需求1(固定文件夹和固定文件前缀)
日志文件会自动记录到该S3存储桶内的cf-logs文件夹下(文件名以E3NG8ZPS6O9U1U开头),然后将过期的文件自动删除.

配置
名称和范围: delete-cdn-log-file
添加用于限制前缀/标签范围的筛选条件: cf-logs/E3NG8ZPS6O9U1U (注意,存储桶的名称不要包含在条件中,区分大小写).cf-logs是文件夹,后面是对象前缀.
转换: 留空,不设置
过期:
勾选->"当前版本"和"先前版本"
"使对象的向前版本过期" ->3 天
"永久删除以前版本"->10 天(因为未启用版本控制,故这里不会生效)
"清理未完成的分段上传"-> 7 天

属性
完成后,对象属性如下
对象 E3NG8ZPS6O9U1U.2018-09-12-02.50a5f1ee.gz (UTC时间 2018/09/12 02:00时)
键 E3NG8ZPS6O9U1U.2018-09-12-02.50a5f1ee.gz 大小 14.1 KB
到期日期 9月 16, 2018 8:00:00 上午 GMT+0800 # 如果生命周期配置错误(前缀没有匹配到对象),这里会显示"N/A"
过期规则 delete-cdn-log-file
ETag e9...d593
上次修改时间 9月 12, 2018 10:01:46 上午 GMT+0800
对象 URL https://...e.gz

咨询AWS S3 生命周期的答复说明(对象未及时删除的原因说明)

若您曾经启用过版本的话,您会有当前版本及先前版本,我由后端工具上看您的xbzj-cloudfront-log桶并没有启用过版本。所以可以省略掉先前版本的删除设定。

以您目前的设定:

若您今天设定生命周期的设置,生命周期会于隔天UTC零时进行统计,当符合以下条件,就会进行排程删除,因为是排程删除,並异步删除他,这会与您看到当下档案的到期日期再顺延一些时间才会删除,以您原本提供的档案到日期为2018年9月16日,在加上您设置生命周期的时间,他需要时间执行,所以不会立即删除该档案,当然依照我们上次回复给您的内容,标注过期的档案不会再与您收取相关的储存时间费用。

当前版本创建时间超过3天,会进行删除。所以删除的时间至少会是当前版本创建时间3天以后,我们会进行排程删除,您目前的档案都会依照此规则排程删除。
以前版本创建超过10天,会进行删除,所以删除的时间会是以前版本创建超过10天以后删除,您目前没有档案符合此规则,所以不会依照此规则处理。
清理未完成的分段上传,当档案过大时,主控台或是AWS CLI或是AWS SDK会进行分段上传,但是若分段上传没有完成的话,您这边的设置会是以上传当天经过7天以后删除。

需求2 (不固定文件夹)
S3存储桶名称: sns-log-xbzj,需要删除类似以下的过期文件(设置30天过期).
SMSUsageReports/ap-southeast-1/2018/09/29/001.csv.gz
SMSUsageReports/us-east-1/2018/12/05/001.csv.gz
管理->添加生命周期->前缀配置为"SMSUsageReports/"即可.

需求3(整个存储桶)
S3存储桶名称: sns-log-xbzj,需要定期自动删除该桶下的所有文件(设置3天过期).
管理->添加生命周期->前缀留空(则会匹配整个存储桶).

posted @ 2020-04-20 17:25  ChanixChen  阅读(2242)  评论(0编辑  收藏  举报