安全
DDoS防护
DDoS原生防护可以直接把防御能力加载到云产品上,不需要更换IP,也没有四层端口、七层域名数等限制。DDoS原生防护部署简易,购买后只需要绑定需要防护的云产品的IP地址即可使用。
支持防护的云产品:ECS、SLB、EIP(含NAT)、轻量服务器、WAF。
什么是DDoS?
DDoS(分布式拒绝服务)攻击:通过大规模的互联网流量淹没木服务器或周边基础设施来破坏目标服务器、服务或网络正常流量的一种恶意行为。类似于,告诉公路发生交通堵塞妨碍正常车辆抵达。
DDoS攻击原理
DDoS是通过连接互联网的计算机网络进行的。这些网络由计算机和其他设备(例如loT)组成,他们感染了恶意软件被攻击者远程控制。单个被控制的设备叫做“机器人”,一组机器人组成“僵尸网络”。攻击者通过向每个机器人发送远程指令来发动攻击。这些僵尸网络把受害者的服务器和网络作为目标,大量的机器人将请发送到目标的IP地址,导致目标服务器或网络不堪重负,从而造成对正常的流程拒绝服务。由于每个机器都是合法的互联网设备,因此很难区分攻击流量和正常流量。
常见的DDoS攻击
DDoS的症状是网站或服务突然变得很慢或者不可用。根据OSI的七层架构,我们可以将DDoS攻击分为三种:应用程序层攻击、
应用程序层攻击
应用程序层攻击又称第7层DDoS攻击,其目标是耗尽目标资源。攻击目标是生成网页并传输网页响应HTTP请求的服务层。第7层攻击很难防御,因为难以区分是正常流量和攻击流量。
HTTP洪水:
类似于在大量不同计算机的web浏览器中一次又一次按下刷新导致大量的HTTP请求涌向服务器导致拒绝服务。简单的实现可以使用相同范围的攻击 IP 地址、referrer 和用户代理访问一个 URL。复杂版本可能使用大量攻击性 IP 地址,并使用随机 referrer 和用户代理来针对随机网址
协议攻击
协议攻击也称状态消耗攻击,这类攻击会过度消耗服务器资源和或防火墙和负载平衡器之类的网络设备资源,从而导致服务中断。主要针对OSI的第三层和第四层的缩点来导致目标无法访问,即网络层和传输层。
SYN洪水:
此类攻击利用 TCP 握手,通过向目标发送大量带有伪造源 IP 地址的 TCP“初始连接请求”SYN 数据包来实现。目标计算机响应每个连接请求,然后等待握手中的最后一步,但这一步确永远不会发生,因此在此过程中耗尽目标的资源。
容量耗尽攻击
此类攻击试图通过消耗目标与较大的互联网之间的所有可用带宽来造成拥塞。攻击运用某种放大攻击或其他生成大量流量的手段(如僵尸网络请求),向目标发送大量数据。
DNS洪水:
利用伪造的 IP 地址(受害者的 IP 地址)向开放式 DNS 服务器发出请求后,目标 IP 地址将收到服务器发回的响应。攻击者通过向目标 DNS 服务器发送大量的请求,以造成服务器过载、拒绝服务或延迟响应。
如何防护
缓解DDoS攻击的关键是区分正常流量和攻击流量。主要的环节方法有以下几种:
黑洞路由
创建黑洞路由,并将流量汇入该路由。在最简单的形式下,当在没有特定限制条件的情况下实施黑洞过滤时,合法网络流量和恶意网络流量都将路由到空路由或黑洞,并从网络中丢弃。这不是一个理想的解决方案,因为它会导致网络无法访问。
阿里云有一个黑洞策略,当阿里云产品遭受大流量DDoS攻击且攻击流量的峰值带宽超过了资产的DDoS防御能力时,阿里云黑洞策略会暂时屏蔽阿里云产品的互联网入方向流量。因为只有当DDoS攻击的峰值带宽超过了资产的DDoS的防御能力时,才会导致资产发生黑洞。资产的DDoS防御能力越大,则其被DDoS攻击导致触发黑洞的可能就越低。因此,只有提升资产的DDoS防御能力,才可以从根本上预防黑洞。
速率限制
限制服务器在某个时间段接收的请求数量也是防护拒绝服务攻击的一种方法。
虽然速率限制对于减缓 Web 爬虫窃取内容及防护暴力破解攻击很有帮助,但仅靠速率限制可能不足以有效应对复杂的 DDoS 攻击。
Web 应用程序防火墙
Web 应用程序防火墙(WAF)是一种有效工具,有助于缓解第 7 层 DDoS 攻击。在互联网和源站之间部署 WAF 后,WAF 可以充当反向代理,保护目标服务器,防止其遭受特定类型的恶意流量入侵。有效的 WAF 的一个关键价值是能够快速实施自定义规则以应对攻击。
Anycase网络扩散
Anycast 网络会将攻击流量分散至分布式服务器网络,直到网络吸收流量为止。这种方法就好比将湍急的河流引入若干独立的小水渠,将分布式攻击流量的影响分散到可以管理的程度,从而分散破坏力。Anycast 网络在缓解 DDoS 攻击方面的可靠性取决于攻击规模及网络规模和效率。
阿里云DDoS原生防护
DDoS原生防护直接为阿里云公网IP资源提升DDoS攻击防御能力,主要提供针对三层和四层流量型攻击的防御服务。当流量超出DDoS原生防护的默认清洗阈值后,自动触发流量清洗,实现DDoS攻击防护。DDoS原生防护采用被动清洗方式为主、主动压制为辅的方式,针对DDoS攻击在反向探测、黑白名单、报文合规等标准技术的基础上,在攻击持续状态下,保证被防护云产品仍可以正常对外提供业务服务。
阿里云DDoS高防
DDoS高防支持通过DNS解析和IP直接指向两种引流方式,实现网站域名和业务端口的接入防护。根据在DDoS高防中为业务配置的转发规则,DDoS高防将业务的DNS域名解析或业务IP指向DDoS高防实例IP或CNAME地址进行引流。
云防火墙
什么是云防火墙?
云防火墙与传统的防火墙一样,可过滤潜在的恶意网络流量。与传统防火墙不一样的是,云防火墙托管在云中。这种防火墙的云交付模式也称为防火墙即服务(FWaaS)。就像传统防火墙会形成围绕企业内部网络的屏障一样,基于云的防火墙将形成围绕云平台、基础设施和应用程序的虚拟屏障。云防火墙是一种基于云计算环境的网络安全工具,用于保护云上应用和资源免受网络攻击、恶意行为和未授权访问的威胁。它通过监测、过滤和控制网络流量,帮助组织防范各种网络安全风险。
所谓防火墙,是一种可过滤掉恶意流量的安全产品。从传统上来讲,防火墙在受信任的内部网络和不受信任的网络之间运行,例如,在专用网络和互联网之间。早期的防火墙是连接到企业本地基础设施的物理设备。防火墙根据一组内部规则阻止和允许网络流量。大部分防火墙允许管理员自定义这些规则。
为什么需要FWaaS?
银行有很多物理安全措施。大多数实体银行将包括安全功能,例如安全摄像机和防弹玻璃。保安人员和银行员工还帮助阻止潜在的小偷,现金则存储在高度安全的保险箱中。
但是,试想一下,如果每个银行分支机构的现金都存放在全国各地由专门从事安全维护业务的公司运营的保险箱中,而不是存放在一个地方。倘若在分散的保险箱周围没有额外部署其他安全资源,银行如何才能确保其资金安全?这类似于云防火墙的功能。
云就像一个拥有分散资源的银行,但云不是用来存储金钱,而是用来存储数据和计算能力。授权用户几乎可以在任何位置、通过任何网络连接到云。在云中运行的应用程序可以在任何位置运行,也适用于云平台和基础设施。
云防火墙可以阻止针对这些云资产的网络攻击。部署云防火墙就像将银行的本地安全摄像机和实际的安全保卫人员替换为全球全天候安全中心一样,该中心拥有一个集中式数据源,收集来自银行资产所有存放位置的人员和安全摄像机信息。
云防火墙的工作原理
云防火墙类似于传统网络中的防火墙,但它在云环境中运行,并具有弹性扩展的能力。云防火墙通过分析网络流量、识别恶意行为和攻击,然后根据预定义的规则对流量进行过滤和管理。
使用云防火墙/FWaaS 有哪些主要好处?
- 阻止恶意 Web 流量,包括恶意软件和恶意机器人活动。一些 FWaaS 产品还可以阻止敏感数据的流出。
- 流量不必通过一个硬件设备,因此不会产生网络阻塞点。
- 云防火墙可以轻松与云基础设施集成。
- 可以同时保护多个云部署(只要云防火墙供应商支持每个云)。
- 云防火墙可迅速扩大规模,以处理更多的流量。
- 组织不需要自己维护云防火墙,供应商会处理所有的更新。
Serverless
什么是serverless?Serverless从广义上讲,是一种无服务器云原生开发架构,强调让开发者无需关心基础设施,而是专注投入到业务逻辑上。
在传统的开发模式中,开发和部署一个应用需要购买服务器、更新操作系统、搭建开发环境、构建部署应用、配置负载均衡机制、搭建日志分析和监控系统、持续监控应用运行情况。而在Serverless架构下,开发者只需要关心应用的构建与部署以及持续监控应用运行情况。
在云厂商提供的服务中,Serverless架构应该是采用FaaS(函数即服务)以及BaaS(后端服务)来解决问题的一种设计。
如果我们假设传统服务组成是左侧这张图,那么Serverless架构下的应用组成就可以是右边这张图(这里仅展示了一种应用级的架构)。
在这份Serverless工作流中,用户请求云函数,云函数可以是一个基本的Express HTTP路由服务,在云函数中,开发者只需要关心业务逻辑,即无需考虑数据库怎么部署的、要存储文件的话怎么考虑分发加速一系列问题。
当然,上述问题并非不需要考虑,而是不需要我们考虑。云服务商们提供的云数据库、云存储等服务,其本质就是BaaS,在这份数据流中,用户的交互产生的各种数据会保存到云数据库中,如果存在文件上传等操作,则会存储在云存储服务中。现在大部分云存储服务又自带了CDN能力,也就是存储的文件又可以通过简单的配置后快捷分发给其他用户。
下面我们以一个EMAS Serverless的项目来介绍云存储、云数据库、云函数的概念和使用。
首先,什么是EMAS Severless?
EMAS是面向全端场景(移动App、H5应用、小程序、Web应用、PC应用等)的一站式应用研发平台。而EMAS Severless是阿里云提供的基于Serverless技术的一站式后端开发平台,为开发者提供高可用、弹性伸缩的云开发服务,包含云函数、云数据库、云存储、静态网站托管等功能,帮助客户快速实现一云多端应用的搭建,无需管理服务器等基础设施,便可以无缝对接丰富的云资源。
EMAS Serverless提供如下主要功能。
功能分类 | 功能描述 |
---|---|
云函数 | 云函数服务支持使用Node.js进行开发。作为开发者,您可以将代码提交到云端运行,在客户端使用小程序提供的API进行调用。您还可以在云函数中直接通过API调用数据存储和文件存储的服务资源。 |
云数据库 | 数据存储服务是基于MongoDB托管在云端的数据库,数据以JSON格式存储。数据库中的每条记录都是一个JSON格式的对象。一个数据库可以有多个集合(相当于关系型数据中的表)。 |
云存储 | 文件存储服务支持文本、图片和其他由用户生成的内容存储到云端。开发者可以在小程序端和控制台使用云存储功能。图片上传成功后,系统会自动生成一个资源链接。开发者可以在小程序中使用该图片地址。 |
云调用 | 提供阿里经济体开放API能力,支持小程序中直接调用,无需自己搭建服务端。 |
静态网站托管 | 提供H5和Web静态资源托管服务,支持自定义域名绑定。 |
准备工作
-
开通EMAS服务
-
进图EMAS的管理控制台,创建项目和应用
-
创建服务空间
云函数SCF
什么是云函数
SCF,全名Serverless Cloud Function,是函数即服务的一种,在不同云服务商的叫法可能略有不同。
其主要特点是,可以为开发者提供无需购买和管理服务器的情况下运行代码,在 Serverless 中,云函数是作为计算容器存在的,可以作为服务接口使用,也可以做为中转服务使用,也可以编写业务逻辑。我们经常谈的 FaaS(Functions as a Service)中最核心的就是云函数。
如果实在无法理解,还可以这么想——我们写了一个函数,可以直接部署到服务器上跑。
FaaS的基本特点是资源利用率高,其函数实例可以缩容到0,而相比之下另一个常用来比较的服务,PaaS(平台即服务)最少也需要保持一个实例。
那么这就带来一个问题了,如果我们以Node的一次启动举例,就会发现,我们正常运行一个Node后端程序,需要安装依赖、打包(非必须)、运行,这个过程,尤其是安装依赖是非常漫长的,那FaaS是怎么做到的呢?此时就要提到一个概念,冷启动。对FaaS来说,从零启动一个实例的过程叫做冷启动,这个过程基于不同语言的特性,通常为100ms-700ms,而NodeJs在这块的表现最好,Lambda提供的FaaS服务执行时长的中位数是 60 毫秒。
云函数的使用
- 传参
module.exports = async ctx => {
ctx.logger.info('hello %s', ctx.args.hello);
};
-
打印日志
为了便于开发调试、问题排查和日常监控,云函数提供日志服务。您可以在云函数中使用
ctx.logger
方法打印不同类型的日志信息,然后在云函数控制台中查看执行日志。目前支持以下类型日志:info、warn、error、debug
module.exports = async (ctx) => {
ctx.logger.info('invoke args: %j', ctx.args);
};
日志查看:
-
环境参数:可以在云函数内通过ctx.env来获取环境参数,例如SpaceId、调用来源、客户端源IP和客户端UserAgent等信息
-
调用EMAS Serveless的基础服务
在云函数中,您可以直接调用同一环境(空间)的数据存储和文件存储服务以及获取当前请求用户的基本信息。
-
云数据库服务调用
module.exports = async ctx => { const args = ctx.args; return await ctx.mpserverless.db.collection('user').find({ uid: args.uid }); };
-
-
云存储服务调用
module.exports = async ctx => { const args = ctx.args; return await ctx.mpserverless.file.deleteFile(args.url); };
-
用户信息管理
module.exports = async ctx => { return await ctx.mpserverless.user.getInfo(); };
-
HTTP服务
云函数提供了ctx.httpclient HTTP请求方法。无需额外依赖,您就可以请求任何HTTP和HTTPS协议的Web服务。
module.exports = async ctx => { const res = await ctx.httpclient.request('https://www.example.com/x/xxx.htm'); return { html: res.status === 200 ? res.data : '', }; };
-
定时触发
-
编辑定时触发的cron表达式,cron总共有6个参数,每两个参数之间用空格隔开,从左到右一次为妙、分、时、日、月、星期。其中除星期外,其他的取值范围都时有效的数字,例如日为1
31或128,由月份时间确定。星期取值为0~7,此外也可以用特殊字符。特殊字符如下:特殊字符 含义 逗号(,) 表示列出枚举值。例如:在时字段中 2,3,4
表示2点、3点和4点。连接号(-) 表示指定范围的所有值。例如:在日字段中, 1-5
包含指定月份的1号到5号。星号(*) 表示所有值。例如:在时字段中, *
表示每个小时。问号(?) 表示不指定。可以日或者星期字段中使用。 正斜线(/) 表示起始时间开始触发,然后每隔固定时间触发一次。 例如:在分字段中,输入 1/10
以指定从第一分钟开始的每隔十分钟触发一次,第11分钟、第21分钟和第31分钟,以此类推。
其中:
- triggerName 是触发器的名称,定时触发器固定为TIMER_LATEST。
- triggerTime 是触发执行的时间,实际可能会略晚于 cron 表达式中设置的时间。
-
-
HTTP触发
EMAS Severless支持由HTTP请求触发云函数调用的功能,首先需要开启空间的触发功能,系统会为开启的HTTP触发功能的空间分配一个默认域名,供HTTP触发使用。
选择要触发的云函数,填写触发路径,访问
https://${DefaultEndpoint}${HttpTriggerPath}
,即可触发对应的云函数执行。注意:
- 请求路径不能以“/”结尾
- 请求方法值支持GET、POST、PUT、DETETE
- 请求时,Body的Content-Type只支持 “application/json”、“application/x-www-form-urlencoded”、“text/*”
- HTTP触发会添加固定的Header,即
Content-Disposition: attachment
,此字段会使得返回结果在浏览器中以附件的方式下载 5. 请求和响应的Body都不能超过1M
云数据库
什么是云数据库
云数据库是指在云端部署、交付和访问的数据库。与传统的本地数据库一样,云数据库也能组织和存储结构化、非结构化和半结构化数据。不过,它们具有许多优势,包括速度、可扩缩性、敏捷性以及降低费用等。与传统的本地数据库一样,云数据库也可以分为关系型数据库和非关系型数据库。云数据库采用两种部署模型:传统的自行管理和代管式数据库即服务(DBaaS)。
- 传统的自行管理云数据库:云数据库以传统部署模型安装和托管在虚拟机上。借助此模型,您可以更好地控制数据库,并且您的内部 IT 团队仍然负责数据库管理和维护。
- 代管式数据库服务:云数据库以服务的形式进行访问。它在云服务提供商的物理基础架构上运行,其中基础架构负责执行大多数运营、维护和数据库管理任务。通常,它包括自动预配、扩缩、安全、升级和健康监控,这是确保数据库始终可用且保持高性能所需的一切。
云数据库的使用
EMAS Serverless服务使用的是MongoDB,以JSON格式存储数据。数据库中的每条记录都是一个JSON格式的对象,一个数据库可以包含多个集合(相当于关系型数据库中的表),每个集合可看做一个JSON数组。其中云数据库具备常见的增删改查等功能,既可以通过客户端实现也可以通过云函数来进行数据库的操作。
新增数据
'use strict';
module.exports = async function (ctx) {
return await ctx.mpserverless.db.collection('users').insertOne({
name: 'tom',
age: 1
});
};
'use strict';
module.exports = async function (ctx) {
return await ctx.mpserverless.db.collection('users').insertMany([{
name: 'tom',
age: 1
},
{
name: 'jerry',
age: 2
}]);
};
删除数据
mpserverless.db.collection('users')
.deleteOne({
name: 'Tom'
})
.then((res) => {
const hasDeleted = res.affectedDocs > 0;
})
.catch(console.error);
mpserverless.db.collection('users')
.deleteMany({
age: {$lt: 18}
})
.then((res) => {
const hasDeleted = res.affectedDocs > 0;
})
.catch(console.error);
更新数据
'use strict';
module.exports = async function (ctx) {
return await ctx.mpserverless.db.collection('users')
.updateOne({
name: 'jerry'
}, {
$set: {
age: 10
}
});
};
'use strict';
module.exports = async function (ctx) {
return await ctx.mpserverless.db.collection('users')
.updateMany({
name: 'jerry'
}, {
$set: {
age: 10
}
});
};
查询数据
'use strict';
module.exports = async function (ctx) {
return await ctx.mpserverless.db.collection('users')
.findOne({
age: { $gt: 18 }
}, {
projection: { name: 1 },
sort: { age: 1 }
});
};
// 查询多条
'use strict';
module.exports = async function (ctx) {
return await ctx.mpserverless.db.collection('users')
.find({
age: { $gt: 18 }
}, {
projection: { name: 1 },
sort: { age: 1 }
});
};
'use strict';
// 查询并删除
module.exports = async function (ctx) {
return await ctx.mpserverless.db.collection('users')
.findOneAndDelete({
age: { $lt: 18 }
}, {
sort: { age: -1 }
});
};
'use strict';
// 查询并替换
module.exports = async function (ctx) {
return await ctx.mpserverless.db.collection('users')
.findOneAndReplace({
name: "zhangsan"
},{
$set: {
name: "lisi",
age: 20
}
});
};
// 查询并更行
'use strict';
module.exports = async function (ctx) {
return await ctx.mpserverless.db.collection('users')
.findOneAndUpdate({
username: "zhangsan"
},
{
$set: {
age: 18
}
});
};
云数据库的查询优化
EMAS Serverless云数据库使用的是MongoDB。在数据量比较大的情况下,有时候查询操作会报错operation exceeded time limit
。常见的优化方法如下:
-
设置合适的索引
我们将查询操作的过滤条件分为“等值测试”以及“范围过滤“,此外还有排序功能,针对复杂的查询语句,索引字段按照:等值测试字段、排序字段、范围过滤字段的方式排列。
-
如果数据量非常大,在设置合适的索引之后仍然会查询超时,要考虑以下优化方案。
- 尽量避免使用skip,至少不应该skip比较大的值,因为skip操作MongoDB服务端依然会扫描被skip的数据,带skip操作的耗时和skip的数量线性相关。可以考虑使用排序和范围查询功能来替代直接使用skip。
- 对于非常大的数据可以分段来查询,即通过一定的条件将一次查询拆分为多次查询操作。
- 可以通过findOne+RangeQuery+Skip+Sort的方式来分段计算Count
- 也可以使用分页查询:使用上一页、下一页、上n页(其中n是一个比较小的数字)、下n页的翻页功能来替换随机翻页。
云数据库事务
在云数据库操作中,对单个Document的操作是原子的,应该尽量使用嵌入式Document设计来避免跨Document事务。所谓云数据库事务:
-
事务要么完全执行,要么不执行,不会存在部分成功的现象。
-
在事务提交之前,事务中的数据更新在事务外完全不可见。在提交事务之后,如果事务操作了多条数据,有可能会出现一部分先可见、另一部分后可见的情况,但是会保证最终一致性。如果事务回滚了,事务中的修改在事务外一直都是不可见的。
-
在事务过程采用的是快照隔离,在快照隔离中:
- 读操作返回的是对象的快照,而非实际数据。
- 写操作会改变对象的快照,保证接下来事务内读到的数据是相同的。
- 写操作会给对象添加事务锁,如果一个对象上有事务锁,其它的事务对该对象的写入会操作失败,非事务对该对象的写入会阻塞,直到事务锁释放。
-
为避免大量的锁冲突,目前仅支持在事务中对单个Document的读写操作。例如
insertOne, findOne, updateOne, deleteOne, replaceOne, findOneAndUpdate,findOneAndReplace,findOneAndDelete
。 -
仅支持在云函数里面使用事务,不支持客户端直接访问云数据库时使用事务。
-
事务的有效期为10s,若一个事务在有效期内没有提交,则会自动回滚。
// 开启事务
const transaction = await ctx.mpserverless.db.startTransaction();
// 在事务中进行单行操作
const findOneResult = await transaction.collection('user').insertOne(
{name: 'xxxx', "age": 19},
);
// 提交事务
await transaction.commit();
// 事务回滚
await transaction.rollback();
云存储OSS
什么是云存储
云存储服务,又称对象存储(OSS),可以理解成服务商们提供了一块远程硬盘让我们存文件,并且为我们解决了本来你要解决的各种通电、插卡、驱动服务,总之现在我们只需要直接使用SDK,能存能取,全看自己。
如果把这个功能做了什么用图表示,或许可以更直观。
对象存储服务常用于文件上传等场景,在传统的存储数据流中,实现文件存储需要考虑接口格式(比如是用二进制流还是Form多文件),又要自己实现文件的存储接口,还需要为用户提供文件访问服务——注意,上述都是简化的过程,可能有些同学觉得,手写也不麻烦。但是,如果我们让这些场景更复杂化,成本就高起来了,举例:
- 我们要上传10GB文件,怎么确保前端上传过程不卡顿,后端在上传时不被这种超大文件上传挤压掉所有CPU?
- 我们要提供文件访问服务,但是我们只向指定用户提供文件服务,也就是我还想有鉴权功能。
而现在,某些云厂商不仅提供了云存储服务,甚至做到了允许用户直接上传文件到云存储。而在这张图片之外,云存储还大多捆绑提供了CDN服务,同时有着多种可配置安全策略
阿里云oss的基本使用
OSS首先需要开通服务,具备创建存储空间(Bucket)、上传和下载文件(Object)等功能。文件上传至目标Bucket后,可以执行如下操作:
- 将文件下载至本地。
- 通过生成签名URL的方式将文件分享给第三方,供其下载或预览。
- 通过自定义域名(自有域名)访问文件,需要将自定义域名绑定至文件所在的Bucket。
SDK使用OSS
OSS提供Java、Python、PHP、Go等多种语言的SDK包,方便快速进行二次开发。这里我们以Node语言为主。
-
首先我们需要安装ali-oss
-
完成初始化操作,主要是配置:申请OSS服务时的地域、阿里云账号AccessKey 、密码以及 bucket存储空间名称。
-
通过异步函数进行调用资源管理
- 查看存储空间
async function listBuckets() {
try {
// 列举当前账号所有地域下的存储空间。
const result = await client.listBuckets();
console.log(result);
} catch (err) {
console.log(err);
}
}
- 查看文件列表
async function list () {
// 不带任何参数,默认最多返回100个文件。
const result = await client.list();
console.log(result);
}
- 上传文件
const headers = {
// 指定Object的存储类型。
'x-oss-storage-class': 'Standard',
// 指定Object的访问权限。
'x-oss-object-acl': 'private',
'x-oss-tagging': 'Tag1=1&Tag2=2',
// 指定PutObject操作时是否覆盖同名目标Object。此处设置为true,表示禁止覆盖同名Object。
'x-oss-forbid-overwrite': 'true',
};
async function put () {
try {
const result = await client.put('exampleobject.txt', path.normalize('D:\localpath\examplefile.txt')
);
console.log(result);
} catch (e) {
console.log(e);
}
}
- 下载文件
async function get () {
try {
// 填写Object完整路径和本地文件的完整路径。Object完整路径中不能包含Bucket名称。
// 如果指定的本地文件存在会覆盖,不存在则新建。
// 如果未指定本地路径,则下载后的文件默认保存到示例程序所属项目对应本地路径中。
const result = await client.get('exampleobject.txt', 'D:\localpath\examplefile.txt');
console.log(result);
} catch (e) {
console.log(e);
}
}
- 删除文件
async function deleteObject () {
try {
// 填写Object完整路径。Object完整路径中不能包含Bucket名称。
let result = await client.delete('exampleobject.txt');
console.log(result);
} catch (error) {
console.log(error);
}
}
效果如下:
云储存的使用
serverless云储存的使用
EMAS Severless提供了云存储功能可以直接对文件进行管理。
同时可以通过云函数对云存储中的资源进行读取和写入,也可以通过客户端进行文件管理。
// 删除文件
module.exports = async ctx => {
const args = ctx.args;
return await ctx.mpserverless.file.deleteFile(args.url);
};
// 上传文件
module.exports = async ctx => {
const args = ctx.args;
return await ctx.mpserverless.file.uploadFile(args.url);
};
静态资源托管
EMAS Serverless提供静态网站托管服务,可以将静态网站的资源内容托管在EMAS Serverless中。
静态网站即为只包含静态内容(例如图片、视频、音频、HTML、CSS、JS、字体)的网站,托管在EMAS Serverless之后,这些静态内容的分发由对象存储OSS和内容分发网络CDN进行支持。
使用如下:
-
开通静态资源托管的功能
-
文件管理:进行文件上传和删除
-
域名管理:静态网站托管功能分配了一个默认域名,仅供测试使用,请求速度会受到限制。如果需要对外正式提供网站服务,请绑定已备案的自定义域名。
-
证书管理:新增证书,填写第三方证书内容和私钥
-
更行网站配置,修改索引文档和错误文档
-
这里我们通过默认域名测试。也可以通过域名访问静态资源。