AWS S3常用功能总结回顾

news2024/12/25 10:10:45

本文用于记录与分享工作中遇到的s3的基础使用方法

工具介绍

本文采用s3Browser对s3进行可视化管理
在这里插入图片描述

基本元素

  1. 端点Endpoint
  2. 桶Bucket
  3. 账号AccessKey
  4. 密码SecreteKey

说明

本文基于JavaSDK进行演示代码,下文的代码都只包含核心部分,异常捕捉、流关闭、S3客户端、端点信息等细节可能会被省略

Maven依赖

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk</artifactId>
    <version>1.11.891</version>
</dependency>

s3Browser下载地址

https://s3browser.com/download.aspx

存储桶管理

S3上的数据都是存储在桶内的,可以理解为自己账号下的文件夹。桶之间是隔离的。

命名规范

推荐桶名称如下:

docexamplebucket1
log-delivery-march-2020
my-hosted-content

无效桶名称:

doc_example_bucket(包含下划线)
DocExampleBucket(包含大写字母)
doc-example-bucket-(以连字符结尾)

桶的访问方式(端点访问)

这里简单介绍一下几种常用的端点命名访问方式

虚拟主机(推荐使用)

url = https://桶名.[区域码].端点地址/文件key

可选参数:区域码

路径类型

url = https://[区域码].端点地址/桶名/文件key

自定义域名

  1. 将自己的域名,cname到厂商的S3 Endpoint上
  2. 在配置页面,将域名映射到某个桶
url = https://自定义域名/桶名/文件key

创建桶

// 声明区域
Regions clientRegion = Regions.DEFAULT_REGION;
String bucketName = "桶名在这里定义";
// s3客户端
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withCredentials(new ProfileCredentialsProvider())
                    .withRegion(clientRegion)
                    .build();
if (!s3Client.doesBucketExistV2(bucketName)) {
	s3Client.createBucket(new CreateBucketRequest(bucketName));
// 验证桶创建成功
String bucketLocation = s3Client.getBucketLocation(new   GetBucketLocationRequest(bucketName));
System.out.println("Bucket location: " + bucketLocation);

删除桶

		// 删除所有对象
         ObjectListing objectListing = s3Client.listObjects(bucketName);
         while (true) {
             Iterator<S3ObjectSummary> objIter = objectListing.getObjectSummaries().iterator();
             while (objIter.hasNext()) {
                 s3Client.deleteObject(bucketName, objIter.next().getKey());
             }
             if (objectListing.isTruncated()) {
                 objectListing = s3Client.listNextBatchOfObjects(objectListing);
             } else {
                 break;
             }
         }
        
        // 删除所有带版本的对象
         VersionListing versionList = s3Client.listVersions(new ListVersionsRequest().withBucketName(bucketName));
         while (true) {
             Iterator<S3VersionSummary> versionIter = versionList.getVersionSummaries().iterator();
             while (versionIter.hasNext()) {
                 S3VersionSummary vs = versionIter.next();
                 s3Client.deleteVersion(bucketName, vs.getKey(), vs.getVersionId());
             }
             if (versionList.isTruncated()) {
                 versionList = s3Client.listNextBatchOfVersions(versionList);
             } else {
                 break;
             }
         }
		// 删除桶
         s3Client.deleteBucket(bucketName);
}

对象管理

上传对象

  AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withRegion(clientRegion)
                    .build();
                    
       // 上传一个对象 这里传入一个String
       s3Client.putObject(bucketName, stringObjKeyName, "Uploaded String Object");

       // 指定ContentType 从文件上传对象
       PutObjectRequest request = new PutObjectRequest(bucketName, fileObjKeyName, new File(fileName));
      	//  对象元数据设置
       ObjectMetadata metadata = new ObjectMetadata();
       metadata.setContentType("plain/text");
       metadata.addUserMetadata("title", "someTitle");
       request.setMetadata(metadata);
       s3Client.putObject(request);

下载对象

S3Object fullObject = null, objectPortion = null, headerOverrideObject = null;

AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withRegion(clientRegion)
                    .withCredentials(new ProfileCredentialsProvider())
                    .build();

       // 获取对象
       fullObject = s3Client.getObject(new GetObjectRequest(bucketName, key));

       // 获取对象指定字节范围
       GetObjectRequest rangeObjectRequest = new GetObjectRequest(bucketName, key)
               .withRange(0, 9);
       objectPortion = s3Client.getObject(rangeObjectRequest);

      // 指定ResponseHeader
      ResponseHeaderOverrides headerOverrides =
      new ResponseHeaderOverrides()
              .withCacheControl("No-cache")
              .withContentDisposition("attachment; filename=example.txt");
      GetObjectRequest getObjectRequestHeaderOverride = 
      new GetObjectRequest(bucketName, key)
              .withResponseHeaders(headerOverrides);
       headerOverrideObject = s3Client.getObject(getObjectRequestHeaderOverride);

复制对象

// 从bucketName/sourceKey复制到bucketName2/destinationKey
CopyObjectRequest copyObjRequest = new CopyObjectRequest(bucketName, sourceKey, bucketName2, destinationKey);

s3Client.copyObject(copyObjRequest);

删除对象

// 删除单个对象
 s3Client.deleteObject(new DeleteObjectRequest(bucketName, keyName));
// 删除多个对象

// 文件名
ArrayList<KeyVersion> keys = new ArrayList<KeyVersion>();
for (int i = 0; i < 3; i++) {
    String keyName = "keyname " + i;
    keys.add(new KeyVersion(keyName));
}
// 删除多个对象
DeleteObjectsRequest multiObjectDeleteRequest = new DeleteObjectsRequest(bucketName)
        .withKeys(keys)
        .withQuiet(false);

// 验证删除成功
 DeleteObjectsResult delObjRes = s3Client.deleteObjects(multiObjectDeleteRequest);
 int successfulDeletes = delObjRes.getDeletedObjects().size();

列出对象

可以列出桶里所有文件的路径

        ListObjectsRequest listObjects = new ListObjectsRequest().withBucketName("ait-doc");
		
		// 查看所有对象
        ObjectListing res = amazonS3.listObjects(listObjects);
        List<S3ObjectSummary> objectSummaries = res.getObjectSummaries();
        for (S3ObjectSummary myValue : objectSummaries) {
            System.out.print("\n 文件路径:" + myValue.getKey());
        }

分段上传

这里通常有两种API提供给我们使用,第一种是高级API,使用的是TransferManager实现调用,第二种是更底层的低级API,通常我用低级API,更方便定制化开发。

配置生命周期策略

此项用于指定分段上传任务在指定天数内完成上传,否则将会被清除相关联的分段

<LifecycleConfiguration>
    <Rule>
        <ID>sample-rule</ID>
        <Prefix></Prefix>
        <Status>Enabled</Status>
        <AbortIncompleteMultipartUpload>
          <DaysAfterInitiation>7</DaysAfterInitiation>
        </AbortIncompleteMultipartUpload>
    </Rule>
</LifecycleConfiguration>

查看正在进行的分段上传的列表

ListMultipartUploadsRequest allMultpartUploadsRequest = 
     new ListMultipartUploadsRequest(existingBucketName);
MultipartUploadListing multipartUploadListing = 
     s3Client.listMultipartUploads(allMultpartUploadsRequest);

分段上传

分段上传通常用于大文件,前后端配合实现快速上传。
通常分段上传分为三个步骤:

  1. 开启分段上传任务
  2. 上传分段数据
  3. 结束或中断分段上传任务
    任务结束后,会汇聚所有的分段,合并为一个完整的文件,所有的操作都是由S3实现的。
// 分段标签元数据 	
List<PartETag> partETags = new ArrayList<PartETag>();

 // 发起开始分段上传请求
InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(bucketName, keyName);
 InitiateMultipartUploadResult initResponse = s3Client.initiateMultipartUpload(initRequest);

 // 上传分段
 long filePosition = 0;
 for (int i = 1; filePosition < contentLength; i++) {
  	// 最后一个分段可能小于5MB,
 	 partSize = Math.min(partSize, (contentLength - filePosition));

	// 分段上传请求
	UploadPartRequest uploadRequest = new UploadPartRequest()
	        .withBucketName(bucketName)
	        .withKey(keyName)
	        .withUploadId(initResponse.getUploadId())
	        .withPartNumber(i)
	        .withFileOffset(filePosition)
	        .withFile(file)
	        .withPartSize(partSize);

     // 分段上传响应
     UploadPartResult uploadResult = s3Client.uploadPart(uploadRequest);
     partETags.add(uploadResult.getPartETag());

     filePosition += partSize;
 }

 // 关闭分段上传任务
 CompleteMultipartUploadRequest compRequest = new CompleteMultipartUploadRequest(bucketName, keyName,
         initResponse.getUploadId(), partETags);
 s3Client.completeMultipartUpload(compRequest);

中断分段上传

如果不需要结束任务,那么可以中断上传,然后会清理掉所有的分段。

// 低级API
s3Client.abortMultipartUpload(new AbortMultipartUploadRequest(
            existingBucketName, keyName, initResponse.getUploadId()));
// 高级API
TransferManager tm = new TransferManager(new ProfileCredentialsProvider());
// 指定清理一周前启动的 并且还在进行上传的分段
int sevenDays = 1000 * 60 * 60 * 24 * 7;
Date oneWeekAgo = new Date(System.currentTimeMillis() - sevenDays);
tm.abortMultipartUploads(existingBucketName, oneWeekAgo);

跟踪正在上传的分段

TransferManager tm = new TransferManager(new ProfileCredentialsProvider());        

PutObjectRequest request = new PutObjectRequest(
existingBucketName, keyName, new File(filePath));

// 设置监听事件
request.setGeneralProgressListener(new ProgressListener() {
	@Override
	public void progressChanged(ProgressEvent progressEvent) {
		System.out.println("Transferred bytes: " + 
		progressEvent.getBytesTransferred());
	}
});
// 执行上传
Upload upload = tm.upload(request);
// 等待上传完毕
upload.waitForCompletion();

低级API(TransferManager)

TransferManager tm = TransferManagerBuilder.standard()
     .withS3Client(s3Client)
     .build();
// 指定文件路径上传
 Upload upload = tm.upload(bucketName, keyName, new File(filePath));
 // 异步 等待任务完成
 upload.waitForCompletion();

预签名URL

签名URL上传

// 生成请求
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest("ait-doc", "1.png")
	// 查询请求用GET 上传请求用PUT
    .withMethod(HttpMethod.GET)
    .withExpiration(new Date());
// 创建签名URL
URL url = amazonS3.generatePresignedUrl(request);

安全管理

CORS

可以进行跨域配置

<CORSConfiguration>
 <CORSRule>
   <AllowedOrigin>*</AllowedOrigin>
   <AllowedMethod>PUT</AllowedMethod>
   <AllowedMethod>POST</AllowedMethod>
   <AllowedMethod>DELETE</AllowedMethod>
   <AllowedHeader>*</AllowedHeader>
  <MaxAgeSeconds>3000</MaxAgeSeconds>
  <ExposeHeader>x-amz-server-side-encryption</ExposeHeader>
  <ExposeHeader>x-amz-request-id</ExposeHeader>
  <ExposeHeader>x-amz-id-2</ExposeHeader>
 </CORSRule>
</CORSConfiguration>

ACL管理访问

管理桶和对象的访问权限,附加在桶和对象上,进行权限控制。S3提供了一系列预定义的ACL叫标准ACL,下表是常用3个的标准ACL。可以使用 x-amz-acl 请求头在请求中指定标准的 ACL。

ACL适用权限描述
private桶和对象所有者将获得 FULL_CONTROL。其他人没有访问权限 (默认)
public-read桶和对象
public-read-write桶和对象所有者将获得 FULL_CONTROL。AllUsers 组将获得 READ 访问权限

参考:
[1] AWS GIthub仓库
[2] AWS官方文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/358866.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【图像分类】卷积神经网络之LeNet5网络模型结构详解

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 1. 前言 LeNet5算法是LeCun在1998年提出的卷积神经网络模型。大约90年代,由于支持向量机等算法的发现,深度学习…

django项目实战一(django+bootstrap实现增删改查)

目录 一、创建django项目 二、修改默认配置 三、配置数据库连接 四、创建表结构 五、在app当中创建静态文件 六、页面实战-部门管理 1、实现一个部门列表页面 2、实现新增部门页面 3、实现删除部门 4、实现部门编辑功能 七、模版的继承 1、创建模板layout.html 1&…

创建虚拟机,安装CentOS

在VMware上面创建虚拟机 文件->新建虚拟机 选定 自定义的高级&#xff0c;下一步 下一步 检查选定稍后安装操作系统 下一步 选择Linux&#xff0c;CentOS 7 64位 创建虚拟机名称&#xff0c;以及在存放该虚拟机的位置 选择处理器的数量和每个处理器的内核数量 …

Linux入门操作指令介绍(配合Windows理解)

&#xff08;1&#xff09;如果不会装虚拟机和Ubuntu&#xff0c;建议跟着韦东山老师的课程来安装&#xff0c;绝大多数事情他都帮你做好了。跟着视频的来即可。韦东山老师视频链接。&#xff08;2&#xff09;跟着视频做可能还是会有很多不懂的&#xff0c;比如什么是Shell &a…

【论文速递】ACL 2021-CLEVE: 事件抽取的对比预训练

【论文速递】ACL 2021-CLEVE: 事件抽取的对比预训练 【论文原文】&#xff1a;CLEVE: Contrastive Pre-training for Event Extraction 【作者信息】&#xff1a;Wang, Ziqi and Wang, Xiaozhi and Han, Xu and Lin, Yankai and Hou, Lei and Liu, Zhiyuan and Li, Peng and …

【离散数学】3. 代数系统

1.数理逻辑 2. 集合论 3. 代数系统 4. 图论 代数系统&#xff1a;把一些形式上很不相同的代数系统&#xff0c;用统一的方法描述、研究、推理&#xff0c;从而得到反映出他们共性的一些结论&#xff0c;在将结论运用到具体的代数系统中 系统&#xff1a;运算研究对象 运算&…

薪资9k!三年教培老师被优化,选择转行软件测试实现再就业

大学毕业后&#xff0c;我在一家教培机构当了三年的高中英语老师。只是后来我怎么也没想到&#xff0c;这三年间形成的社交圈子和职场经验&#xff0c;仅仅用了三个月便发生了天翻地覆的变化。 ——贵阳校区优秀学员 小Z 01.初入职场 2019年的初夏&#xff0c;我和众多应届毕…

利用redis实现缓存、发布订阅、分布式锁功能

Redis是一个内存键值存储数据库&#xff0c;通常用于缓存、会话管理、消息队列等场景。以下是一些常见的Redis使用场景&#xff1a;1.缓存&#xff1a;将常用的数据缓存在Redis中&#xff0c;以减少对数据库的访问次数&#xff0c;提高应用程序的性能。2.会话管理&#xff1a;使…

用Python采集热门城市景点数据并简单制作数据可视化图

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 模块使用&#xff1a; 爬虫部分: requests parsel csv 数据分析部分: pandas pyecharts 如何安装模块: win R 输入 cmd 输入安装命令&#xff1a; pip install 模块名 回车 pycharm里面安装 terminal 输入安装命令…

OSI七层网络模型

应用层 定义了各种应用协议规范数据格式&#xff1a;HTTP协议、HTTPS协议、FTP协议、DNS协议、TFTP、SMTP等等。 表示层 翻译工作。提供一种公共语言、通信。 会话层 1、可以从校验点继续恢复数据进行重传。——大文件 2、自动收发&#xff0c;自动寻址的功能。 传输层 1、…

Qt下实现不规则形状窗口显示

文章目录前言一、资源文件的添加二、初始化窗口三、重写paintEvent函数实现窗口重绘四、重写QMouseEvent相关函数实现不规则窗口的移动及关闭五、demo完整代码六、下载链接总结前言 本文实现了Qt下显示两个不规则形状的窗口demo&#xff0c;其中有Qt的窗口对话框和QPaintEvent…

基于minikube快速搭建kubernetes单节点环境

一、说明 本文主要介绍在 Centos7 环境下基于 Minikube 来快速部署 Kubernetes 单节点集群环境&#xff0c;并在浏览器上访问部署在 k8s 上的 dashboard 服务。 二、Minikube 介绍 Minikube 是一个基于go语言开发&#xff0c;易于在本地运行 Kubernetes 的工具&#xff0c;可…

《mysql技术内幕:innodb存储引擎》笔记

任何时候Why都比What重要&#xff1b;不要相信任何的“神话”,学会自己思考&#xff1b;不要墨守成规,大部分人都知道的事情可能是错误的&#xff1b;不要相信网上的传言,去测试,根据自己的实践做出决定&#xff1b;花时间充分地思考,敢于提出质疑。1.MYSQL被设计为一个单进程多…

(三十七)vue 项目中常用的2个Ajax库

文章目录axios实现vue-resource实现上一篇&#xff1a;&#xff08;三十六&#xff09;Vue解决Ajax跨域问题 先看一个github搜索案例 有一个搜索框&#xff0c;输入相关用户名&#xff0c;就能模糊搜索出用户&#xff0c;展现到下方 第一步&#xff1a;我们用到了第三方样式库…

36、基于51单片机频率计 LCD 1602显示系统设计

摘要 数字频率计是一种基本的测量仪器。它被广泛应用于航天、电子、测控等领域&#xff0c;还被应用在计算机及各种数学仪表中。一般采用的是十进制数字&#xff0c;显示被测信号频率。基本功能是测量正弦信号&#xff0c;方波信号以及其他各种单位时间内变坏的物理量。由于其…

【沐风老师】为你推荐18个免费3dMAX插件和脚本

在所有 3D 软件中&#xff0c;3dMax的历史特别引人注目&#xff0c;有许多有趣的里程碑和突破点。自 1990 年推出以来&#xff0c;3dMax 一直是Autodesk公司的支柱产品之一。作为行业标准&#xff0c;它是高端项目和各种高级用途的首选 3D 软件之一。 如果你已经在使用3dMax&a…

一站式元数据治理平台——Datahub入门宝典

随着数字化转型的工作推进&#xff0c;数据治理的工作已经被越来越多的公司提上了日程。作为新一代的元数据管理平台&#xff0c;Datahub在近一年的时间里发展迅猛&#xff0c;大有取代老牌元数据管理工具Atlas之势。国内Datahub的资料非常少&#xff0c;大部分公司想使用Datah…

大数据开发-数据仓库介绍

目录标题1、数据仓库1.1 数仓为何而来&#xff1f;1.2 数据仓库的主要特性1.3 数据仓库与数据库的区别1.4 数据仓库三层架构1.5 实战-美团酒旅数仓建设1.6 ETL、ELT1.6.1 ETL1.6.2 ELT1、数据仓库 数据仓库Data Warehouse 简称DH&#xff0c;数据仓库的目的是构建面向分析的集…

Centos7.9源码编译安装dpdk

近日遇到一个需求&#xff0c;需要在Centos7.9上源码编译安装dpdk-21.11.2&#xff0c;并且dpdk的安装目录为/opt/。安装过程较为复杂&#xff0c;特此记录一下&#xff0c;方便日后查看。 相关配置参数编译环境虚拟机Centos7.9内核版本3.10.0-957dpdk版本21.11.2DPDK是INTEL公…

Java并发编程面试题——JUC专题

文章目录一、AQS高频问题1.1 AQS是什么&#xff1f;1.2 唤醒线程时&#xff0c;AQS为什么从后往前遍历&#xff1f;1.3 AQS为什么用双向链表&#xff0c;&#xff08;为啥不用单向链表&#xff09;&#xff1f;1.4 AQS为什么要有一个虚拟的head节点1.5 ReentrantLock的底层实现…