内容简介
本书以实例为驱动,教会读者如何使用事件驱动的方法来开发后端应用程序。从AWSLambda的基础介绍开始,逐渐深入地讲解了从Web或移动端调用Lambda函数的常见例子和模式。本书的第二部分把这些简单的例子组合在一起,构成了一个更大的应用。后,读者将学会如何在AWS平台上构建应用程序,满足高可用性、高安全性、高性能和高扩展性的要求。
作者简介
Danilo Poccia,是 Web Services的技术专员,他是AWS Lambda工具的创建者之一,这种工具通过外部事件驱动的服务可以简化认证并整合AWS资源。
目录
赞誉
中文版序
推荐序
译者序
前言
关于原书封面插图
第一部分 快速入门
第1章 在云中运行函数2
1.1 AWS Lambda简介5
1.2 以函数作为应用程序的后端10
1.3 应对一切的单一后端11
1.4 事件驱动的应用程序13
1.5 从客户端调用函数17
总结20
第2章 属于你的第一个Lambda函数21
2.1 创建一个新的函数21
2.2 编写函数24
2.3 其他设置26
2.4 测试函数28
2.5 从Lambda API调用函数30
总结32
练习32
第3章 把函数作为Web API34
3.1 API Gateway简介34
3.2 创建API36
3.3 创建集成38
3.4 测试集成40
3.5 改变响应信息41
3.6 把资源路径作为参数46
3.7 使用API Gateway的上下文对象49
总结52
练习52
第二部分 构建事件驱动的应用程序
第4章 管理安全56
4.1 用户、组和角色57
4.2 理解策略60
4.3 实践策略63
4.4 使用策略变量68
4.5 赋予角色70
总结72
练习72
第5章 使用独立的函数74
5.1 在函数中打包库和模块74
5.2 让函数订阅事件76
5.2.1 创建后端资源77
5.2.2 把函数打包78
5.2.3 配置权限82
5.2.4 创建函数84
5.2.5 测试函数86
5.3 在函数中使用二进制库88
5.3.1 准备环境88
5.3.2 实现函数89
5.3.3 测试函数93
5.4 调度函数的执行94
总结98
练习98
第6章 用户身份管理100
6.1 Cognito身份管理服务概述100
6.2 外部身份提供方103
6.3 集成自定义身份认证104
6.4 处理认证和非认证用户105
6.5 使用 Cognito的策略变量106
总结110
练习110
第7章 从客户端调用函数113
7.1 用JavaScript调用函数113
7.1.1 创建ID池114
7.1.2 为Lambda函数开放权限117
7.1.3 创建Web页面119
7.2 从移动应用中调用函数123
7.3 从浏览器调用函数127
总结131
练习131
第8章 设计基于Lambda的认证服务134
8.1 交互模式135
8.2 事件驱动架构137
8.3 使用 Cognito服务141
8.4 保存用户配置文件142
8.5 向用户配置文件添加更多数据143
8.6 加密密码143
总结144
练习144
第9章 实现基于Lambda的认证服务146
9.1 管理集中式配置147
9.2 对初始化和部署实现自动化149
9.3 共享代码150
9.4 创建应用的首页151
9.5 注册新用户152
9.6 验证用户邮件158
总结163
练习163
第10章 为认证服务添加更多功能168
10.1 处理密码遗忘168
10.2 处理密码重置175
10.3 处理用户登录180
10.4 为认证用户获取AWS令牌184
10.5 处理密码修改186
总结192
练习192
第11章 构建一个媒体共享应用195
11.1 事件驱动架构195
11.1.1 简化实现196
11.1.2 合并函数199
11.1.3 改进事件驱动架构201
11.2 在 S3中定义对象的命名空间202
11.3 为 DynamoDB设计数据模型204
11.4 客户端应用205
11.5 响应内容更新216
11.6 更新内容索引220
总结223
练习225
第12章 为什么选择事件驱动226
12.1 事件驱动架构总览227
12.2 从前端起步228
12.3 关于后端229
12.4 响应式编程232
12.5 通向微服务之路235
12.6 平台的扩展性237
12.7 可用性和适应性238
12.8 预估费用239
总结241
练习242
第三部分 从开发环境到生产部署
第13章 改进开发和测试244
13.1 本地开发244
13.1.1 用Node.js做本地开发245
13.1.2 用Python做本地开发246
13.1.3 社区工具247
13.2 日志与调试247
13.3 使用函数版本249
13.4 使用别名来管理不同环境250
13.5 开发工具和框架251
13.5.1 Chalice Python微框架252
13.5.2 Apex无服务器架构254
13.5.3 Serverless框架256
13.6 简单的无服务器测试258
总结260
练习260
第14章 自动化部署263
14.1 在 S3上存储代码263
14.2 事件驱动的无服务器持续部署266
14.3 用AWS CloudFormation部署268
14.4 多区域部署274
总结276
练习276
第15章 自动化的基础设施管理279
15.1 对告警做出响应279
15.2 对事件做出响应282
15.3 近实时处理日志282
15.4 设定循环的活动283
15.5 跨区域的架构和数据同步284
总结287
练习287
第四部分 使用外部服务
第16章 调用外部服务290
16.1 管理密码和安全凭证290
16.2 使用IFTTT Maker通道294
16.3 向Slack团队发送消息296
16.4 自动管理GitHub代码库298
总结299
练习299
第17章 从其他服务获取事件301
17.1 谁在调用301
17.2 Webhook模式302
17.3 处理来自Slack的事件304
17.4 处理来自GitHub的事件305
17.5 处理来自Twilio的事件306
17.6 使用MongoDB作为触发器306
17.7 日志监控的模式307
总结308
练习308
前言/序言
最简单的服务器,就是没有服务器。
—Werner Vogel,亚马逊CTO1996年我开始接触客户端-服务器架构,体验过分布式系统的先进和复杂。21世纪初,我与电信和媒体的客户合作过几个大型项目,那时我切身体会到计算、存储和网络的限制会成为阻碍公司创新的瓶颈。
接着在关键性的2006年,以“按需”(utility)模式使用计算资源—就像使用能源、汽油和水那样—开始成为现实。那年AWS发布了它的首个存储服务( S3)和计算服务( EC2)。我对它们都产生了强烈的兴趣和好奇。
自2012年起,我专注于帮助客户在云端实现应用,或者把应用迁移到云端。为了更熟悉手头的新服务、新平台,我决定用 S3作为后端存储,写一个共享式文件系统。我用Python编写实现方案,放到GitHub上开源,很快就遇上了一批志同道合的用户和贡献者。
2014年AWS Lambda横空出世时,我意识到自己已经站在变革大潮的前端。数月后一个阴雨绵绵的周末,我想我可以不借助任何实体服务器,编写一个完整的应用。仅需要浏览器上的HTML、CSS和JavaScript文件这类静态内容,配合Lambda函数在后端执行我的逻辑,再加上用事件来支配商业流程,应用就完成了。我写了一个“简单的”认证服务(详见本书第8~10章),再次放到GitHub上共享。反响之热烈出乎我的意料,显然,我抓住了开发者的痛点。
经验分享之谈最后就成了本书。我希望本书能帮助你接受无服务器计算的新趋势,开发出无与伦比的新应用,检验新技术、新数据。我随时洗耳恭听你的故事,帮助同道中人实现理想将是我无上的荣光。
关于本书本书分为四部分。第一部分(第1~3章)介绍了基础技术,比如AWS Lambda和Web API。第二部分(第4~12章)是本书的核心,讲解了事件驱动应用的构建方法,让你可以用事件串联多个函数,构建新的应用。第三部分(第13~15章)主要关注从开发到生产,帮助你优化DevOps流程。第四部分(第16章和第17章)介绍了如何把Lambda函数与AWS平台以外的服务整合起来,用AWS Lambda改进沟通方式,自动完成代码管理。
本书自始至终的逻辑是递进的,建议按照顺序阅读。
如果你已经涉猎过AWS Lambda的基础内容,可以跳过第一部分,直接从第二部分开始,学习构建更为复杂的事件驱动应用。
第三部分和第四部分可以作为参考内容,帮助你实现新的想法,或者对照我所建议的做法,巩固对知识的掌握。
云计算的发展日新月异,因此我只能关注一些基本的概念,如分布式系统和事件驱动设计。在我看来,在这个分布式的世界里,这些内容对所有IT系统开发者都是至关重要的。
本书的目标读者是那些没有云技术经验,同时希望了解无服务器计算和事件驱动应用前沿技术的开发人员。如果你已经对 EC2和 VPC这类AWS服务有所了解,本书将为你开辟一个新的认知视角,帮助你用服务而非服务器的角度构建应用程序。
代码规范本书的每个专题都附带了丰富的样例。大段代码或夹在文本中的代码都会用等宽字体显示,以区别于正文。类、方法名、对象属性,以及其他代码相关的术语和内容,也都会使用等宽字体。
获取源代码本书中的一些源代码可以从以下网站获得。
致谢我要感谢许多人。这些年来,他们与我并肩工作、交换想法、分享有趣的点子,让我从中获益匪浅。我不喜欢列名单,所以这里没有他们的名单。我相信那些帮助过我的人能从中读出我的谢意。这里需要特别感谢几位仁兄:Toni Arritola,他总能厘清我偶尔混乱的思路,用简明易懂的语言说出我的想法,让本书内容条理清晰;Brent Stains,他给了我许多极有价值的提示和技术视角;Mike Stephens,是他最先提出了让我写这本书的想法。
此外还要感谢不吝宝贵时间,为本书的改进建言献策的评论者们:Alan Moffet、Ben Leibert、Cam Crews、Christopher Haupt、Dan Kacenjar、Henning Kristensen、Joan Fuster、Justin Calleja、Michael Frey、Steve Rogers、Tom Jensen、Luis Carlos Sanchez Gonzalez(技术审校)。
谨以此书献给我的妻子Paola,她陪伴我度过了撰写这本书的每一个周末,目睹了背后所有的努力。献给我的父母,他们在我年幼时就开始支持我学习计算机。献给我的兄弟,他们给予了我支持。
关于原书封面插图 about the cover illustration英文原书的封面图片名为“Femme Kamtschadale”(来自勘察加的女人)。此图取材于法国人Jacques Grasset de Saint-Sauveur(1757—1810)于1797年出版的《Costumes de Différents Pays》一书,书中的每幅插图都是人工精心绘制的。
该书向我们展示了两个世纪前世界上各个地区的文化差异。当时的人们分居地球的不同角落,操着不同的语言口音。在陋巷、在乡野,仅通过人们的衣着,就能判断他们的居所和阶级。
后来,人们的衣着改变了,不同地区的文化差异也日渐式微。现在就连不同大洲的居民都难辨彼此,更遑论不同村、不同乡、不同国的人。或许,我们把文化差异拿
《AWS Lambda实战:开发事件驱动的无服务器应用程序》 内容简介: 在云计算日益普及的今天,无服务器架构正以前所未有的速度改变着应用程序的开发和部署模式。AWS Lambda 作为无服务器计算的先驱,以其强大的弹性、按需付费的经济模型以及对事件驱动架构的天然支持,成为开发者构建现代化、高可伸缩性应用的理想选择。本书《AWS Lambda实战:开发事件驱动的无服务器应用程序》将带您深入探索 AWS Lambda 的核心概念、实际应用场景以及构建健壮、高效无服务器解决方案的最佳实践。 本书并非泛泛而谈,而是聚焦于 “实战” 二字,旨在通过丰富的示例和详尽的步骤,帮助您从零开始,逐步掌握使用 AWS Lambda 开发事件驱动应用程序的完整流程。我们将从 AWS Lambda 的基础概念入手,清晰地阐述其工作原理、触发器机制、执行模型以及与 AWS 生态系统中其他服务的集成方式。随后,我们将深入到实际的代码开发层面,讲解如何使用多种编程语言(如 Node.js、Python、Java 等)编写 Lambda 函数,并演示如何处理各种常见的事件源,包括 API Gateway、S3、DynamoDB、SQS、SNS 等。 本书内容梗概: 第一部分:无服务器与 AWS Lambda 基础 理解无服务器架构: 深入剖析无服务器的定义、核心优势(如降低运维成本、提升开发效率、自动伸缩等),以及它如何颠覆传统的应用部署模式。我们将对比无服务器与其他架构模式的异同,帮助您建立清晰的认识。 AWS Lambda 入门: 详细介绍 AWS Lambda 的核心组件,包括函数、事件源、触发器、运行时环境以及执行角色。您将了解 Lambda 函数的生命周期,包括冷启动和热启动的区别,以及如何优化函数性能。 Lambda 函数编写与部署: 学习使用不同的编程语言编写 Lambda 函数,理解其请求/响应模型,以及如何处理输入事件和生成输出。我们将演示如何使用 AWS CLI、AWS SAM (Serverless Application Model) 或 AWS CDK (Cloud Development Kit) 等工具来打包、部署和管理 Lambda 函数,涵盖从简单的“Hello, World!”到复杂的业务逻辑实现。 权限与安全性: 探讨 AWS Lambda 的权限管理,理解 IAM (Identity and Access Management) 角色在 Lambda 函数执行中的关键作用。我们将演示如何配置最小权限原则,确保 Lambda 函数只能访问其必要的 AWS 服务,从而提升应用程序的安全性。 第二部分:事件驱动的 Lambda 应用场景 API Gateway 集成: 学习如何利用 API Gateway 将 HTTP 请求路由到 Lambda 函数,构建无服务器的 RESTful API。我们将演示如何配置 API Gateway 的资源、方法、集成请求和响应,以及如何处理 CORS、请求验证和认证。 S3 事件驱动: 探索如何让 Lambda 函数响应 S3 存储桶中的对象事件,例如文件上传、删除等。我们将构建实际案例,例如自动调整图片大小、处理新上传的 CSV 文件、数据归档等,展示 S3 和 Lambda 结合的强大能力。 DynamoDB 数据处理: 学习如何使用 DynamoDB Streams 捕获数据库数据的变更,并触发 Lambda 函数进行实时处理。我们将构建场景,如数据同步、实时分析、审计日志记录等,利用 DynamoDB 和 Lambda 实现高效的数据管道。 消息队列与事件总线: 深入理解 SQS (Simple Queue Service) 和 SNS (Simple Notification Service) 在解耦应用组件中的作用,以及它们如何与 Lambda 协同工作。我们将演示如何使用 Lambda 处理 SQS 消息队列中的任务,以及如何利用 SNS 实现发布/订阅模式,将事件分发给多个 Lambda 函数或终端用户。 定时触发器 (EventBridge/CloudWatch Events): 学习如何配置定时器,让 Lambda 函数按照预设的时间间隔执行,实现计划任务自动化。我们将构建案例,如定期数据备份、报表生成、资源清理等。 其他常见事件源: 触及更多 Lambda 支持的事件源,包括 Kinesis Streams、IoT Core、Cognito 等,根据实际需求,为您拓展更多应用可能。 第三部分:高级 Lambda 开发与优化 Lambda 函数的性能优化: 探讨影响 Lambda 函数性能的关键因素,如内存配置、超时设置、代码效率、依赖管理等。我们将提供切实可行的优化策略,帮助您降低延迟,提高吞吐量。 错误处理与日志记录: 学习如何设计健壮的错误处理机制,确保 Lambda 函数在遇到异常情况时能够优雅地处理并记录错误信息。我们将演示如何利用 CloudWatch Logs 进行集中式的日志管理和分析。 Lambda 层 (Layers) 的使用: 理解 Lambda 层的概念及其优势,学习如何创建和管理共享的库和依赖项,以减少部署包的大小,提高代码的可维护性。 版本控制与别名: 学习如何有效地管理 Lambda 函数的不同版本,并使用别名进行流量路由和灰度发布,确保应用程序的平稳升级。 监控与调试: 掌握使用 AWS CloudWatch 对 Lambda 函数进行性能监控、告警设置以及进行远程调试的方法,及时发现并解决潜在问题。 测试 Lambda 函数: 介绍单元测试、集成测试以及端到端测试在 Lambda 开发中的重要性,并演示如何在本地和云端对 Lambda 函数进行有效的测试。 第四部分:无服务器应用程序架构模式 构建微服务: 学习如何使用 Lambda 构建独立的、可伸缩的微服务,以及如何通过 API Gateway 和其他 AWS 服务将它们组合成完整的应用程序。 数据处理管道: 设计和实现复杂的数据处理管道,从数据摄取、转换到存储和分析,充分发挥 Lambda 在数据处理场景下的优势。 事件驱动的工作流: 利用 AWS Step Functions 与 Lambda 结合,构建复杂、容错性强的事件驱动工作流,实现跨多个服务的业务流程自动化。 无服务器的常见模式与反模式: 总结无服务器架构设计中的最佳实践和需要避免的陷阱,帮助您构建更具弹性和可维护性的无服务器解决方案。 本书特色: 理论与实践相结合: 每一项技术点的讲解都辅以丰富的代码示例和完整的操作步骤,让您能够亲手实践,快速掌握。 聚焦实际场景: 书中案例贴近真实开发需求,覆盖了 API 开发、数据处理、自动化任务等多个热门应用场景。 循序渐进的难度: 从基础概念到高级技巧,内容设计循序渐进,适合不同阶段的开发者。 全面的 AWS 生态集成: 深入展示 Lambda 如何与 API Gateway, S3, DynamoDB, SQS, SNS, EventBridge, Step Functions 等 AWS 服务无缝集成。 强调最佳实践: 在讲解过程中,我们会不断强调安全性、性能优化、可维护性等无服务器开发中的关键原则。 无论您是希望拥抱无服务器架构的初学者,还是有一定经验但希望深入掌握 AWS Lambda 的资深开发者,本书都将是您构建下一代事件驱动应用程序的宝贵指南。阅读本书,您将不仅学会如何编写 Lambda 函数,更能掌握如何设计、构建和运维一套现代化、高效率的无服务器解决方案。