Amazon S3简介
前言:
这段时间来到了某大数据平台,做平台技术底座封装和一些架构等等,有结构化数据也有非结构数据,涉及到很多技术,自己也私下花时间去研究了很多,有很多纯技术类的还是需要梳理并记录,巩固以及复习。一个项目用到了几个云存储,其中就包括Amazon S3,这边就学习并记录和复习一下。
Amazon S3简介
Amazon 最早推出的两项云服务:EC2 和 S3。
- Amazon S3:Amazon Simple Storage Service(亚马逊简易存储服务);
- EC2 :Elastic Compute Cloud(弹性计算云,即云中的虚拟服务器);
- Amazon S3支持REST风格,即通过GET、PUT、DELETE、POST、PATCH操作服务端的资源;
- Amazon S3 操作:Service,Buckets和Objects。
- Service 只包括 GET 操作,就是返回所有的 Buckets 的列表。
- Object 顾名思义,是指存储在云端的文件,值得注意的是,S3 中并没有明确的文件夹的概念,而是通过指定 object 的路径来实现,比如说,object 可以为 “photos/1.jpg”。
- Bucket 拥有全局名,名称由用户定义,用来存放 Object,由于是全局名,所以要确保名字是别人没用过的。
S3 Http request headers
具体可以查看亚马孙官网
访问 Web 服务时,Http request headers 需要一些参数。主要包括:
- Date:当前 UTC 时间,形式为 “Wed, 01 Mar 2009 12:00:00 GMT”。
- Content-Length: 当对 Object 进行操作的时候,返回内容的长度,注意不要包括 headers 中的内容。
- Content-MD5:用 base64 编码文件内容的 MD5 值。
- Content-Type:资源的类型,比如:text/plain。
- Host:Get Service 时为“ s3.amazonaws.com”。在对 bucket 和 object 进行操作时,例如bucket的名字是“bucketname”,那么 Host
就是“bucketname.s3.amazonaws.com”。- x-amz-meta- 和 x-am- 开头的:包括 Amazon 定义的一些元数据和一些特定的 header。后面如果出现会提到。
- Authorization:这个是最重要的,主要作用是签名,Amazon 根据的请求计算出一个签名值和这里计算的签名值进行比对,只有相同时,访问才是合法的。接下来对 Authorization 的计算方法进行详述。
Authorization 的计算方法
根据亚马逊Amazon 文档说明:
Authorization = "AWS" + " " + AWSAccessKeyId + ":" + Signature;Signature = Base64( HMAC-SHA1( UTF-8-Encoding-Of(YourSecretAccessKey), UTF-8-Encoding-Of( StringToSign ) ) );StringToSign = HTTP-Verb + "\n" +Content-MD5 + "\n" +Content-Type + "\n" +Date + "\n" +CanonicalizedAmzHeaders +CanonicalizedResource;CanonicalizedResource = [ "/" + Bucket ] +<HTTP-Request-URI, from the protocol name up to the query string> +[ subresource, if present. For example "?acl", "?location", or "?logging"];CanonicalizedAmzHeaders = <described below>
- Authorization 是由”AWS {0}:{1}“组成的,第0个参数为你的 Access Key ID,需要注册了 AWS 之后得到,AWS
注册;第1个参数是计算出来的签名值。- 签名值的计算方法是对一个 UTF-8 的字符串,用你的 Secret Access Key(同样在 Access Key ID 处获取)进行 SHA1 加密。
- StringToSign 字符串也需要满足一定的格式。如上所示,第一行是你的操作名,应该为 PUT、GET、DELETE、HEAD 和 POST 中的一种。第二行是内容的 MD5 值的 base64 编码,和 headers 中的 Content-MD5
值应保持一致。第三行是Content-Type,同样需要和headers中的一致。第四行 Date,和 headers 中的 Date
一致。- 需要说明的是 CanonicalizedAmzHeaders 和 CanonicalizedResource。
- CanonicalizedAmzHeaders 就是把 headers 中的 x-amz- 开头的作为 key 转化为小写并按顺序排列,key 和 value 之间用冒号相连,用换行符“\n”把它们给连接起来。
比如说 headers 中有:
X-Amz-Meta-ReviewedBy: joe@johnsmith.net
X-Amz-Meta-ReviewedBy: jane@johnsmith.net
X-Amz-Meta-FileChecksum: 0x02661779
X-Amz-Meta-ChecksumAlgorithm: crc32
那么CanonicalizedAmzHeaders就是:
x-amz-meta-checksumalgorithm:crc32\n
x-amz-meta-filechecksum:0x02661779\n
x-amz-meta-reviewedby:joe@johnsmith.net,jane@johnsmith.net
- CanonicalizedResource 是指规范化的资源。
- 如果访问资源没有指定 bucket,那么就是“/”;
- 如果包括 bucket,而不包括 object,那就是“/bucket_name/”,注意前后的“/”不要落了;
- 如果既包括 bucket,也包括 object,那么就是“/bucket_name/object_name”;
- 另外,有时候比如是访问 bucke t的 acl(访问控制列表 acess control list)时,object_name 就是 ?acl,因此这时 CanonicalizedResource就是“/bucket_name/?acl”,访问 object 的 acl
时,CanonicalizedResource 就是“/bucket_name/object_name?acl”。- 需要说明的是,如果计算出的 CanonicalizedAmzHeaders 不为空时,要确保 CanonicalizedAmzHeaders 和 CanonicalizedResource 之间有换行符“\n”连接。
Amazon S3 REST API
Service
对 Service的 操作只包括 Get,即获取用户所有的 Buckets 列表。Request headers 除了通用的,没有其他的内容。比如
GET / HTTP/1.1
Host: s3.amazonaws.com
Date: date
Authorization: signatureValue
返回的 XML 中包括 Owner 和各个 Buckets,比如:
<?xml version="1.0" encoding="UTF-8"?>
<ListAllMyBucketsResult xmlns="http://doc.s3.amazonaws.com/2006-03-01"><Owner><ID>bcaf1ffd86f461ca5fb16fd081034f</ID><DisplayName>webfile</DisplayName></Owner><Buckets><Bucket><Name>quotes</Name><CreationDate>2006-02-03T16:45:09.000Z</CreationDate></Bucket><Bucket><Name>samples</Name><CreationDate>2006-02-03T16:41:58.000Z</CreationDate></Bucket></Buckets>
</ListAllMyBucketsResult>
Buckets
由于项目中只用到了 Buckets 的 PUT、GET、DELETE,关于 acl、lifecycle、policy 等;
PUT Bucket
需要说明的是,在 request headers 可以加入 bucket 的权限控制,即指定 x-amz-acl,合法的值包括:private,public-read、public-read-write、authenticated-read、bucket-owner-read、bucket-owner-full-control,从名字就可以看出具体的含义。
- 在 request body 中可以包括位置信息,即用户期望 Bucket 放置在 Amazon 的哪个数据中心。
- 默认为 US Standard,其他数据中心包括 US West (Oregon) Region、US West (Northern California) Region、EU (Ireland) Region、Asia Pacific (Singapore) Region、Asia Pacific (Tokyo) Region、South America (Sao Paulo) Region。
- 对于我们中国用户来说,离得最近的是东京的数据中心。不过在 body 中内容中,这七个数据中心写成:‘EU’、 ‘eu-west-1’、‘us-west-1’、 ‘us-west-2’、‘ap-southeast-1’、‘ap-northeast-1’ 和 ‘sa-east-1’。
比如请求如下:
PUT / HTTP/1.1
Host: BucketName.s3.amazonaws.com
Content-Length: length
Date: date
Authorization: signatureValue<CreateBucketConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <LocationConstraint>BucketRegion</LocationConstraint>
</CreateBucketConfiguration>
GET Bucket
- Get Bucket 主要是列出这个 Bucket 下所有的 objects。值得提的是四个参数 Prefix、Marker、MaxKeys 和 Delimiter,利用这四个参数,可以达到多种效果。
- 首先是 Prefix,它表示这个 Bucket 中返回的 Object 以这个值为开头。Marker 表示,返回这个值以后的 Objects,比如说第一次调用没有返回全部结果,则把第一次调用返回的 Objects 的最后一个作为 Maker 调用,以返回其以后的
Objects。MaxKeys 返回单次请求返回的最大 Objects 数,默认为 1000。Delimiter 表示分隔符,是在设置了
Prefix 之后,能够返回共同的 Prefix(在结果中为 CommonPrefix)。- 因此,通过设置 MaxKeys和Marker可以达到翻页效果,每次返回的最后一个 Object 作为下一次请求的 Marker,在返回值中,如果 IsTruncated 为 true,那么表示还有下一页。此外,通过设置 Prefix 和将
Delimiter 设为”/“,可以达到返回某个文件夹下所有内容的效果,其中 CommonPrefix 下的 Prefix
表示文件夹路径,而每个 Contents 中是 Object 的信息。
GET ?prefix=N&marker=Ned&max-keys=40 HTTP/1.1
Host: quotes.s3.amazonaws.com
Date: Wed, 01 Mar 2009 12:00:00 GMT
Authorization: AWS AKIAIOSFODNN7EXAMPLE:xQE0diMbLRepdf3YB+FIEXAMPLE=
返回结果为:
HTTP/1.1 200 OK
x-amz-id-2: gyB+3jRPnrkN98ZajxHXr3u7EFM67bNgSAxexeEHndCX/7GRnfTXxReKUQF28IfP
x-amz-request-id: 3B3C7C725673C630
Date: Wed, 01 Mar 2009 12:00:00 GMT
Content-Type: application/xml
Content-Length: 302
Connection: close
Server: AmazonS3<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Name>bucket</Name><Prefix/><Marker/><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated><Contents><Key>my-image.jpg</Key><LastModified>2009-10-12T17:50:30.000Z</LastModified><ETag>"fba9dede5f27731c9771645a39863328"</ETag><Size>434234</Size><StorageClass>STANDARD</StorageClass><Owner><ID>75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a</ID><DisplayName>mtd@amazon.com</DisplayName></Owner></Contents><Contents><Key>my-third-image.jpg</Key><LastModified>2009-10-12T17:50:30.000Z</LastModified><ETag>"1b2cf535f27731c974343645a3985328"</ETag><Size>64994</Size><StorageClass>STANDARD</StorageClass><Owner><ID>75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a</ID><DisplayName>mtd@amazon.com</DisplayName>
Objects
PUT Object
PUT Object 基本操作类似,在 Http body 中添加 Object 的内容,这里就需要计算 Content-Type 等值。与
PUT Bucket 类似,可以在 Http headers 中加入 x-amz-acl,以控制 Object 的权限。
GET Object 在 GET Object 时,Response headers 中会包括这个 Object 的相关信息,除了
Content-Length 和 Content-Type 等,Etag 其实就是内容的 MD5 后的16进制的字符串。而 Response
body 中就是文件的内容。
相关文章:

Amazon S3简介
前言: 这段时间来到了某大数据平台,做平台技术底座封装和一些架构等等,有结构化数据也有非结构数据,涉及到很多技术,自己也私下花时间去研究了很多,有很多纯技术类的还是需要梳理并记录,巩固以及…...

MySQL索引类型——有五种
文章目录前言一、MySQL中的索引类型有以下几种1.1 普通索引1.1.1 直接创建索引1.1.2 修改结构的方式添加索引1.1.3 创建表的时候同时创建索引1.1.4 删除索引1.2 唯一索引1.2.1 创建唯一索引1.2.2 修改表结构1.2.3 创建表的时候直接指定1.3 主键索引1.4 组合索引1.5 全文索引1.5…...
CloudCompare 二次开发(5)——非插件中的PCL环境配置(均匀采样为例)
目录 一、概述二、CMakeLists.txt三、源码编译四、代码示例五、结果展示一、概述 在进行CloudCompare二次开发的时候,可以直接在CloudCompare的核心功能中添加自己的算法,比插件式的算法集成要方便得多。因此,这里主要记录CloudCompare非插件式二次开发配置PCL,并给出具体开…...

停车辅助系统的技术和变化
各种各样的停车辅助系统已经存在了很长时间,但用户经常在不知道什么技术以及它是如何工作的情况下使用它们。 今天我们依次来谈谈停车辅助系统是什么,怎么发展以及如何应用的。 1.手信号 您可能会想,“为什么手信号是停车辅助系统&#x…...

扬帆优配|日均客运量恢复,民航业加速复苏,外资买入2股超亿元
春运民航客运量康复至疫情前七成。 2月16日,民航局举行2月例行新闻发布会。会上介绍,自1月7日至2月15日,春运40天,民航运送旅客5523万人次,日均客运量138万人次,同比去年春运添加39%,康复至2019…...
【PyTorch】教程:torch.nn.ModuleDict
Containers-ModuleList CLASS torch.nn.ModuleDict(modulesNone) 将所有的子模块放到一个字典中。 ModuleDict 可以像常规 Python 字典一样进行索引,但它包含的模块已正确注册,所有 Module 方法都可以看到。 ModuleDict 是一个有序字典。 Parameters …...

Git、小乌龟、Gitee的概述与安装应用超详细(组长与组员多人开发版本)
目录 一、概述 1.什么是Git? 2.Git历史来源 3.Git的优点? 4.什么是版本控制? 5.版本控制工具种类? 6.Git工作机制 7.Git、小乌龟、Gitee、凭据管理器的简单介绍 二、Git下载安装 下载Git 安装Git 安装完成后查看版本 三、下载小…...

【java 高并发编程之JUC】高阶JUC特性总结
1 线程中断机制 1.1 什么是中断? 首先 一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。所以,Thread.stop, Thread.suspend, Thread.resume 都已经被废弃了。 其次 在Java中没有办法立即停止一条线程,然…...

行业分析| 智能无人自助设备
智能无人自助设备运用二维码技术、音视频通信技术和AI智能技术等相结合,提供了无人超市、自动售货机、智能快递柜等。当下很多商业地区或社区,都放置了智能无人自助设备,不仅可以为商家节省时间和精力、提升运营环境,也可以为众多…...

使用契约测试得不偿失?试试契约先行开发
契约维护的难题 如今微服务凭借其灵活、易开发、易扩展等优势深入人心,不同服务之间的集成和交互日渐繁多且复杂。这些服务之间交互的方式是多样的,常见的有 HTTP 请求和消息队列。在它们交互的过程中,会有服务的版本演进,交互信…...

函数编程之Function
文章目录前言一、Function是什么?二、Function 怎么用?1.简单使用2.真正的强大之处总结前言 在java8之后,我已经习惯了开始用stream()方式编程,但是对于新引入的其他功能,还是不清楚,今天经历了一个编程问题后,让我对于Function() 这个函数有了新的认知; 一、Func…...

Vue 双向绑定原理
Vue2 双向绑定原理 mvvm 双向绑定,采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来 劫持各个属性的 setter、getter,在数据变动时发布消息给订阅者,触发相应的监听回调。 几个要点: 1&#…...

【数据治理-03】无规矩不成方圆,聊聊如何建立数据标准
无规矩,不成方圆!数据标准(Data Standards)是保障数据的内外部使用和交换的一致性和准确性的规范性约束,作为数据治理的基石,是绕不开的一项工作,如此重要的活如何干,咱们一起聊聊。…...
dos常用命令
DOS(磁盘操作系统)命令,是DOS操作系统的命令,是一种面向磁盘的操作命令,主要包括目录操作类命令、磁盘操作类命令、文件操作类命令和其它命令。 使用技巧 DOS命令不区分大小写,比如C盘的Program Files&…...
解决原生template标签在Vue中失效的问题
文章目录前言一、事件未绑定的原因二、如何处理原生template标签总结前言 需要原生Javascript three.js的数据标注平台加入Vue框架. 本来挺顺利的, 我直接在mounted周期做了初始化, 然后剩下的操作还是交给JavaScript文件执行, 最后发现里面有很明显的事件触发问题. 一、事件…...

节能降耗方案-医院能源管理系统平台的研究与应用分析
摘要:综合性医院作为大型公共机构,能耗高的问题日益突出,构建能耗监控平台对医院能耗量化管理以及效果评估已经成为迫切需要。建立智能能耗监控平台,对采集的能耗数据进行分析,实现对医院能耗平台监控,为医…...

Redis学习【7】之发布_订阅命令和事务
文章目录一 发布/订阅命令1.1 消息系统1.2 subscribe1.3 psubscribe1.4 publish1.5 unsubscribe1.6 punsubscribe1.7 pubsub1.7.1 pubsub channels1.7.2 pubsub numsub1.7.3 pubsub numpat二 Redis 事务2.1 Redis 事务特性Redis 事务实现2.1.1 三个命令2.1.2 基本使用2.2. Redi…...

MySQL8.0 optimizer_switch变化
Optimizer_switch变量是支持对优化器行为的控制。是一组值标志,每个标志都有一个on或off的值,以指示是否启用或禁用相应的行为。 MySQL8.0里除了熟悉的hash join重大变化之外,其他方面也有优化。 mysql> SHOW VARIABLES LIKE OPTIMIZER_…...

Web--Maven
1.maven管理项目的区别 2. 安装后,conf目录下的setting文件中,对本地仓库的配置 此处可替换成自定义的本地仓库地址,默认为c:/user/17860/.m2/repository(我的电脑上的) 3.maven项目的标准目录结构 4.项目的生命周期 5.Maven概…...

深入理解MySQLⅢ -- 锁与InnoDB引擎
文章目录锁概述全局锁表级锁表锁元数据锁意向锁行级锁行锁间隙锁&临键锁InnoDB引擎逻辑存储结构架构内存结构磁盘结构后台线程事务原理redo logundo logMVCC锁 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源&#x…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...

深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学
一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件,其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时,价带电子受激发跃迁至导带,形成电子-空穴对,导致材料电导率显著提升。…...