AWSLambda:事件驱动的云中代码AWSLambda:事件驱动的云中代码黄德滨,合作伙伴解决方案架构师黄德滨,合作伙伴解决方案架构师简单问题•你想把S3存储桶的图片自动创建缩略图•你想检查一下存在DynamoDB中的地址格式是不是正确的…原来的解决方案•创建一批机器获取这些数据或者文件。•对于每批数据或者文件提交一个任务到队列当中。•创建另外一批机器读取这个队列并执行任务。•需要为部署这些服务提供相应的解决方案。•计划整个架构的承载能力,考虑容错机制,长期的平均使用率、突发的高峰使用率等等。•24x7x365监控整个架构利用率、健康状况、安全情况等等•当资源不够时横向或者纵向扩展•操作系统以及运行环境补丁的更新•…...有没有更好的方式?如果每个AWS的服务都产生事件将怎样?PUTCOPYUPDATEDELETERESTOREAmazonS3AWSLambda–优势持续扩展无需管理服务器亚秒级收费AWSLambda–能力自带你的代码计算“能力级别”自选灵活的调用路径细粒度的权限控制AWSLambda–如何工作部署编程监控&日志无状态实现的需求•不用操心扩展能力/无需配置•内置的部署功能•默认的高可用•自带你的代码(BYOC)•无需为闲置付费*BringYourOwnCode使用自己的代码AWSLambda五个应用场景无服务器模式的微服务Amazon服务的功能扩展第三方应用平台的扩展可扩展的移动应用和IoT后台实时的流数据分析移动与IoT应用后台移动与IoT应用后台一个可扩展的移动应用后台。。。不需要敲代码的移动应用后台演示:AWSLambda作为移动应用后台让我们看一下演示。。。创建移动后台应用:各种“插件”需要用户登录?使用AmazonCognito认证。需要根据设备进行渲染?设备信息就在函数上下文对象中。AWSLambdaAWSIoT+AWSLambda设备SDK客户端库组,用以连接、授权和交换消息设备GATEWAY与设备通过MQTT和HTTP协议进行通讯认证授权成熟的认证和加密技术保证安全规则引擎根据规则和AWS服务的路径转换消息设备SHADOW在丢失连接的时候保存thing的状态应用AWSIoTAPI设备注册认证和管理你的thingsLambda函数消息为什么这么容易?消除“在你的环境里运行”和“在客户的环境里运行”之间的距离闲置无需付费闲置无需付费内置Web服务器内置Web服务器自动补丁自动补丁自动部署自动部署自动扩展自动扩展内置监控内置监控内置日志内置日志内置安全内置安全HTTP端点HTTP端点深入探讨:编程模式•三种主要语言–Node.js–Java–Python•加上Scala、Clojure和其他“jvm”语言•后台运行进程–Node.js、Java和Python–也可以使用csh或者你自己的可执行程序•Cron计划执行模式–标准的cron语法–最小5分钟的粒度无服务器的微服务无服务器的微服务可以直接开放为HTTP端点可以直接在SDK中调用•开发语言–JavaScript–Java–Object-C/Swift–.NET–PHP–Go–Python–Ruby•浏览器•移动端–Android–iOS•各种容器–JVM–Node.js一个全新的全托管架构模型ManagedInternetAWSLambda函数AWSAPIGateway缓存AmazonEC2上的端点其他任何公共访问的端点AmazonCloudWatchAmazonCloudFrontAPIGatewayAPIGateway其他AWS服务AWSLambda函数移动应用设备应用传统应用这种模式的关键点•AWSLambda+AmazonAPIGateway意味着没有需要管理的基础架构——我们替你扩展•安全很重要,也很复杂——由AWS的IAM来负责•Swagger导入并生成客户端的SDK——我们可以自动做大部分事情我们要用到的AWS服务AmazonAPIGatewayAWSLambdaAmazonS3AmazonDynamoDB提供API服务端点并路由调用执行应用的业务逻辑提供静态网页服务数据存储让我们看一下演示。。。深入探讨:编程模式•同步或者异步运行代码。。。–AWS命令行接口–AWSLambda自己调用自己(没错,支持Self-hosts模式)–更长的运行时间:最长5分钟•代码是预授权的–选择一个角色Lambda会使用这个角色–跨帐号调用也是支持的–与Cognito和APIGateway一起提供更为健壮的安全架构扩展第三方的平台扩展第三方的平台接入设备的计算资源•AlexaSkillsKit——创建语音应用•AWSLambda作为接入设备或者IoT的平台Slack演示架构Alexa,tellSlacktosend,“I’mgivingthedemonow.”取出消息(使用AmazonSQS队列)Kevinsays,“Breakaleg!”消息上传(使用SlackAPI)团队(频道用户)SlackGitHub事件响应GitHub事件团队(资源库用户)GitHubAmazonSNS消息AWSLambda–合作伙伴平台为什么那么容易?平台提供者•不用任何主机•不用任何License•不用管理能力•不用运行Web服务•低时延同步调用•“触发并忘记”的事件应用开发者•成本低廉•永远免费的节点•不用基础设施•无需“样板”代码•可以选择语言•没有库的限制深入探讨:资源的选择•AWSLambda提供23种“能力级别”•更高的级别提供更多的内存和更强的CPU性能–128MB,低CPU性能–1.5GB,高CPU性能•更高的能力级别:执行计算密集型和爆发式的任务时延低•能力级别影响定价•函数运行时间从100毫秒到5分钟之间扩展Amazon服务的功能扩展Amazon服务的功能扩展AmazonS3添加自动压缩功能AmazonS3存储桶事件AWSLambda原对象压缩对象123如何添加一个AmazonS3功能1.随便从网上找一段Node.js压缩代码示例。2.从AmazonS3事件示例开始:1.从S3上GET原对象2.压缩3.将压缩的版本PUT回S33.选择一些S3存储桶应用这个事件。让我们看一下演示。。。可以与多种AmazonAWS服务集成AWSCloudFormation定制化资源…还在继续增长IoT后台AmazonSWF任务AmazonSNS定制化消息AmazonCognito事件触发AmazonS3事件触发AmazonDynamoDB事件触发AmazonKinesis处理器APIGateway微服务为什么这么容易?请求级别的扩展!•谁知道事件的频率?S3和Lambda!•你不可能低于或者高于配置(依据设计)•根据使用付费实时的流数据分析实时的流数据分析容易的实时数据流分析架构使用AmazonKinesis汲取数据(PUT记录)AWSLambda提取记录你的代码只在每批纪录处理时运行一次AmazonS3AmazonDynamoDB智能设备智能设备点击流数据点击流数据日志数据日志数据AmazonRedshift深入探讨:重试和事件排序•三种可能:–同步调用你的AWSLambda函数。•使用AWSSDK?在这里添加重试逻辑。•使用RESTful直接调用Lambda?你可以完全控制重试。•根据调用决定顺序。–AmazonS3或者SNS触发Lambda函数,或者异步调用你的代码•总共三次重试,然后事件将被忽略•没有顺序–Lambda获取AmazonKinesis或者AmazonDynamoDB更新流•重试没有限制,有顺序保证实用的提示实用的提示细粒度的价格•以100毫秒为单位购买•请求费用低•没有按小时、天或者月度计费•没有按设备收费永远不用为闲置付费。免费使用100万请求和40万GB计算资源每个月每个帐户。构建和部署集成JenkinsGruntAWSCloudFormationAmazonS3合作伙伴版本:开发阶段•开发阶段保持AWSLambda的简单:•上传代码•任何时候都可以修改•最后的更新生效exports.handler=function(event,context){context.succeed(“bye”);}exports.handler=function(event,context){context.succeed(“hi”);}版本:发布•在任何时候都可以将开发发布为一个新的版本:•“复制”一个开发版本到一个编号版本•发布的版本都是只读的(包括配置)•每个函数都是简单的整数计数exports.handler=function(event,context){context.succeed(“bye”);}exports.handler=function(event,context){context.succeed(“hi”);}12Versions版本:调用Lambda函数•开发版本:FunctionName(或)FunctionName:$LATEST•特定版本:FunctionName:1FunctionName:2•命名版本:FunctionName:productionFunctionName:v1_2_3_4版本:别名•可以为任何一个版本命名别名:•可以在代码中使用ARN映射•可以不用修改客户端代码exports.handler=function(event,context){context.succeed(“bye”);}exports.handler=function(event,context){context.succeed(“hi”);}proddevAliasesAmazonAPIGateway:API版本•/prod/my_url_endpoint•MyFunction:prod_relAPI和Lambda代码的版本•MyFunction:prod_rel•Function:3•{yourcode}AWSLambda:代码版本我们已经忙了很久。现在该你了。我们已经忙了很久。现在该你了。进入AWSLambda控制台,创建一个函数,运行它。(成为在中国的前100万个请求)进入AWSLambda控制台,创建一个函数,运行它。(成为在中国的前100万个请求)恭喜,你已经成为一个Lambda函数专家了!添加一个事件源或者一个HTTP端点。恭喜,你已经成为一个Lambda函数专家了!添加一个事件源或者一个HTTP端点。创建世界上最简单的移动应用后端。(提示:从内置的CRUD例子开始!)创建世界上最简单的移动应用后端。(提示:从内置的CRUD例子开始!)变成AWSLambda粉丝!aws.amazon.com/blogs/computeaws.amazon.com/lambdaAWSLambda论坛变成AWSLambda粉丝!aws.amazon.com/blogs/computeaws.amazon.com/lambdaAWSLambda论坛