介绍
- Amazon Web Services(AWS)是Amazon公司提供的公有云服务。AWS Lambda是AWS的Serverless计算服务
AWS
- 自2002年推出以来,经过了十余年的发展,AWS已经发展成为一个庞大的云服务体系。涵盖了计算、存储、数据库、网络、开发工具、安全、数据分析、AR、VR及人工智能等服务
-
AWS云服务目录
AWS Serverless
- AWS是Serverless技术的重要推动者。2014年推出的AWS Lambda是Serverless技术发展的一个重要里程碑。因为这几年AWS Lambda的流行,很多人自然而然地认为AWS的Serverless就是AWS Lambda。Serverless不仅仅是FaaS,还应该包含BaaS的能力。AWS平台上所有能让AWS Lambda消费的云服务都是AWS Serverless能力的组成部分
-
AWS Serverless能力与产品服务
AWS Lambda概述
- AWS Lambda是一个事件驱动的函数计算平台、一个Serverless FaaS平台和AWS公有云平台Serverless能力的核心组件
- AWS Lambda负责根据负载实例化若干个用户代码逻辑的实例响应请求。用户不需要关心运行这些代码逻辑的底层计算资源,只需专心实现业务需求的代码逻辑
- AWS Lambda组件
- 函数:Function是AWS Lambda的执行单元,它往往是一段无状态的代码片段。函数定义了用户需要执行的业务逻辑。用户可以使用Node.js、Python、Java、C#及Go等语言编写函数逻辑
-
AWS Lambda函数计算平台
- 事件源:Event Source是触发AWS Lambda函数执行的触发方。事件源可以是AWS上的云服务,也可以是第三方应用服务
- 事件:Event描述了触发AWS Lambda函数的原因。事件对象中包含来自事件源的详细信息。事件可以作为函数的输入参数。函数根据具体事件的信息进行业务处理
第一个Serverless应用
获取AWS账号
- 在AWS网站上免费注册AWS公有云账号
-
AWS账号注册页面
- 用到的AWS Lambda服务,黑夜每个月有100万次免费的调用
- 注意:AWS在中国的服务由其中国区的合作伙伴提供,AWS中国区域的服务只针对企业开放。个人用户可以注册和使用AWS其他区域的服务
AWS Lambda控制面板
-
在欢迎页面点击菜单中“控制面板”即可进入Lambda控制面板
-
AWS Lambda控制面板
创建函数
- 在Lambda控制面板中单击页面上方按钮“创建函数”,选择“从头开始创建”
-
创建函数页面
-
创建函数输入项
- 单击页面右下方的按钮“创建函数”完成函数的创建
编辑函数
-
函数编辑页面
-
选择函数func-hello-world所在的方块,可以看到页面的下方出现了代码编辑器,将示例代码的内容替换成下面的内容
-
exports.handler = (event, context, callback) => { var body = "{'message':'Hello World!'}"; var response = { "statusCode": 200, "body": body, }; callback(null, response); };
测试函数
- 单击页面右上方的“保存”按钮。然后单击“测试”按钮。此时将弹出“编辑测试事件”对话框。选择“创建新测试事件”,并输入测试事件名称testHelloWorld,然后单击“创建”按钮
- 回到控制面板,可以看到测试事件testHelloWorld已经被选中,再次单击“测试”按钮,测试平台将执行函数测试。测试完成后,页面上可以看到测试的返回结果
-
函数测试结果
外部访问
-
在函数func-hello-world的编辑界面中单击触发器列表中的选项API Gateway添加API网关组件。API网关组件添加完毕后,API Gateway组件的图标将出现在架构图中
-
添加API Gateway组件
-
页面的下方将会出现API相关的配置项。在输入框API的下拉菜单中选择菜单项“创建新API”
-
创建新API
-
参数输入完毕后单击页面右下方的“添加”按钮,之后可见API被成功添加
-
新建的API详细信息
-
看到浏览器中显示在Lambda函数中定义的返回值
-
测试访问Lambda函数
运维监控
- 在函数func-hello-world的主界面单击页面上方的“监控”标签,在监控页面上可以看见关于函数func-hello-world的相关统计信息,包括调用计数、调用持续时间、调用错误等
-
Lambda函数的监控页面
权限控制
- 在创建函数fun-hello-world的例子中,我们通过基于一个预定义好的权限角色模板创建了一个新的权限角色func-hello-world-role
IAM
- 用户可以打开AWS IAM的控制台。 https://console.aws.amazon.com/iam
- 角色func-hello-world-role关联了两个策略(Policy),这两个策略允许该角色向DynamoDB和CloudWatch写入数据
-
IAM中角色func-hello-world-role的定义
策略
- 角色func-hello-world-role所引用的其中一条策略。该策略定义了权限所有者可对CloudWatch Logs服务的特定资源进行写入操作
-
IAM策略定义
角色
- 在AWS Lambda中,用户可以为一个特定的权限需求定义一个角色,然后将该角色赋予若干个有着相同权限需求的Lambda函数
编程模型
- AWS Lambda所支持的语言有Java 8、C#(.NET Core 1.0、2.0)、Node.js(4.3、6.10、8.10)、Go(1.x)及Python(2.7、3.6)。除了官方支持的编程语言之外,用户还可以通过一些开源社区工具(如Apex)增加对其他语言的支持
代码开发
- 在Lambda的控制面板中在线开发函数代码,或者将编写好的代码以压缩包的形式从本地或者Amazon S3存储中上传到Lambda平台
Handler
-
Handler是一个AWS Lambda函数的执行入口。AWS Lambda会执行Handler定义的函数,并且会将上下文对象Context传递给该函数
-
AWS推荐用户尽量使Handler函数保持简洁
-
将业务逻辑和Handler函数分离的另一个好处是,可以使函数应用更容易地迁移到其他Serverless平台上
-
nodejs的Handler示例
-
exports.handler = function(event, context, callback) { ... }
-
python的Handler示例
-
def handler(event, context): ... return "hello world"
执行上下文
-
AWS Lambda在执行Handler入口函数时会将系统的上下文信息通过对象Context Object传递给函数,用户在函数内通过Context Object可以获取函数执行环境上下文的信息
- 当前执行实例的函数名称、版本号、资源唯一标识、内存限制、剩余执行时间
- 当前执行实例的AWS Request ID
- 当前执行实例的日志组名、日志流名称
- 当调用客户端为AWS Mobile SDK应用时,用户可以获取客户端的信息
日志输出
- 用户可以在AWS Lambda的函数内输出日志信息,并被AWS平台收集
异常处理
-
当函数执行出现错误,或者函数主动抛出异常时,Lambda将会捕捉到异常信息,并以JSON对象的形式将异常的信息返回
-
异常示例
-
def lambda_handler(event, context): raise Exception('Something goes wrong!') return 'hello'
-
Lambda捕获的异常日志
无状态
-
由于函数的执行环境是非持久化的,而且函数将会以多个实例的形式来执行
-
有时不可避免地会遇到一些依赖状态的业务场景
-
函数执行过程中状态的存取可以通过外部的持久化服务
事件驱动
- AWS Lambda的一个重要特性就是事件驱动
事件源
-
触发AWS Lambda函数执行的事件源有多种,
-
表4-3 AWS Lambda支持的事件源
触发模式
-
手工触发调用一个Lambda函数时,用户可以选择同步模式(Synchronous Invoca-tion)或异步模式(Asynchronous Invocation)
-
Lambda函数的触发实现机制有两种,一种是推(Push)模式,一种是拉(Pull)模式
-
推模式
- 一种是基于数据流(Stream)的服务,一种是非流式的常规AWS服务
- 对于常规的AWS服务,Lambda函数的触发方式是推模式
-
S3服务触发AWS Lambda函数
-
拉模式
- 流式数据服务与Lambda的集成则是采用拉模式
-
DynamoDB服务触发Lambda函数
日志监控
- 日志:AWS Lambda函数运行所输出的日志会被CloudWatch Logs服务收集
-
Lambda函数日志
- 监控:CloudWatch控制台中用户可以查看这些指标
-
Lambda函数性能指标
开发辅助
-
AWS Lambda
-
提供了一系列提高开发效率的功能,如环境变量、标签和版本控制等
环境变量
- 程序中的配置性的信息则不应该硬编码在代码中,而应该通过环境变量的方式实现外部化
-
为Lambda函数设置环境变量
- Lambda平台在环境变量的管理上考虑得非常周到,环境变量中存放针对不同环境的用户名和密码等敏感信息变得更加安全
标签
- 所有的函数默认都是在一个大列表中。Lambda函数的组织是通过标签(Tag)来实现的
-
为Lambda函数设置标签
版本控制
-
用户可以对函数的代码和配置进行版本控制。在Lambda的版本管理中,最新代码的版本号为$LATEST
-
Lambda还支持别名(Alias)。别名就像指向某个特定版本的Lambda函数的指针
运行限制
- AWS Lambda的一个强大之处在于其可以根据实际的访问量对函数的运行实例进行弹性扩展
资源限制
- 每一个Lambda函数执行时都会被加载到AWS的EC2虚拟主机中。主机的操作系统是Amazon Linux
-
Lambda函数执行限制
并发控制
- 默认每个AWS账户在每个AWS区域(Region)的Lambda函数的并发最大值为1000个实例。如果用户有更高的性能要求,可以联系AWS的客服提升并发的上限值
配置与部署
-
通过基于YAML格式的SAM描述文件,用户可以定义一个具体Lambda函数的各类配置信息,如运行环境、资源限制、API网关、权限等
-
在函数func-hello-world的主页上点击“操作”按钮,然后选择菜单项目“导出函数”,就可以下载函数func-hello-world对应的SAM描述文件了
-
当用户通过SAM定义Lambda应用后,在正式部署前还需要进行本地测试。AWS SAM Local是一个由Python实现的命令行工具。通过SAM Local,用户可以在本地开发环境中运行和调试SAM定义的AWS Lambda应用。SAM Local可以模拟事件源的事件输出,启动本地API网关实例
-
通过SAM和SAM Local,Lambda用户可以更容易地定义Lambda应用,实现CICD流水线
本章小结
-
AWS Lambda是目前市场上广受认可的Serverless计算平台,了解AWS Lambda对于使用其他Serverless平台或者构建私有Serverless架构平台有着非常重要的参考意义
-
一个完整的Serverless平台除了函数的执行环境之外,还需要提供API网关、安全、日志、监控、开发支持以及与各类服务的集成等各个方面的能力
作者:yeedom
链接:https://www.jianshu.com/p/c94a8941ff33
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。