Monday, January 9, 2017

AWS S3

云存储服务,是object storage的服务。

使用场景
1. 大数据存储(如交易数据替代FTP)
2. 数据backup
3. 网站静态数据
4. 网站视频存储

S3是key-value存储,value大小从0到5TB,所以其实也是ElastiCache的更便宜的替代方案。S3比DynamoDB数据访问较慢,因为没有primary key和index。

架构
存储桶
* 创建存储桶之后,任何 AWS 区域中的其他 AWS 账户均不能使用该存储桶的名称
* 每个 AWS 账户中创建多达 100 个存储桶
* 一个存储桶中可以存储任意数量的对象
* 存储桶中存储所有对象时对这些对象进行加密
* S3 Transfer Acceleration 可在客户端与 S3 存储桶之间实现快速、轻松、安全的远距离文件传输。利用 Amazon CloudFront 的全球分布式边缘站点
* 分离存储和数据转移费用。申请方付款存储桶:申请方将支付请求和从存储桶下载数据的费用。
* 每个存储桶都具有关联的访问控制策略

对象
* 键 – 分配给对象的名称。您可以使用对象键检索该对象。
* 版本 ID – 在存储桶中,键和版本 ID 唯一地标识对象。
* 对象值可以是任意序列的字节。对象的大小范围是 0 到 5 TB。
* 元数据 – 一组名称值对,可用于存储有关对象的信息。
* 子资源 – Amazon S3 使用子资源机制存储特定于对象的其他信息。
因为子资源从属于对象,因此它们始终与某些其他实体 (如对象或存储桶) 相关联。
* 访问控制信息 – 您可以控制对您在 Amazon S3 中存储的对象的访问。
Amazon S3 支持基于资源的访问控制(如访问控制列表 (ACL) 和存储桶策略)和基于用户的访问控制。

创建对象时,要指定键名,它在存储桶中唯一地标识该对象。不存在子存储桶或子文件夹的层级结构。
但您可以使用键名前缀和分隔符推断逻辑层次结构
元数据包括上次修改日期,内容长度和用户定义的对象元数据(“x-amz-meta-”开头)等。
版本控制:

最佳实践
跨账号访问文件:owner账号上的bucket->permissions->Access Control List上add account加入外部账号的Canonical ID (这个ID可以在该账号的某一个bucket的permission上找到)。这样只要登录外部账号后,用https://s3.console.aws.amazon.com/s3/buckets/mybucket即可访问。

注意用外部账号上传文件,这个文件默认owner是外部账号,bucket owner账号是没有访问权限的。所以上传文件是要Add account加入bucket owner的Canonical ID

功能
Amazon S3 存储类
元数据x-amz-storage-class 请求指定存储类

存储类设计专门针对持久性 (设计目标)可用性 (设计目标)可用区最小存储持续时间最小可计费对象大小其他考虑因素
STANDARD
经常访问的数据
99.999999999%
99.99%
>=3
STANDARD_IA
长时间存在的、不经常访问的数据
99.999999999%
99.9%
>=3
30 天
128 KB
按每 GB 收取检索费用。
INTELLIGENT_TIERING
访问模式发生变化或未知的长时间存在的数据
99.999999999%
99.9%
>=3
30 天
按对象收取监控和自动化费用。无检索费用。
ONEZONE_IA
长时间存在的、不经常访问的、非关键数据
99.999999999%
99.5%
1
30 天
128 KB
按每 GB 收取检索费用。无法灵活地应对可用区丢失的情况。
GLACIER
检索时间从数分钟到数小时不等的长期数据存档99.999999999%
99.99% (在您还原对象之后)
>=3
90 天
按每 GB 收取检索费用。您必须先还原存档对象,然后才可以访问它们。有关更多信息,请参阅 还原存档对象
DEEP_ARCHIVE
存档很少访问的数据,默认检索时间为 12 小时99.999999999%
99.99% (在您还原对象之后)
>=3
180 天
按每 GB 收取检索费用。您必须先还原存档对象,然后才可以访问它们。有关更多信息,请参阅 还原存档对象
RRS(不推荐)
经常访问的非关键数据
99.99%
99.99%
>=3
GET请求将检索最新存储的版本。在当前版本为删除标记时,执行简单 GET Object 请求将返回 404 Not Found 错误(soft delete)

对象生命周期管理
定义对象转换为另一个存储类的时间,如创建 30 天后将其转换为 STANDARD_IA 存储类
过期操作 — 定义对象的过期时间。Amazon S3 将代表您异步删除过期的对象

CORS
假设您在名为website的Amazon S3存储桶中托管网站(如在 Amazon S3 上托管静态网站中所述)。您的用户加载了网站终端节点 http://website.s3-website-us-east-1.amazonaws.com。现在,您想要使用此存储桶中存储的网页上的 JavaScript

分段上传
在单个操作中上传对象 — 借助单个 PUT 操作,您可以上传多达 5 GB 的对象
分段上传对象:多线程上传和断点上传

* 复制对象
* 分段上传 API 复制对象
* 列出包含在存储桶中的键,使用带列表操作的Prefix作为条件
* 删除对象,删除多个对象
* 清单是S3提供的用于帮助管理您的存储的工具之一。使用它来审核和报告对象的复制和加密状态
* 从对象中选择内容。利用Amazon S3 Select,用SQL筛选S3对象的内容。适用于以CSV、JSON或Apache Parquet格式存储的对象。
* Amazon S3 object lock。使用一次写入,多次读取 (WORM) 模式存储对象。您可以​使用它在固定的时间段内或无限期地阻止删除或覆盖对象。仅适用于受版本控制的存储桶
* 执行批量操作如对象复制,启动还原对象,调用Lambda函数
* 托管静态网站
* 通知功能如新对象创建事件,对象删除事件,目标为SNS,SQS, Lambda
* 跨区域复制
* BitTorrent。P2P协议,通过将正在下载对象的客户端用作分发服务器来解决此问题

底层API
getObject
fullObject = s3Client.getObject(new GetObjectRequest(bucketName, key));

putObject
// Upload a text string as a new object.
s3Client.putObject(bucketName, stringObjKeyName, "Uploaded String Object");
         
// Upload a file as a new object with ContentType and title specified.
PutObjectRequest request = new PutObjectRequest(bucketName, fileObjKeyName, new File(fileName));
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType("plain/text");
metadata.addUserMetadata("x-amz-meta-title", "someTitle");
request.setMetadata(metadata);
s3Client.putObject(request);


其他
S3的Pyton库是Boto3

如果lambda用了default的security group,同样地S3也要设VPC,否则lambda就不能访问S3。通过new VPC endpoint for S3就可以设置。还要在IAM加入S3FullAccess policy到lambda role中,这样在python代码中不需要secret key可以直接访问s3 = boto3.client('s3')

AWS以外要访问S3可以通过创建secret key来实现。


Ref
官网


No comments:

Post a Comment