內容簡介
本書以實例為驅動,教會讀者如何使用事件驅動的方法來開發後端應用程序。從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 函數,更能掌握如何設計、構建和運維一套現代化、高效率的無服務器解決方案。