Amazon S3对象储存(以图片为例)
Amazon S3对象储存
- 一、前言
- 二、Amazon S3 简介
- 三、为何选择Amazon S3
- 四、部署环境
- 五、存储桶的创建与删除
- 1.命名规则
- 2.控制台创建和删除
- 3.api创建和删除
- 六、上传图片
- 1.控制台上传
- 2.api上传与删除
- 七、加载图片
- 1.url加载图片
- 2.获取图片对象进行下载
- 八、踩坑经历
- 1.两种api
- 2.两个域名
- 九、总结
一、前言
亚马逊云科技提供了100余种产品免费套餐。其中,计算资源Amazon EC2首年12个月免费,750小时/月;存储资源 Amazon S3 首年12个月免费,5GB标准存储容量。
https://aws.amazon.com/cn/free/?nc2=h_ql_pr_ft&all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Types=*all&awsf.Free%20Tier%20Categories=*all&trk=e0213267-9c8c-4534-bf9b-ecb1c06e4ac6&sc_channel=el
在我们日常开发中,图片是非常常用的一种文件,一般来讲是采用url的方式进行加载的,那就有个问题了,离服务器的远近导致了延迟的问题,离服务器远的用户体验相对而言就不是很好了,那有没有办法可以解决这个问题,接下来介绍的**Amazon S3(Simple Storage Service)**对象存储就是解决这个问题的,正文即将开始。
二、Amazon S3 简介
Amazon S3 是一种对象存储服务,可将数据作为对象存储在存储桶中。 对象是一个可以存储任何允许的文件格式的最小单位,例如txt,png,apk等等。存储桶是对象的容器。要将数据存储在 Amazon S3 中,首先得创建一个存储桶并指定存储桶名称和 AWS 区域(这个区域最好选择生产环境的临近结点)。然后,数据将作为 Amazon S3 中的对象上传到该存储桶。 每个对象都有一个键(可以包括路径名,Amazon S3会自动完成转换),它是桶内对象的唯一标识符(免费版本最多支持300个对象)。S3 提供个性化的设置需求。 例如,可以使用 S3 的版本控制将一个对象的多个版本保存在同一个存储桶中,这样可以恢复意外删除或者覆盖的对象,版本控制功能需要开启相关的设置,默认不开启,比较消耗存储空间。存储桶中的对象默认是私有的,只有在开启外界访问权限时才能访问。 可以使用存储桶策略、AWS Identity and Access Management (IAM) 策略、访问控制列表 (ACL) 和 S3 访问点等来管理访问。
三、为何选择Amazon S3
Amazon S3全称Amazon Simple Storage Service 是AWS(Amazon Web Service)中的产品之一,主要提供对象存储服务,那么为何选择Amazon S3 呢?基于以下几种原因考虑
高可靠的对象设计持久性
对象设计持久性达到了19个九,即99.999999999%,即10000年只会发生一次对象丢失
灵活的对象储存方案
使用S3 Intelligent-Tiering 作为默认存储类,基于访问频率,可以自动调整对象存储的方式,降低对象储存成本
数据安全有保证
提供服务端加密,客户端加密以及默认的加密方式,默认情况下只能自己访问存储桶中的对象
支持批量处理和跨区域复制
不夸张的说可以通过s3同时操作亿万个对象,同时支持将对象复制到其他区域
四、部署环境
依赖引入
这里以gradle的部署为例
implementation "software.amazon.awssdk:s3:2.17.172"
maven也差不多,这里就不演示了
创建客户端
这个是s3对象存储中必不可少的部分,这里简单配置一下,后面有需求可以随时添加和更改
fun getS3client(): S3Client {//选择结点val region = Region.AP_NORTHEAST_1//登录凭据val provider: AwsCredentialsProvider = StaticCredentialsProvider.create(AwsBasicCredentials.create(accessKeyId,secretAccessKey))return S3Client.builder().credentialsProvider(provider).region(region).build() }
accessKeyId和 secretAccessKey可以进入个人设置里面的安全设置进行创建,可同时创建多个,但有一点需要注意,控制台不保存密钥,需要自己进行保存,会让你下载一个csv文件保存自己的密钥,当然其实也没关系,忘记了再创建一个,忘记的那个密钥要记得删除避免安全隐患
五、存储桶的创建与删除
1.命名规则
至少3个字符,至多63个字符,必须以字母或者数字作为结尾和开头,特殊字符仅支持
. 和 -
同时以下前缀和后缀不支持
前缀:xn--
后缀:-s3alias
最后要强调的一点是桶的名称在全部AWS账户创建的桶中唯一的,即全球只会有一个!!
2.控制台创建和删除
打开s3官网
创建一个bucket
这里有一些选项需要填写,应该不是很困难,有一点需要注意选择区域的时候最好选最近的节点进行桶的部署,推荐Tokyo结点,这里可能不同的地区会有一点限制,例如选择不了香港的结点,所以目前国内的访问还是比较慢的。
bucket setting
这里主要功能是图片访问,为了方便测试,修改成任何人都能访问,以下选项全部取消勾选,默认是全部勾选(安全保护考虑)
删除桶
点击delete即可删除
console 的操作都很简单,接下来介绍api的创建
3.api创建和删除
这个利用最新的api,几行代码就可以搞定
fun createBucket(s3Client: S3Client, bucketName: String) {val bucketRequest = CreateBucketRequest.builder().bucket(bucketName).build()s3Client.createBucket(bucketRequest)
}
这里利用创建桶的api构造一个request,传入桶名和客户端就可以了,这里默认屏蔽所有外来访问,也可以设置相关的acls进行开放,有兴趣可以查看官方demo了解一下
下面展示一下删除桶的代码,也是相当的简单
fun deleteBucket(s3Client: S3Client,bucketName: String){val deleteRequest = DeleteBucketRequest.builder().bucket(bucketName).build()s3Client.deleteBucket(deleteRequest)
}
六、上传图片
1.控制台上传
这个比较简单,点击upload即可上传文件
2.api上传与删除
api上传也很简单,简单配置一下参数就可以了
fun uploadObject(s3Client: S3Client,bucketName: String){//上传对象的请求//这里需要自己设置上传桶的名称和图片的路径//img/hello.jpg即上传至img文件夹下的hello.jpg,若没有img文件夹则自动创建一个val putObjectRequest = PutObjectRequest.builder().bucket(bucketName).key("img/hello.jpg").build()//本地的文件val file = File("C:\\Users\\user\\Desktop\\local.jpg")//启用客户端开始上传s3Client.putObject(putObjectRequest, RequestBody.fromFile(file))
}
api的删除也很容易,参数和上传差不多
fun deleteObject(s3Client: S3Client,bucketName: String,keyName:String){//这里的keyName即创建时的key,相当于对象在桶中的相对位置val deletedObjectRequest = DeleteObjectRequest.builder().bucket(bucketName).key(keyName).build()s3Client.deleteObject(deletedObjectRequest)
}
七、加载图片
1.url加载图片
这个需要在图片对象那里开启public read的权限,开启之后就可以直接通过url进行访问图片了
这里的object url即对外开放的url
2.获取图片对象进行下载
这里用代码进行下载,当然如果是桶的owner,不需要进行权限处理即可访问
fun getObject(s3Client: S3Client,bucketName: String,keyName:String){val getObjectRequest = GetObjectRequest.builder().bucket(bucketName).key(keyName).build()//参数即本地存放路径val file = File("C:\\Users\\user\\Desktop\\get.jpg")s3Client.getObject(getObjectRequest,file.toPath())
}
八、踩坑经历
1.两种api
应该时amazon aws为了统一化风格,重写了java方面的api,这就导致了文档和网上的各种操作用的依赖不同,刚开始就是一头雾水,官网推荐使用新版的api,然而很多介绍性的文档还没更新是旧的api,有些又是新的api,刚开始的学习阶段很头疼。
//这里给出两种最新版本的依赖
//一个以.com开头,一个以software开头
implementation ("com.amazonaws:aws-java-sdk-s3:1.12.196")
implementation ("software.amazon.awssdk:s3:2.17.172")
不过这里还是推荐使用新版的api,风格形式真的相当简洁,会一种操作其他的也是一样
//以某某操作的request为参数
//然后通过链式调用完成request参数的配置
//最后调用s3Client完成request的具体操作
//下面这个删除仅仅只用了两行代码就完成了删除操作
val deleteRequest = DeleteBucketRequest.builder().bucket(bucketName).build()
s3Client.deleteBucket(deleteRequest)
2.两个域名
刚开始不知道原来amazon在国内也有网站,然后一直用的国外的网站,访问速度感人
- aws中国站
- aws官网
九、总结
亚马逊云科技提供了100余种产品免费套餐。其中,计算资源Amazon EC2首年12个月免费,750小时/月;存储资源 Amazon S3 首年12个月免费,5GB标准存储容量。
https://aws.amazon.com/cn/free/?nc2=h_ql_pr_ft&all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Types=*all&awsf.Free%20Tier%20Categories=*all&trk=e0213267-9c8c-4534-bf9b-ecb1c06e4ac6&sc_channel=el
部署和实战的过程有些曲折,也有收获,部署最大的困难是文档的各异以及国内访问的速度的限制,然后最让人意外和欣慰的就是最后使用的api相当简洁和易用,感谢这套统一风格的api,开发者友好型,下面给出主要的参考资料方便读者进一步探索更多高级的功能,类似加密处理,访问组控制,自带的tag进行查询等等,这里由于篇幅所限就不一一介绍了。
github参考样例
入门参考
Amazon S3对象储存(以图片为例)相关推荐
- amazon s3_在Amazon S3上托管静态网站
amazon s3 Static website hosting on Amazon S3 is one of the very popular use cases of Amazon S3. It ...
- Amazon Simple Storage Service(Amazon S3)
Amazon S3是高可扩展性.持久性和可用的分布式对象存储,它主要是为重要的任务和主要的数据存储,而且它还有一个易于使用的web服务接口.在传统的内部应用程序中,这种类型的数据一般都会保存在SAN或 ...
- 全方位保护您在 Amazon S3 的数据资产-访问控制详解
2006年,Amazon S3 作为亚马逊云科技发布的第一款公有云服务面世,如今,成千上万的亚马逊云科技客户在利用 Amazon S3 创造各类激动人心的应用.从企业数据湖.机器学习存储,到 HPC. ...
- aws api gateway 创建一个REST API作为Amazon S3代理
你可能想把样本API导入为Amazon S3的代理,如样本API作为Amazon S3代理的OpenAPI定义所示.关于如何使用OpenAPI定义导入API的说明,请参阅使用OpenAPI配置REST ...
- Amazon S3下载图片
Amazon S3 Amazon S3,全名为亚马逊简易存储服务.类似于阿里云的oss,或百度云等网盘服务.即将文件存储在云端服务器中,文件会有对应的url.一般用于大型公司或者跨国业务. 官网(ht ...
- Amazon S3 Storage(亚马逊的对象存储)
目录 概述 设计 对象存储 访问控制 主机托管 日志 实用工具 亚马逊S3存储级别 S3 API和与之竞争的服务 发展历史 概述 亚马逊S3,全称亚马逊简易存储服务(Amazon Simple Sto ...
- 使用电信云时做对象储存时的异常信息:com.amazonaws.services.s3.model.AmazonS3Exception
项目中用到了电信云面向对象存储(OOS),代码是从其他团队开发的项目中直接copy的,测试都没问题,但是到我这个项目中以后就报错问题找了好久,配置其他的都排除了,突然有人说是不是依赖jar包的问题,换 ...
- 马逊s3云存储接口_使用 Amazon S3 云服务轻松实现存储
Amazon Simple Storage Service (S3) 是一个公开的服务,Web 应用程序开发人员可以使用它存储数字资产,包括图片.视频.音乐和文档. S3 提供一个 RESTful A ...
- Amazon S3简介
目录 文献参考: 存储桶 对象 键 区域 S3数据一致性模型 存储类别 存储桶策略 AWS Identity and Access Management 操作 创建请求 AWS 账户访问密钥 IAM ...
- 【云计算的1024种玩法】轻松将其他云的对象储存迁移至阿里云OSS
前言 当使用了像 OSS.S3 这样的开放对象储存的 PaaS 产品后,一面上体验到了网站核心同附件库分离的安全性.高性能以及免维护的便利性,一面上却又怕在一个厂家的对象储存上扎根了就无法迁移,会被厂 ...
最新文章
- This is probably not a problem with npm. There is likely additional logging output above
- python对象编程例子-python(十二)面向对象编程、类
- Codeforces 1025D(区间dp)
- 解决问题ImportError: HDFStore requires PyTables, quot;No module named 'tables'quot; problem importing
- 让PIP源使用国内镜像
- 获取和设置c# 应用程序目录
- Centos/RHEL上查看主板型号
- IIS中“使用 XSL 样式表无法查看 XML 输入”问题的解决
- 浅谈webpack打包原理
- flyme7 android彩蛋,魅族 15 系列开启预约,Flyme7 或是发布会彩蛋
- devops项目经理_DevOps:如何避免交接导致项目死亡
- 【第一篇】Volley的使用之json请求
- (二十二)访问者模式详解(伪动态双分派)
- AutoML之锦标赛选择
- 总会用到的系列4:关键时刻能救家庭的保险
- VMware Workstation Pro 虚拟机启动失败 cpu虚拟化开启
- 不适合创业的10种人
- 通过cocos裁切图片,将大图分为小图
- pycharm 格式化html文件
- 思维导图怎么画:这款免费思维导图软件推荐给你