当前位置: 首页 > news >正文

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简介

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

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,并给出具体开…...

停车辅助系统的技术和变化

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

扬帆优配|日均客运量恢复,民航业加速复苏,外资买入2股超亿元

春运民航客运量康复至疫情前七成。 2月16日&#xff0c;民航局举行2月例行新闻发布会。会上介绍&#xff0c;自1月7日至2月15日&#xff0c;春运40天&#xff0c;民航运送旅客5523万人次&#xff0c;日均客运量138万人次&#xff0c;同比去年春运添加39%&#xff0c;康复至2019…...

【PyTorch】教程:torch.nn.ModuleDict

Containers-ModuleList CLASS torch.nn.ModuleDict(modulesNone) 将所有的子模块放到一个字典中。 ModuleDict 可以像常规 Python 字典一样进行索引&#xff0c;但它包含的模块已正确注册&#xff0c;所有 Module 方法都可以看到。 ModuleDict 是一个有序字典。 Parameters …...

Git、小乌龟、Gitee的概述与安装应用超详细(组长与组员多人开发版本)

目录 一、概述 1.什么是Git&#xff1f; 2.Git历史来源 3.Git的优点? 4.什么是版本控制&#xff1f; 5.版本控制工具种类&#xff1f; 6.Git工作机制 7.Git、小乌龟、Gitee、凭据管理器的简单介绍 二、Git下载安装 下载Git 安装Git 安装完成后查看版本 三、下载小…...

【java 高并发编程之JUC】高阶JUC特性总结

1 线程中断机制 1.1 什么是中断&#xff1f; 首先 一个线程不应该由其他线程来强制中断或停止&#xff0c;而是应该由线程自己自行停止。所以&#xff0c;Thread.stop, Thread.suspend, Thread.resume 都已经被废弃了。 其次 在Java中没有办法立即停止一条线程&#xff0c;然…...

行业分析| 智能无人自助设备

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

使用契约测试得不偿失?试试契约先行开发

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

函数编程之Function

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

Vue 双向绑定原理

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

【数据治理-03】无规矩不成方圆,聊聊如何建立数据标准

无规矩&#xff0c;不成方圆&#xff01;数据标准&#xff08;Data Standards&#xff09;是保障数据的内外部使用和交换的一致性和准确性的规范性约束&#xff0c;作为数据治理的基石&#xff0c;是绕不开的一项工作&#xff0c;如此重要的活如何干&#xff0c;咱们一起聊聊。…...

dos常用命令

DOS&#xff08;磁盘操作系统&#xff09;命令&#xff0c;是DOS操作系统的命令&#xff0c;是一种面向磁盘的操作命令&#xff0c;主要包括目录操作类命令、磁盘操作类命令、文件操作类命令和其它命令。 使用技巧 DOS命令不区分大小写&#xff0c;比如C盘的Program Files&…...

解决原生template标签在Vue中失效的问题

文章目录前言一、事件未绑定的原因二、如何处理原生template标签总结前言 需要原生Javascript three.js的数据标注平台加入Vue框架. 本来挺顺利的, 我直接在mounted周期做了初始化, 然后剩下的操作还是交给JavaScript文件执行, 最后发现里面有很明显的事件触发问题. 一、事件…...

节能降耗方案-医院能源管理系统平台的研究与应用分析

摘要&#xff1a;综合性医院作为大型公共机构&#xff0c;能耗高的问题日益突出&#xff0c;构建能耗监控平台对医院能耗量化管理以及效果评估已经成为迫切需要。建立智能能耗监控平台&#xff0c;对采集的能耗数据进行分析&#xff0c;实现对医院能耗平台监控&#xff0c;为医…...

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

Web--Maven

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

深入理解MySQLⅢ -- 锁与InnoDB引擎

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

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

【51单片机】4. 模块化编程与LCD1602Debug

1. 什么是模块化编程 传统编程会将所有函数放在main.c中&#xff0c;如果使用的模块多&#xff0c;一个文件内会有很多代码&#xff0c;不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里&#xff0c;在.h文件里提供外部可调用函数声明&#xff0c;其他.c文…...

汇编语言学习(三)——DoxBox中debug的使用

目录 一、安装DoxBox&#xff0c;并下载汇编工具&#xff08;MASM文件&#xff09; 二、debug是什么 三、debug中的命令 一、安装DoxBox&#xff0c;并下载汇编工具&#xff08;MASM文件&#xff09; 链接&#xff1a; https://pan.baidu.com/s/1IbyJj-JIkl_oMOJmkKiaGQ?pw…...

河北对口计算机高考MySQL笔记(完结版)(2026高考)持续更新~~~~

MySQL 基础概念 数据&#xff08;Data&#xff09;&#xff1a;文本&#xff0c;数字&#xff0c;图片&#xff0c;视频&#xff0c;音频等多种表现形式&#xff0c;能够被计算机存储和处理。 **数据库&#xff08;Data Base—简称DB&#xff09;&#xff1a;**存储数据的仓库…...

JavaScript性能优化实战大纲

性能优化的核心目标 降低页面加载时间&#xff0c;减少内存占用&#xff0c;提高代码执行效率&#xff0c;确保流畅的用户体验。 代码层面的优化 减少全局变量使用&#xff0c;避免内存泄漏 // 不好的实践 var globalVar I am global;// 好的实践 (function() {var localV…...