Amazon S3简介

news2024/11/13 13:03:49

前言:

这段时间来到了某大数据平台,做平台技术底座封装和一些架构等等,有结构化数据也有非结构数据,涉及到很多技术,自己也私下花时间去研究了很多,有很多纯技术类的还是需要梳理并记录,巩固以及复习。一个项目用到了几个云存储,其中就包括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 中就是文件的内容。

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

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

相关文章

保姆级教程:Win10远程连接MACBook、MACBook远程连接Win10。

本篇给大家展示Windows远程连接连接MACBook、MACBook远程连接Windows的方法。需要明确的是&#xff0c;这种通过TCP远程连接的远程很稳定&#xff0c;基本比向日葵等软件流畅很多&#xff0c;但是缺点是需要保证在同一网域下&#xff0c;也就是同一局域网下&#xff0c;部分情况…

中国协同办公的终局是什么?

换言之&#xff0c;工具一体化是基本要求&#xff0c;但基于全链路集成的生态则是因地制宜、于当下的产业探索。 作者|斗斗 编辑|皮爷 出品|产业家 “计划裁员1300人&#xff0c;占到全球员工的15%。”美国东部时间2月7日&#xff0c;Zoom CEO袁征在官网博客发布公开信…

【SpringBoot】分布式日志跟踪—通过MDC实现全链路调用日志跟踪

一.MDC 1.MDC介绍 MDC&#xff08;Mapped Diagnostic Context&#xff0c;映射调试上下文&#xff09;是 log4j 和 logback 提供的一种方便在多线程场景下记录日志的功能。MDC 可以看成是一个与当前线程绑定的Map&#xff0c;可以往其中添加键值对。MDC 中包含的内容可以被同…

Python机器学习入门笔记(2)—— 分类算法

目录 转换器&#xff08;transformer&#xff09;和估计器&#xff08;estimator&#xff09; K-近邻&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;算法 模型选择与调优 交叉验证&#xff08;Cross-validation&#xff09; GridSearchCV API 朴素贝叶…

UE4 渲染学习笔记(未完)

原文链接&#xff1a;虚幻4渲染管线入门 - 知乎 从原文摘抄一下&#xff1a; 渲染框架 1&#xff0c;一套是传统的以RHICmdList为核心构建RenderPass&#xff0c;从RHICmdList.BeginRenderPass(...)开始&#xff0c;以RHICmdList.EndRenderPass()结束的框架。 2.一套是以新的Gr…

【面向对象语言三大特性之 “继承”】

目录 1.继承的概念及定义 1.1继承的概念 1.2 继承定义 1.2.1定义格式 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 5.继承与友元 6. 继承与静态成员 7.复杂的菱形继承及菱形虚拟…

linux(全志)初始环境到移植lvgl

一、 格式化TF卡 1. linux命令行格式化 1.1 找到U盘位置&#xff08;已挂载&#xff09; sudo fdisk -l 如图&#xff0c;我的在/dev/sdb 1.2 格式化U盘 sudo mkfs -t vfat /dev/sdb-t 后面是格式化为哪种文件系统格式&#xff0c;vfat就是fat32格式&#xff0c;最后…

Hashmap链表长度大于8真的会变成红黑树吗?

1、本人博客《HashMap、HashSet底层原理分析》 2、本人博客《若debug时显示的Hashmap没有table、size等元素时&#xff0c;查看第19条》 结论 1、链表长度大于8时(插入第9条时)&#xff0c;会触发树化(treeifyBin)方法&#xff0c;但是不一定会树化&#xff0c;若数组大小小于…

Win11电脑速度慢、延迟高怎么办?

作为新版的系统&#xff0c;Windows 11还需要更多的时间完善。不少用户反映升级了Win11后反而感觉速度慢&#xff0c;还有延迟或死机现象。 如果你使用Win11系统时也有这种感觉&#xff0c;那这篇文章就是为你提供的。 问题可能出在系统存储容量低、驱动程序已过时&#xff0…

APP渗透抓包

APP渗透抓包1.APP渗透测试原理2.安装安卓模拟器抓包2.1.安装模拟器2.2.设置代理下载证书2.2.1.burp suite设置代理2.2.2.浏览器设置代理2.2.3.下载证书2.3.模拟器安装证书2.3.1.移动证书2.3.2.证书设置2.4.设置代理2.4.1.设置burp suite代理2.4.2.夜神模拟器代理2.5.抓包测试2.…

JVM调优及垃圾回收GC

一、说一说JVM的内存模型。JVM的运行时内存也叫做JVM堆&#xff0c;从GC的角度可以将JVM分为新生代、老年代和永久代。其中新生代默认占1/3堆内存空间&#xff0c;老年代默认占2/3堆内存空间&#xff0c;永久代占非常少的对内存空间。新生代又分为Eden区、SurvivorFrom区和Surv…

Node.js安装与配置

Node.js安装与配置 前言 本篇博文记录了Node.js安装与环境变量配置的详细步骤&#xff0c;旨在为将来再次配置Node.js时提供指导方法。 另外&#xff1a;Node.js版本请根据自身系统选择&#xff0c;安装位置、全局模块存放位置和环境变量应根据自身实际情况进行更改。 Node…

spring(四)——————从spring源码角度去解释前面的疑问

前面两篇文章&#xff0c;我们从mybatis-spring的插件包出发&#xff0c;探究如何将第三方框架集成到spring中&#xff0c;也知道了mybatis中使用了FactoryBeanImportBeanDefifinitionRegistrarImport对mapper进行注入。 不过我们在前两篇文章中仍然遗留很多疑点&#xff0c;例…

Revit导出PDF格式图纸流程及“批量导出图纸”

一、Revit导出PDF格式图纸流程 1、点击左上方“应用程序菜单”即“R”图标&#xff0c;进择“打印”选项。 2、在弹出的对话框中&#xff0c;需要设置图纸“打印范围”&#xff0c;选择“所选的视图/图纸选项”&#xff0c;点击“选择”&#xff0c;按钮&#xff0c;选择我们需…

LESS模型与随机森林

模型学习 1 随机森林 https://blog.csdn.net/weixin_35770067/article/details/107346591? 森林就是建立了很多决策树&#xff0c;把很多决策树组合到一起就是森林。 这些决策树都是为了解决同一任务建立的&#xff0c;最终的目标也都是一致的&#xff0c;最后将其结果来平均…

Xline v0.2.0: 一个用于元数据管理的分布式KV存储

Xline是什么&#xff1f;我们为什么要做Xline&#xff1f; Xline是一个基于Curp协议的&#xff0c;用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议&#xff0c;需要两次RTT才能完成一次请求。当部署在单个数据中心时&#xff0c;节点之间的延迟较低&a…

08 SpringCloud 微服务网关Gateway组件

网关简介 大家都都知道在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢&#xff1f; 如果没有网关的存在&#xff0c;我们只能在客户端记录每个微服务的地址&#xff0c;然后分别去用。 这样的架构&#xff0c;会存…

Linux软件管理:源代码安装

前言 Linux上面的软件几乎都是经过GPL的授权&#xff0c;所以每个软件都提供源码 我们的系统中有一个http软件包&#xff08;上一篇文章中安装的&#xff09; 通过man手册我们知道了该软件包属于Apache&#xff0c;所以我们就可以进入它的官网中获取此源码 官网除了能获取源码…

IB学校获得IBO授权究竟有多难?

IB 学校认证之路&#xff0c;道阻且长 The road to IB school accreditation is long and difficult一所学校能获得IB授权必须经过IBO非常严格的审核&#xff0c;在办学使命&教育理念、组织架构、师资力量&授课技能、学校硬件设施和课程体系上完全符合标准才可获得授权…

英特尔 31.0.101.4125显卡驱动更新!

周更驱动的英特尔又来啦&#xff01;时隔一周英特尔为大家带来了31.0.101.4125版本的显卡驱动&#xff0c;支持《英雄连3》、《工人物语&#xff1a;新兴同盟》、《原子之心》、《狂野之心》、《如龙维新&#xff01;极》等游戏。 《如龙维新&#xff01;极》将在2月22日正式登…