S3小笔记

S3小笔记

Scroll Down

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解析

image.png

域名访问测试

测试过程遇到的问题:

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

树形目录结构如下图所示:

image.png

2、添加针对名称“test1”前缀的生命周期规则到存储桶

① 控制台,主菜单选择S3服务

② 选择现有存储桶并点击“管理”

③ 在“管理”标签栏下方,点击“添加生命周期规则”按钮

④ 输入规则名称,并根据前缀“test1”作为筛选条件,点击下一步

image.png

⑤ 选择“当前版本”为配置转换的目标,并点击“添加转换”,选择“创建指定天数后转换到Glacier”,将天数设置为最小的0天,并点击下一步

image.png

⑥ 省略“过期”的配置,直接点击下一步,显示出的规则细节,没有问题直接点击保存

image.png

移动对象到Glacier大概会花费24h左右的时间,从Glacier恢复数据到S3大概需要3~5h

即使生命周期规则时间设置为了0天,移动过程仍然会需要24h左右,在对象移动到Glacier之后,存储类别将会切换为Glacier

3、添加针对特定tag的k-v值的生命周期规则到存储桶

步骤不再赘述:

image.png

image.png

4、静待24h后出结果

如图,测试已成功。根据名称前缀、tag的key-value值所做的转换操作都已成功。

image.png

image.png

image.png