關鍵要點
lambda-local
之類的工具,這些工具可以在本地模擬 AWS Lambda 環境。 本文最初發表於 mongoDB。感謝您支持使 SitePoint 成為可能的合作夥伴。
近年來,開發者環境發生了巨大變化。過去,我們開發者通常會在自己的機器上運行所有工具(數據庫、Web 服務器、開發 IDE……),但 GitHub、MongoDB Atlas 和 AWS Lambda 等雲服務正在徹底改變這一局面。它們使開發者越來越容易在任何地方、任何設備上編寫和運行代碼,而無需(或只需很少)依賴項。
幾年前,如果您崩潰了機器、丟失了機器或只是斷電了,您可能需要幾天時間才能讓新機器重新運行起來,並正確設置和配置所有內容,使其恢復到之前的狀態。
借助雲端的開發者工具,您現在可以從一台筆記本電腦切換到另一台筆記本電腦,而不會造成太大的中斷。但是,這並不意味著一切都很順利。在雲端編寫和調試代碼仍然具有挑戰性;作為開發者,我們知道擁有一個本地開發環境,儘管更輕量級,但仍然非常有價值。
這正是我在這篇博文中將嘗試向您展示的內容:如何輕鬆地將AWS Lambda Node.js 函數與託管在MongoDB Atlas(MongoDB 的DBaaS(數據庫即服務))中的MongoDB 數據庫集成。更具體地說,我們將編寫一個簡單的 Lambda 函數,該函數在一個存儲在 MongoDB Atlas 數據庫中的集合中創建一個單個文檔。我將逐步指導您完成本教程,您應該在一個小時內完成它。
讓我們從必要的需求開始,讓您開始運行:
既然您了解了需求,讓我們討論一下我們將採取的具體步驟來編寫、測試和部署我們的 Lambda 函數:
我沒有深入探討在我們的MongoDB Atlas 集群和AWS Lambda 之間設置VPC 對等互連的細節,原因有兩個:1) 我們已經有關於設置VPC 對等互連的詳細文檔頁面和一篇關於Atlas 中VPC 對等互連的博文,我強烈推薦;2) M0 集群(我用來構建該演示的集群)不支持VPC 對等互連。
如果您沒有設置 VPC 對等互連,將會發生以下情況:
如果您只是嘗試獲取此演示代碼以進行編寫,這兩個警告可能沒問題,但如果您計劃部署一個可用於生產環境的Lambda-Atlas 集成,則設置VPC 對等互連是我們強烈推薦的安全最佳實踐。 M0 是我們當前的免費產品;請查看我們的 MongoDB Atlas 定價頁面以了解所有可用實例大小的完整範圍。
提醒一下,對於開發環境和低流量網站,M0、M10 和 M20 實例大小應該沒問題。但是,對於支持高流量應用程序或大型數據集的生產環境,建議使用 M30 或更大實例大小。
確保您的應用程序符合最小權限訪問策略對於保護您的數據免受惡意威脅至關重要。這就是為什麼我們將設置一個特定的數據庫用戶,該用戶將只對我們的 travel 數據庫具有讀/寫訪問權限。讓我們看看如何在 MongoDB Atlas 中實現這一點:
在“集群”頁面上,選擇“安全”選項卡,然後按“添加新用戶”按鈕
在“用戶權限”部分,選擇
然後,您可以選擇分配更細粒度的訪問控制權限:
在“選擇角色”下拉列表中,選擇 readWrite 並使用您將用於存儲文檔的數據庫的名稱填寫“數據庫”字段。我選擇將其命名為 travel。
在“密碼”部分,使用“自動生成安全密碼”按鈕(並記下生成的密碼)或設置您喜歡的密碼。然後按“添加用戶”按鈕以確認此用戶創建。
讓我們順便獲取集群連接字符串,因為我們將在 Lambda 代碼中需要它來連接到我們的 MongoDB Atlas 數據庫:
假設您已經創建了一個 MongoDB Atlas 集群,請按集群旁邊的“連接”按鈕:
複製“URI 連接字符串”值並將其安全地存儲在文本文檔中。我們稍後將在代碼中需要它,以及您剛剛設置的密碼。
此外,如果您沒有使用 VPC 對等互連,請導航到“IP 白名單”選項卡並添加 0.0.0.0/0 CIDR 塊或按“允許從任何地方訪問”按鈕。提醒一下,此設置強烈建議不要用於生產環境,並且可能會使您的 MongoDB Atlas 集群容易受到惡意攻擊。
雖然Lambda 函數支持多種語言,但我選擇使用Node.js,這要歸功於JavaScript 作為一種多功能編程語言的日益普及以及MEAN 和MERN 堆棧的巨大成功(MongoDB、Express.js、Angular /React、Node.js 的首字母縮寫詞– 查看Andrew Morgan 關於此主題的精彩開發者博客系列)。此外,說實話,我喜歡它是一種解釋型輕量級語言,不需要繁重的開發工具和編譯器。
現在該編寫一些代碼了,所以讓我們繼續使用 Node.js 作為我們 Lambda 函數的首選語言。
首先創建一個文件夾,例如 lambda-atlas-create-doc
<code>mkdir lambda-atlas-create-doc && cd lambda-atlas-create-doc</code>
接下來,從終端控制台運行以下命令,使用 package.json 文件初始化我們的項目
<code>npm init</code>
系統會提示您配置一些字段。我將它們留給您的創造力,但請注意,我選擇將入口點設置為 app.js(而不是默認的 index.js),因此您可能也希望這樣做。
我們需要使用 MongoDB Node.js 驅動程序,以便我們可以從 Lambda 函數(在 Atlas 上)連接到我們的 MongoDB 數據庫,因此讓我們繼續運行以下命令從我們的項目根目錄安裝它:
<code>npm install mongodb --save</code>
我們還希望在本地編寫和測試我們的Lambda 函數以加快開發和簡化調試,因為每次在Amazon Web Services 中實例化lambda 函數並不是特別快(並且調試實際上不存在,除非您是console .log() 函數的粉絲)。我選擇使用 lambda-local 包,因為它提供對環境變量的支持(我們稍後將使用):
<code>(sudo) npm install lambda-local -g</code>
創建一個 app.js 文件。這將是包含我們的 lambda 函數的文件:
<code>touch app.js</code>
現在您已經導入了所有必需的依賴項並創建了Lambda 代碼文件,請在您選擇的代碼編輯器(Atom、Sublime Text、Visual Studio Code……)中打開app.js 文件,並使用以下代碼段對其進行初始化:
<code>'use strict' var MongoClient = require('mongodb').MongoClient; let atlas_connection_uri; let cachedDb = null; exports.handler = (event, context, callback) => { var uri = process.env['MONGODB_ATLAS_CLUSTER_URI']; if (atlas_connection_uri != null) { processEvent(event, context, callback); } else { atlas_connection_uri = uri; console.log('the Atlas connection string is ' + atlas_connection_uri); processEvent(event, context, callback); } }; function processEvent(event, context, callback) { console.log('Calling MongoDB Atlas from AWS Lambda with event: ' + JSON.stringify(event)); }</code>
讓我們稍作停頓並註釋上面的代碼,因為您可能已經註意到一些奇怪的結構:
現在我們完成了代碼註釋,讓我們創建一個 event.json 文件(在項目根目錄中)並使用以下數據填充它:
<code>mkdir lambda-atlas-create-doc && cd lambda-atlas-create-doc</code>
(如果您想知道,該 JSON 文件就是我們將發送到 MongoDB Atlas 以創建我們的 BSON 文檔的內容)
接下來,確保您已正確設置,方法是在終端控制台中運行以下命令:
<code>npm init</code>
如果您想使用您自己的集群URI 連接字符串進行測試(我相信您會的),請不要忘記轉義E 參數中的雙引號、逗號和&字符,否則lambda-local 將拋出錯誤(您還應該將$PASSWORD 和$DATABASE 關鍵字替換為您自己的值)。
在您在本地運行它之後,您應該會看到以下控制台輸出:
如果您遇到錯誤,請檢查您的連接字符串和雙引號/逗號/&轉義(如上所述)。
現在,讓我們通過自定義 processEvent() 函數並添加 createDoc() 函數來處理函數代碼的核心內容:
<code>mkdir lambda-atlas-create-doc && cd lambda-atlas-create-doc</code>
請注意,連接到MongoDB Atlas 數據庫和插入文檔是多麼容易,以及我添加的小段代碼來將JSON 日期(格式化為符合ISO 標準的字符串)轉換為MongoDB 可以作為BSON 日期存儲的真實JavaScript日期。
您可能還注意到了我的性能優化註釋和對 context.callbackWaitsForEmptyEventLoop = false 的調用。如果您有興趣了解它們的意思(我認為您應該了解!),請參閱我後續的博文,了解如何使用 MongoDB Atlas 優化 Lambda 性能。
您現在已準備好完全在本地測試您的 Lambda 函數。使用與之前相同的 lambda-local 命令,希望您會收到一條不錯的“Kudos”成功消息:
如果在您的本地機器上一切順利,讓我們將我們的本地 Node.js 項目發佈為一個新的 Lambda 函數!
我們將要採取的第一步是壓縮我們的 Node.js 項目,因為我們不會在 Lambda 代碼編輯器中編寫 Lambda 代碼函數。相反,我們將選擇 zip 上傳方法來將我們的代碼推送到 AWS Lambda。
我在終端控制台中使用了 zip 命令行工具,但任何方法都可以(只要您將文件壓縮到頂級文件夾中,而不是頂級文件夾本身!):
<code>npm init</code>
接下來,登錄 AWS 控制台,導航到 IAM 角色頁面並創建一個角色(例如 LambdaBasicExecRole),該角色具有 AWSLambdaBasicExecutionRole 權限策略:
現在讓我們導航到 AWS Lambda 頁面。單擊“立即開始”(如果您從未創建過 Lambda 函數)或“創建 Lambda 函數”按鈕。我們不會使用任何藍圖,也不會配置任何觸發器,因此請直接在左側導航欄中選擇“配置函數”:
在“配置函數”頁面中,輸入函數的名稱(例如 MongoDB_Atlas_CreateDoc)。運行時自動設置為 Node.js 4.3,這對我們來說非常完美,因為這是我們將使用的語言。在“代碼輸入類型”列表中,選擇“上傳 .ZIP 文件”,如下面的屏幕截圖所示:
單擊“上傳”按鈕並選擇您之前創建的壓縮 Node.js 項目文件。
在“Lambda 函數處理程序和角色”部分,將“處理程序”字段值修改為app.handler(為什麼?這裡有一個提示:我為我的Lambda 函數代碼使用了app.js 文件,而不是index.js 文件……)並選擇我們剛剛創建的現有LambdaBasicExecRole 角色:
在“高級設置”部分,您可能希望將“超時”值增加到 5 或 10 秒,但這始終是您以後可以調整的內容。將 VPC 和 KMS 密鑰字段保留為其默認值(除非您要使用 VPC 和/或 KMS 密鑰),然後按“下一步”。
最後,查看您的 Lambda 函數,然後按底部的“創建函數”。恭喜,您的 Lambda 函數已上線,您應該會看到類似於以下屏幕截圖的頁面:
但是您還記得我們使用環境變量嗎?現在是配置它們並使用 AWS 密鑰管理服務來保護它們的時候了!
向下滾動到 Lambda 函數的“代碼”選項卡中,並創建一個具有以下屬性的環境變量:
名稱
值
MONGODB_ATLAS_CLUSTER_URI YOUR_ATLAS_CLUSTER_URI_VALUE 此時,您可以按頁面頂部的“保存並測試”按鈕,但為了提高安全性(建議),我們將加密該連接字符串。
選中“啟用加密助手”複選框,如果您已經創建了加密密鑰,請選擇它(否則,您可能需要創建一個 – 這很容易):
接下來,為 MONGODB_ATLAS_CLUSTER_URI 變量選擇“加密”按鈕:
回到內聯代碼編輯器中,在頂部添加以下行:
<code>mkdir lambda-atlas-create-doc && cd lambda-atlas-create-doc</code>
並將“exports.handler”方法中“else”語句的內容替換為以下代碼:
<code>npm init</code>
(希望我們最初編寫的複雜代碼現在有意義了!)
如果您想檢查我使用的整個函數代碼,請查看以下 Gist。對於 Git 粉絲,完整的 Node.js 項目源代碼也可在 GitHub 上獲得。
現在按“保存並測試”按鈕,並在“輸入測試事件”文本編輯器中粘貼我們的 event.json 文件的內容:
滾動並按下“保存並測試”按鈕。
如果您正確配置了一切,您應該會在 Lambda 日誌輸出中收到以下成功消息:
太棒了!您可以在繼續閱讀之前享受幾分鐘的成功。
我希望本 AWS Lambda-MongoDB Atlas 集成教程能為您開始第一個 Lambda 項目提供正確的步驟。您現在應該能夠在本地編寫和測試 Lambda 函數,並將敏感數據(例如您的 MongoDB Atlas 連接字符串)安全地存儲在 AWS KMS 中。
那麼接下來您可以做什麼呢?
當然,請隨時在下面的評論中提出任何問題或留下您的反饋。編碼愉快!
喜歡這篇文章嗎?重播我們的網絡研討會,其中我們對使用 AWS Lambda 的無服務器架構進行了交互式教程。
AWS Lambda 是無服務器開發中非常有益的工具。它允許開發者運行代碼而無需管理服務器。這意味著您可以專注於編寫代碼,而讓 AWS Lambda 處理基礎設施。它會根據傳入流量自動擴展您的應用程序,並且您只需為消耗的計算時間付費。這使其成為各種規模企業具有成本效益的解決方案。此外,AWS Lambda 支持多種編程語言,包括 Node.js,使其成為開發者的多功能選擇。
MongoDB Atlas 與 AWS Lambda 無縫集成。它提供了一種完全託管的數據庫服務,可以自動化耗時的管理任務,例如硬件配置、數據庫設置、修補和備份。使用 MongoDB Atlas,您可以輕鬆地根據數據庫事件(例如插入、更新或刪除)觸發 AWS Lambda 函數。這使您可以創建功能強大、實時且無服務器的應用程序。
使用 Node.js、AWS Lambda 和 MongoDB Atlas 設置無服務器應用程序涉及多個步驟。首先,您需要設置您的 AWS Lambda 函數。這包括使用 Node.js 編寫代碼並將其上傳到 AWS Lambda。接下來,您需要配置您的 MongoDB Atlas 集群。這包括創建一個新集群、配置您的 IP 白名單和創建一個數據庫用戶。最後,您需要將您的 AWS Lambda 函數連接到您的 MongoDB Atlas 集群。這包括配置您的 Lambda 函數以使用 MongoDB Atlas 連接字符串。
可以使用各種工具和技術對無服務器應用程序的問題進行故障排除。 AWS Lambda 提供函數執行的詳細日誌,這可以幫助您識別任何錯誤或問題。 MongoDB Atlas 還提供全面的監控和警報功能,使您可以跟踪數據庫的性能並接收任何潛在問題的警報。此外,使用良好的編碼實踐並徹底測試您的應用程序可以幫助防止問題出現。
安全性是任何應用程序的關鍵方面,無服務器應用程序也不例外。 AWS Lambda 提供多種安全功能,包括用於訪問控制的 AWS Identity and Access Management (IAM)、傳輸中和靜態加密以及用於網絡隔離的 VPC 支持。 MongoDB Atlas 還提供強大的安全功能,包括 IP 白名單、數據庫審核以及靜態和傳輸中加密。務必正確配置這些安全功能以保護您的應用程序和數據。
優化無服務器應用程序的性能涉及多種策略。這包括正確配置 AWS Lambda 函數以實現最佳性能、使用高效代碼以及優化 MongoDB Atlas 數據庫。 AWS Lambda 允許您為函數分配內存,這也按比例分配 CPU 能力、網絡帶寬和磁盤 I/O。 MongoDB Atlas 提供性能優化功能,例如自動索引和性能顧問建議。
是的,AWS Lambda 支持多種編程語言,包括 Node.js、Python、Java、Go 和 .NET。 MongoDB Atlas 可以與任何具有 MongoDB 驅動程序的編程語言一起使用。這使其成為無服務器開發的多功能解決方案。
無服務器架構可以顯著降低應用程序的成本。使用 AWS Lambda,您只需為消耗的計算時間付費,並且在代碼未運行時不收費。 MongoDB Atlas 提供各種定價選項,包括免費層,使您可以選擇最適合您需求的選項。
將現有應用程序遷移到無服務器架構涉及多個步驟。首先,您需要重構應用程序以使其與 AWS Lambda 和 MongoDB Atlas 兼容。這可能包括使用受支持的編程語言重寫代碼並修改數據庫模式。接下來,您需要設置 AWS Lambda 函數和 MongoDB Atlas 集群。最後,您需要徹底測試您的應用程序,以確保它在新架構中正常工作。
雖然 AWS Lambda 和 MongoDB Atlas 為無服務器開發提供了許多好處,但需要注意一些局限性。 AWS Lambda 對可使用的計算和存儲資源量有限制,並且函數具有最大執行時間。 MongoDB Atlas 還限制了數據庫的大小和連接數。但是,這些限制通常足夠高,可以容納大多數應用程序。
以上是使用Node.js,AWS Lambda和Mongodb Atlas的無服務器開發的詳細內容。更多資訊請關注PHP中文網其他相關文章!