购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.1 AWS Lambda简介

AWS Lambda与那些依赖物理机或虚拟机的传统方式有着迥异的架构。用户只需要把业务逻辑以函数的方式进行实现,AWS Lambda的平台服务就会完成所有与执行函数有关的工作,若有必要,平台会自动配置用户函数所需要的底层软件栈,以保持平台的高可用性。频繁的函数调用所引发的可扩展性问题,也会被平台自动处理。

所有的函数都是在容器中执行的。容器是一种通过操作系统内核来提供隔离环境的服务器虚拟化技术。在AWS Lambda的环境下,虽然代码仍旧是在物理(或虚拟)服务器中执行,但由于用户不需要花费时间去管理这些服务器,我们把这种方式定义为无服务器(Serverless)

提示 如需要了解Lambda函数所使用的底层执行环境的更详细信息,请访问http://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html。

当用户在AWS Lambda创建一个新的函数时,需要提供函数的名称,上传代码,并提供代码执行环境的配置信息,这些信息包括:

·函数可以使用的最大内存容量。

·函数运行时的超时时间(如果超时,即使没有执行完成,函数也会被中止)。

·选择一个AWS IAM(Identity and Access Management)的角色作为函数运行的身份,这个身份决定了函数的权限(可以做什么),可以访问什么资源,等等。

提示 在选择函数的最大内存容量时,CPU资源会按比例分配下去。举例来说:128MB内存的函数仅能够获得256MB内存的函数大约一半的CPU能力,反之亦然,512MB内存的函数将获得比256MB内存的函数多一倍的CPU能力。

AWS Lambda采取了一种新颖的计费方式,因为它能为用户更加高效实用地调用底层资源。在AWS Lambda环境下,计费的方式是:

·根据函数被调用的次数。

·全部调用的累计执行时间(以100毫秒为单位)。

执行时间的计费和内存的使用量呈线性关系,如果把内存容量加倍,但是保证函数执行的时间不变,对应的费用也将随之加倍。为了让用户有更好的学习和实际操作体验,AWS Lambda的免费资源包(Free Tier)允许用户免费使用一定数量的资源,每月免费资源包的限额是:

·不超过100万次函数调用。

·以1GB内存容量为基准的首个40万秒执行时间。

如果选择较小的内存容量,则可以获得更多的免费执行时间。例如,如果选择128MB(1GB的八分之一)的内存容量,那么AWS Lambda提供的免费执行时间可以长达320万秒(40万秒的八倍)。更直观地说,AWS Lambda每个月可以提供从40万秒(111小时或4.6天)到320万秒(889小时或大约37天)的免费执行时间,具体取决于用户为函数选择的内存容量。

提示 你需要一个AWS账号来演示和操作本书的例子 ,我们的示例代码和函数消耗的资源不会超过每个月的免费限额,所以你不用担心会发生任何实际的费用开支。有关如何创建AWS用户账号和有关AWS免费资源包的详细信息,请参阅: http://aws.amazon.com/free

在本书中,我们会使用JavaScript(实际上是Node.js)和Python来编写所有的演示代码,但AWS Lambda也同样支持其他编程语言。例如,你可以使用Java语言,或者运行在Java虚拟机(JVM)上的其他语言,例如Scala、Clojure。对于像Java这类面向对象编程语言,向AWS Lambda暴露出来的函数实质上是某个对象的方法(method)。

如果需要使用AWS Lambda目前还不支持的编程语言,比如C或者PHP,一种常见的折中办法是使用AWS Lambda已经支持的那些语言,开发一个包裹层(wrapper),然后通过加载那些不支持的语言,编译出静态二进制文件包来执行代码。例如,人们可以把C语言的静态链接库随同包裹层一并提交给AWS Lambda,由包裹层内的代码加载和运行这个静态链接库。

在调用AWS Lambda的函数时,需要在输入中提供一个事件(event)和一个上下文(context)对象:

·事件是函数获得输入参数的一种方法,通常采用JSON格式。

·上下文对象用来描述执行环境的有关信息以及事件是如何被接收并处理的,类似于传统操作系统的环境变量。

函数可以被同步调用并立刻返回结果(见图1-2)。我们使用同步(synchronous)这个词来表述这类函数调用方式,但是在例如“AWS Lambda API参考文档”或“AWS命令行文档”这些在线文档中,这种调用方式也被称为请求响应(RequestResponse)式调用。

图1-2 采用请求响应的同步方式调用AWS Lambda函数,函数收到包括事件和上下文对象的输入信息,执行完毕后立刻返回结果

举例来说,我们编写一个计算两个数字之和的AWS Lambda函数,使用同步调用的方式。JavaScript的写法是:

Python的写法是:

我们先关注函数的执行过程,稍后再分析这些代码的语法细节。使用下面的JSON对象作为事件输入,函数执行完毕后会返回结果30:

注意 JSON文件中的数字不应该包含引号,否则在Node.js和Python中的+操作将变成两个字符串的组合。

函数同样可以被异步调用。在这种情况下,函数被调用后开始执行,同时立刻返回,并不会输出任何返回值(见图1-3)。我们使用异步(asynchronous)这个词来表述这类函数调用方式,但是在例如“AWS Lambda API参考文档”或“AWS命令行文档”这些在线文档中,这种调用方式也被称为事件(Event)式调用。

图1-3 事件式异步调用AWS Lambda函数,调用立刻得到返回,但函数仍旧继续执行

当Lambda函数被中止后,AWS Lambda服务不会保留与之对应的任何会话信息。这样的交互方式通常称之为“无状态”。考虑到这种行为,以异步的方式调用Lambda函数往往是有益处的,调用方不必等待函数完成执行对其他资源(如共享存储区上的文件或数据库的记录,等等)的读取和修改,也不需要等待函数调用其他第三方服务(诸如发送邮件或推送)(见图1-4)。

图1-4 函数可以执行针对其他资源的创建、更新、删除操作。资源也可以是另一个服务,比如用来发送对外的电子邮件

举例而言,我们可以使用AWS Lambda的日志输入能力来实现一个简单的日志功能,用户通过异步的方式在Node.js中调用:

在Python代码中这就变得更简单,一条print 语句就可以完成日志的输出:

我们用JSON对象把需要记录的日志信息传递给Lambda函数:

在这两个日志例子中,AWS Lambda代码集成和调用了Amazon CloudWatch日志服务。函数的执行并没有一个默认的输出设备(通常称之为无头环境,即headless environment),默认的日志输出由AWS Lambda的执行过程中转发到CloudWatch。用户可以全方位地使用CloudWatch日志服务提供的功能,包括日志的保留时间,或从日志记录的数据中创建性能指标。我们会在本书的第4章提供有关日志功能的更详细示例和用例。

当函数订阅和响应其他服务的事件时,异步调用就更具价值,比如:Amazon S3对象存储、Amazon DynamoDB非关系型数据库。

当函数订阅了其他资源的事件后,当事件发生时,函数被异步的方式调用,事件的具体信息将会被作为输入提供给函数(见图1-5)。

图1-5 函数可以订阅由资源直接发出的事件,或由其他服务与资源交互。对于不是由AWS直接管理的资源,用户需要自行管理事件的触发和订阅

举例而言,某个移动应用的用户上传了一张高清晰度的图片到文件存储后,订阅这类事件的函数将被调用,其中包含新文件位置的事件信息就是这个函数的输入值。函数执行后可以读取文件,创建用于索引页面上的缩略图,然后将其写回到文件存储区。

现在,你已经初步了解了AWS Lambda的工作方式:以函数的方式来组织代码,这些函数可以直接被调用,也可以由事先订阅的事件来触发。

在下一节,我们将开始在自己的应用程序中使用函数。 Yv/C6hFy8g6qjZBu+56GcOWZRYkNIKyaHUsJGrw0eR5pn9TemwW/m9M3pfT9H4gW

点击中间区域
呼出菜单
上一章
目录
下一章
×