本教程將演示我偏愛的數據庫驅動型Web應用部署工作流程。它面向希望在個人項目中實現全棧開發,而無需設置和維護複雜的多服務基礎設施的開發者。 我們將部署一個用Node.js和Express編寫的非常基本的Web應用。它允許訪問者編寫和保存筆記,以及閱讀以前編寫的筆記。數據存儲在MongoDB數據庫中。我們將使用GitHub Actions創建一個CIhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712CD工作流程,將我們的應用部署到AWS Lambda上。 重點在於簡潔性、實用性和成本節約。由於AWS和MongoDB擁有非常慷慨的免費套餐,您可以免費學習。但是,請記住,如果您不想最終支付幾美分,請之後取消部署應用程序。由於您的應用程序將公開可用,因此從長遠來看,其使用量理論上可能會超過免費套餐。但是,如果您打算將此應用程序擴展用於您自己的目的,我可以推薦此設置,因為它對於流量適中的網站來說非常經濟實惠。 您可以在我們的GitHub帳戶上找到本教程的所有代碼。 構建應用程序需要一些東西。確保您的系統上已安裝Node和Docker。要安裝Node,您可以使用Node版本管理器(nvm)(請參閱此處的一些說明)。對於Docker,請為您的操作系統安裝最新版本的Docker Desktop。 請注意,我們將使用Docker在我們的機器上運行MongoDB實例。或者,您也可以手動安裝MongoDB社區版。您可以在此處找到一些說明。 您還需要在GitHub、MongoDB和Amazon Web Services (AWS)上擁有帳戶。在AWS上註冊時,您必須輸入信用卡號碼。如上所述,按照本教程中的步驟不會超過免費套餐。 一些關於Node和Express的預備知識可能會有所幫助。 好的,讓我們開始吧。我們首先需要一個帶有新package.json文件的空文件夾。如果執行npm init,您可以創建一個。 我們需要安裝以下依賴項: 運行以下命令來安裝它們:關鍵要點
先決條件
本地開發
<code class="language-bash">npm install --save express mongoose aws-serverless-express && npm install --save-dev concurrently<https:><https:>
<h3>1. MongoDB和mongoose<https:>
<p>由於我們使用MongoDB數據庫來存儲我們的數據,因此在本地機器上運行數據庫實例對開發很有幫助。這就是我們使用最新<em>mongo<https:> Docker鏡像的地方。如果您的機器上安裝了Docker,只需在終端中鍵入docker run mongo即可。該鏡像將從dockerhub提取並在新容器中啟動。如果您不熟悉Docker,沒關係。您只需要知道您的計算機上正在運行一個MongoDB實例,您可以與之通信。 <https:>
<p>為了讓我們的應用程序與數據庫通信,我們需要初始化一個連接。我們在一個名為mongoose.js的新文件中執行此操作。mongoose是幫助我們進行瑪格d:<angy>
<https:><pre class="brush:php;toolbar:false">https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712 mongoose.js
const mongoose = require(“ mongoose”);
const uri = process.env.mongodb_url;
讓連接;
const connect = async()=&gt; {
嘗試 {
連接=等待mongoose.createconnection(uri,{
Usenewurlparser:是的,
usefindandModify:false,
UseunifiedTopology:是的,
BufferCommands:false,https://www.php.cn/link/29A9F8C8460E5E2BE4EDDE57FD83712HTTPS://wwwww.php.cn/www.php.cn/29a9a9a9f8c8460e771nong nong ablefermose mbulder
buffermaxentries:0,https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.p.cn/link/29a9a9f8c8460e555555555555555555555555555555555555555555555555555。
});
返回連接;
}捕獲(e){
Console.Error(“無法連接到Mongodb ...”);
扔e;
}
};
函數getConnection(){
返回連接;
}
Module.exports = {Connect,getConnection};<code class="language-javascript"><https:>>
<https:>此文件導出一個包含兩個函數的對象。 connect()創建一個到我們環境變量中指定位置的mongodb的連接。該連接存儲在一個名為連接的變量中。 GetConnection()只是返回連接變量。您可能想知道為什麼我們不直接返回連接變量本身。這是因為node.js在第一次加載後會緩存所需的模塊。因此連接變量。 <p>
<https:>現在我們的應用程序能夠連接到數據庫>,我們也希望在其中存儲數據> - 更具體地說,是我們可以在用戶界面中編寫的筆記。因此,我們將為我們的筆記創建一個數據模型,我們將為我們的筆記創建一個數據模型。這在型號文件夾內名為註釋
<p> <https:> https://www.php.cn/link/link/29a9f8c8460e5e2be4edde557fd83712https://wwwww.php.cn/29a9a9f8c8460e5e555.2beppps:<pre class="brush:php;toolbar:false"> CN/Link/29A9F8C8460E5E2BE4EDDE557FD83712NOTES.JS
const mongoose = require(“ mongoose”);
const {getConnection} = require(“ ..https://www.php.cn/link/link/29a9f8c8460e5e5e2be4edde557fd83712mongoose”);
const conn = getConnection();
const schema = mongoose.schema;
Module.exports = Conn.Model(
“筆記”,
新模式({text:{type:string,必需:true}})
);<code class="language-javascript"><https:>
<https:>在這裡>,我們從angoose.js模塊中提取當前連接,並在其上註冊一個名為。使用此模型,我們可以構造存儲在數據庫中的文檔。 <https:>
<h3>2. Express應用程序<https:>
<p>接下來,我們創建一個簡單的Express應用程序。在項目根目錄中創建一個名為app.js的文件。它具有以下內容:<https:>
<pre class="brush:php;toolbar:false"><code class="language-javascript">https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712 app.js
const express = require(“ express”);
const app = express();
app.use(express.urlencoded({extended:false}));
app.get(“ https://www.php.cn/link/29a9f8c8460e5e2be4edde57fd83712”,async(req,res)=&gt; {{
嘗試 {
const Note = require(".https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712modelshttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712Note");
const註釋=等待note.find({});
返回res.status(200)。
`
<style>
html {
文字平衡:中心;
背景色:#93C5FD;
字體家庭:“ Segoe UI”,Tahoma,Geneva,Verdana,Sans-Serif;
顏色:白色;
字體大小:2REM;
}
textarea {
調整大小:無;
邊界:2PX實心#9CA3AF;
邊界拉迪烏斯:4PX;
背景色:#f3f4f6;
填充:0.5REM;
寬度:90%;
}
按鈕 {
左填充:2REM;
夾右:2REM;
填充:7px;
填充底:7px;
背景色:#f3f4f6;
邊界:2PX實心#9CA3AF;
顏色:#4B5563;
邊界拉迪烏斯:4PX;
}
p {
邊界底:2px固體;
填充:1REM;
文本平衡:左;
}
<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712style>
<form method="POST">
<textarea name="text"><https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712textarea> <br>
<button type="submit">>保存<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712button>
<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712form>
<h1>我的筆記<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h1>
美元
`
);
}捕獲(e){
返回res.send(e);
}
});
app.post(“ https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712”,async(req,res)=&gt; {{
嘗試 {
const Note = require(".https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712modelshttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712Note");
const註釋= new Note(req.body);
等待註釋。 Save();
return res.send(“ note保存。
}捕獲(e){
返回res.send(e);
}
});
module.exports = app;<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712code><https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712pre>
<p>如我所說,該應用程序非常簡陋,僅用作演示。首先,我們啟動一個Express應用程序。然後,我們告訴它為我們解析傳入的請求正文,使用內置的urlencoded中間件,以便能夠使用提交的表單數據。該應用程序對應用程序根目錄上的請求有兩個方法處理程序:<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<ul>
<li>
<p>app.get("https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712", ...)處理HTTP GET請求。當我們的用戶加載頁面時,它會被調用。我們想要向他們展示一個簡單的頁面,他們可以在其中鍵入筆記並保存它。此外,我們還希望顯示以前編寫的筆記。在請求處理程序的回調函數中,我們需要我們的Note模型。該模型必須在我們的POST請求處理程序的回調函數內被需要,因為它需要一個當前的數據庫連接——當app.js文件第一次加載時,該連接可能不存在。然後,我們應用find方法來接收數據庫中的所有筆記。此方法返回一個promise。因此,我們等待它解析。最後但並非最不重要的是,我們使用響應對象(res)的send方法將字符串發送回客戶端。該字符串包含瀏覽器呈現為實際HTML元素的HTML語法。對於我們數據庫中的每個筆記,我們只需添加一個包含其文本的段落元素。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>這是您可以將這個非常簡陋的示例轉換為漂亮的用戶界面的地方。您可以自由選擇發送給客戶端的內容。例如,這可能是完全捆綁的客戶端React應用程序。您也可以選擇服務器端呈現的方法——例如,通過使用像Handlebars這樣的Express視圖引擎。根據它是什麼,您可能需要向您的應用程序添加更多路由並提供靜態文件,如JS包。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712li>
<li>
<p>app.post("https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712", ...)處理HTTP POST請求。當用戶保存他們的筆記時,它會被調用。同樣,我們首先需要我們的Note模型。請求有效負載可以通過請求對象(req)的body屬性訪問。它包含用戶提交的文本。我們用它來創建一個新文檔並使用Mongoose提供的save方法保存它。同樣,我們等待此異步操作完成,然後通知用戶並給他們刷新頁面的可能性。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712li>
<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712ul>
<p>為了讓我們的應用程序真正開始監聽HTTP請求,我們必須調用Express提供的listen方法。我們將在添加到項目根目錄的單獨文件dev.js中執行此操作:<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<pre class="brush:php;toolbar:false"><code class="language-javascript">https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712 dev.js
const app = require(".https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712app");
const { connect } = require(".https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712mongoose");
connect();
const port = 4000;
app.listen(port, () => {
console.log(`app listening on port ${port}`);
});<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712code><https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712pre>
<p>在這裡,我們調用mongoose.js文件中的connect函數。這將啟動數據庫連接。最後但並非最不重要的是,我們開始監聽端口4000上的HTTP請求。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>使用兩個單獨的命令啟動mongo Docker鏡像和我們的應用程序有點麻煩。因此,我們將一些腳本添加到我們的package.json文件中:<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<pre class="brush:php;toolbar:false"><code class="language-json">"scripts": {
"start": "concurrently 'npm:mongoDB' 'npm:dev'",
"dev": "MONGODB_URL=mongodb:https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712localhost:27017 node dev.js",
"mongoDB": "docker run -p 27017:27017 mongo"
}<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712code><https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712pre>
<p>mongoDB啟動一個MongoDB實例,並將容器端口27017映射到本地機器的端口27017。 dev啟動我們的應用程序,並設置在mongoose.js文件中加載的環境變量MONGODB_URL,以便與我們的數據庫通信。 start腳本並行執行這兩個腳本。現在,我們只需要在終端中運行npm start即可啟動我們的應用程序。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>您現在可以通過在瀏覽器中訪問http:https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712localhost:4000來加載應用程序。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p><img src="https:https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712img.php.cnhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712uploadhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712articlehttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712173916284121297.jpg" alt="A Guide to Serverless Deployment with Express and MongoDB " https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712><https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h2><strong>部署<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712strong><https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h2>
<p>現在是部署我們的應用程序的時候了。我們將使用AWS上的Lambda函數、MongoDB Atlas和AWS API Gateway來實現。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h3>1. 什麼是Lambda函數?為什麼我們要使用它們? <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>Lambda函數是一種響應HTTP請求執行代碼的方式,無需維護服務器。它們僅按需運行,這意味著如果沒有人調用您的服務,您無需支付服務器時間費用。另一方面,如果許多人調用您的服務,AWS會自動擴展,並且會啟動更多Lambda實例。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>顧名思義,Lambda函數是函數,您可以用任何您想要的內容填充它們。只有一個例外:您的代碼不應該有狀態,因為Lambda實例一旦不再執行就會關閉。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>我們將整個應用程序包裝在一個Lambda函數中,並將其部署到AWS Lambda上。 AWS Lambda有一個非常慷慨的、無限的免費套餐,包括每月一百萬次免費請求和400,000 GB秒!因此,您可以安全地試驗該服務並部署多個Lambda函數,而無需為此付費。請記住,如果您不想再使用它們,請刪除這些函數。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h3>2. 創建AWS Lambda函數<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>現在,登錄到您的AWS管理控制台並導航到AWS Lambda。在<em>函數<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>部分下,單擊<em>創建函數<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>。在此之前,重要的是您已指定要部署服務的區域。在台式計算機上,您可以在管理控制台的右上角選擇一個區域。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>選擇<em>從頭開始創作<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>並為您的函數命名。我將其命名為<em>express-lambda-example<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>。在<em>運行時<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>下,選擇<em>Node.js 12x<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>,然後創建函數。您將看到一個如下所示的窗口:<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p><img src="https:https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712img.php.cnhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712uploadhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712articlehttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712173916284443353.jpg" alt="A Guide to Serverless Deployment with Express and MongoDB " https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712><https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>我們的Lambda函數已經包含了一些測試代碼。您可以忽略這一點,因為我們稍後會覆蓋它。如果您向下滾動頁面,您將看到一個名為<em>環境變量<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>的部分。記住,在我們之前的本地開發腳本中,我們定義了一個名為MONGODB_URL的變量?我們必須在這裡創建相同的變量,以便我們的Lambda實例能夠與我們的數據庫通信。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>但是,我們還沒有運行數據庫。我們不想為此目的使用我們的本地機器。這就是為什麼我們將創建一個MongoDB Atlas免費套餐集群。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h3>3. 設置MongoDB Atlas雲服務<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>要創建免費套餐集群,請在mongodb.com上創建一個帳戶。在註冊過程中,系統會要求您選擇集群類型。選擇免費的<em>共享集群<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>。下一步是為您的項目命名。此外,您可以選擇您喜歡的編程語言。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>在下一步中,您可以選擇雲提供商和區域。由於我們已經將AWS用於我們的Node.js應用程序,因此我建議您選擇它,如果可能的話,選擇您之前在AWS上選擇的相同區域。在下一節中,您可以決定要使用哪個層級。選擇<em>M0 Sandbox<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>層級。 MongoDB不建議在生產環境中使用此層級,但對於初學者來說,它將提供您需要的一切。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p><img src="https:https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712img.php.cnhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712uploadhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712articlehttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712173916284592009.jpg" alt="A Guide to Serverless Deployment with Express and MongoDB " https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712><https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>幾分鐘後,我們的集群就可以使用了。現在唯一缺少的是對它的訪問。單擊菜單中的<em>數據庫訪問<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>並創建一個新用戶。身份驗證方法是<em>密碼<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>。授予用戶讀寫權限。完成此操作後,我們需要將可以訪問我們數據庫的IP地址列入白名單。您可以在<em>網絡訪問<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>部分下執行此操作。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>不幸的是,我們不知道每個嘗試連接到我們集群的Lambda實例的IP。因此,我們將通過添加0.0.0.0https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd837120來將任何IP地址列入白名單。請注意,如果您有敏感數據並希望確保高度的數據保護,則不建議這樣做。我們的集群現在僅受我們賦予數據庫用戶的憑據保護。設置對等連接將是解決此問題的可能解決方案。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>現在,返回您的集群並單擊<em>連接<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>。在彈出的模式窗口中,單擊<em>連接您的應用程序<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>。然後,選擇Node.js版本2.2.12或更高版本並複制連接字符串。回到我們在AWS上的Lambda函數控制台中,創建一個名為MONGODB_URL的新環境變量,並將連接字符串粘貼進去。確保用數據庫用戶的憑據和數據庫的名稱替換字符串中的佔位符。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h3>4. 使您的應用程序準備好用於AWS Lambda<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>為了讓AWS Lambda能夠調用我們的應用程序,我們必須設置一個新的入口腳本,類似於我們在dev.js文件中所做的。我們將將其命名為index.js,它具有以下內容:<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<pre class="brush:php;toolbar:false"><code class="language-javascript">https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712 index.js
const awsServerlessExpress = require("aws-serverless-express");
const { connect } = require(".https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712mongoose");
let connection = null;
module.exports.handler = async (event, context) => {
context.callbackWaitsForEmptyEventLoop = false;
if (connection === null) connection = await connect();
const app = require(".https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712app");
const server = awsServerlessExpress.createServer(app);
return awsServerlessExpress.proxy(server, event, context, "PROMISE").promise;
};<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712code><https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712pre>
<p>在這裡,我們使用aws-serverless-express庫。它基本上與dev.js中的listen方法具有相同的功能。它允許我們的應用程序在Lambda環境中處理客戶端請求。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>現在,關於我們的lambda.js文件有一件重要的事情需要注意。每次調用Lambda函數時,都會執行handler函數。 handler函數之外的所有內容都在Lambda容器啟動時啟動一次,並且可能在多個Lambda調用之間持續存在。這就是我們將MongoDB連接對象存儲在文件全局範圍內的原因。每次handler函數運行時,它都會檢查是否已經啟動了連接。如果是,則函數會重用它,而不是每次都重新連接到數據庫。這非常重要,因為它節省了大量執行時間。為了使連接在多個調用中持續存在,我們需要將context.callbackWaitForEmptyEventLoop設置為false。您可以在此處閱讀有關此功能的更多信息。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h3>5. 使用GitHub Actions部署到AWS Lambda<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>下一步是使用GitHub Actions創建CIhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712CD工作流程。這意味著每次我們將代碼更改推送到GitHub存儲庫時,我們都希望觸發一個管道。該管道會自動處理更新我們在AWS上的Lambda函數。 Jakob Lind在他的文章“如何設置AWS Lambda和使用Github Actions進行自動部署”中對這個過程進行了很好的描述。我將簡要總結主要部分。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>為了讓GitHub設置並啟動工作流程,我們在路徑https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712.githubhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712workflows中創建一個名為deploy.yml的文件。yaml:<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<pre class="brush:php;toolbar:false"> <code class="language-yaml">#https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712.githubhttps:///www.php.cn/www.php.cn/link/29a9f8c8c84460eplfloffllflow sherfloffyshyflflowshyplfloffllflow sherflflow sherflflowsnypn4pperfdy555555555555 ww.php.cn/ link/29a9f8c8460e5e2be4edde557fd83712deploy.yml
名稱:部署到lambda
在:
推:
分支:
- 主要的
工作:
部署:
名稱:部署
戰略:
矩陣:
節點交換:[12.x]
運行:ubuntu-latest
步驟:
- 用途:Actionhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712checkout@v1
- 名稱:設置nodejs
用法:ActionHttps://www.php.cn/link/29A9F8C8C8460E5E2BE4EDDE57FD83712SETUP-NODEUP-NODE@V1
和:
node-version:$ {{matrix.node-version}}
- 名稱:NPM安裝
運行:NPM CI-生產
- 名稱:zip
用途:montudorhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712Action-zip@v0.1.1
和:
args: zip -qq -r .https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712app.zip .https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712
- 名稱:推到Lambda
用途:AppleBoyhttps://www.php.cn/link/29A9F8C8C8460E5E2BE4EDDE57FD83712LAMBDA-ACTACH@MASTER@Master
和:
AWS_ACCESS_KEY_ID:$ {{necrets.aws_access_key}}
AWS_SECRET_ACCESS_KEY:$ {{secrets.aws_secret_key}}
AWS_REGION:歐盟central-1#請替換為您的aws區域
function_name:express-lambda-example
zip_file:app.zip <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712code><https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712pre>
<p> github動作在每次推送到存儲庫的主分支時執行一個名為部署的作業。對我來說,將其僅限於主分支非常有用。因此,您可以安全地推送到您的開發分支,而不會將不需要的代碼部署。 >
<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>>部署作業只是安裝所有必要的庫,將整個項目壓縮,並將其推送到aws lambda。請注意,yaml文件需要通過環境變量訪問aws訪問密鑰:aws_access_keyy和aws_secret_keykey。您可以通過在的身份和訪問管理控制台中創建新用戶來生成這些密鑰。獲得密鑰後,您需要將它們另存為github項目設置下的環境變量,位於> secrets<p><<em>
<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>要使您的應用程序在要使您的應用程序在
<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>6。 AWS API網關使我們的應用程序可訪問<p>
<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>現在我們的應用程序已準備好用於實時環境。但是,我們沒有通過web訪問它的方法。這就是我們接下來使用aws api網關請注意,API Gateway也有一個免費套餐。但是,此套餐僅限於12個月。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>在您的AWS控制台中,導航到API Gateway服務並單擊<em>創建API<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>,選擇<em>REST API<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>,為其命名並保存。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>要將API Gateway連接到我們的Lambda函數,我們創建一個新的方法,將任何HTTP請求轉發到我們的Lambda函數。因此,在<em>操作<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>下拉菜單中,選擇<em>創建方法<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>並選擇<em>ANY<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>。您應該會看到一個如下圖所示的屏幕。確保選中<em>使用Lambda代理集成<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>複選框。輸入Lambda函數的名稱並保存。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p><img src="https:https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712img.php.cnhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712uploadhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712articlehttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712173916284649066.jpg" alt="A Guide to Serverless Deployment with Express and MongoDB " https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712><https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>接下來,我們必須設置Lambda代理集成。這基本上意味著所有客戶端請求都應按原樣重定向到我們的Lambda函數。因此,我們在<em>操作<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>下拉菜單中創建一個新的資源。在彈出的模式窗口中,選中<em>配置為代理資源<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>複選框(見下文)並保存。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p><img src="https:https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712img.php.cnhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712uploadhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712articlehttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712173916284977045.jpg" alt="A Guide to Serverless Deployment with Express and MongoDB " https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712><https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>這將創建另一個我們必須與Lambda函數連接的方法。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>最後但並非最不重要的是,我們通過在<em>操作<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>下拉菜單中選擇<em>部署API<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>來部署我們的API。在彈出的窗口中,選擇<em>[新階段]<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>,為階段命名並部署它。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>就是這樣。您可以通過單擊在已創建階段的<em>階段編輯器<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>中找到的<em>調用URL<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>來訪問我們的應用程序。 <em>調用URL<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>是映射到我們的API Gateway的公共URL。當然,您也可以使用自定義域來執行此操作。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h2><strong>結論<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712strong><https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h2>
<p>您會看到,部署需要數據庫的更複雜的應用程序並不一定很困難。當然,我向您展示的工作流程遠非完美,並且缺乏大型應用程序從長遠來看所需的許多功能。但對我來說,它已被證明對於流量低和適中的網站來說是簡單、實用且經濟的。我使用了非常相似的技術棧來構建和部署JSchallenger。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>如果您有任何想法或評論,請通過Twitter聯繫:@kueckelheim。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h2><strong>關於使用Express和MongoDB進行無服務器部署的常見問題解答(FAQ)<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712strong><https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h2>
<h3>使用Express和MongoDB進行無服務器部署有哪些好處? <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>使用Express和MongoDB進行無服務器部署具有多種優勢。首先,它允許開發人員專注於編寫代碼,而無需擔心服務器管理。這是因為無服務器架構會自動為您管理服務器。其次,它具有成本效益,因為您只需支付您消耗的計算時間。當您的代碼未運行時,不會收取任何費用。第三,無服務器部署會根據您的工作負載大小自動擴展。這意味著您的應用程序可以隨著需求的增加而處理更多請求,而無需任何手動干預。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h3>如何調試我的無服務器應用程序? <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>由於其分佈式性質,調試無服務器應用程序可能有點棘手。但是,您可以使用多種方法來調試您的應用程序。最常用的方法之一是使用日誌記錄。您可以記錄有關應用程序執行的重要信息,然後分析這些日誌以查找任何問題。另一種方法是使用分佈式跟踪工具,如AWS X-Ray。這些工具提供有關應用程序性能和瓶頸發生位置的見解。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h3>我可以在無服務器應用程序中使用Express中間件嗎? <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>是的,您可以在無服務器應用程序中使用Express中間件。 Express中間件函數是可以訪問請求對象(req)、響應對象(res)和應用程序請求-響應週期中的下一個中間件函數的函數。這些函數可以執行任何代碼,更改請求和響應對象,結束請求-響應週期,並調用下一個中間件函數。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h3>如何保護我的無服務器應用程序? <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>保護無服務器應用程序涉及多個步驟。首先,您應該遵循最小權限原則。這意味著您應該只向您的函數授予必要的權限。其次,您應該在靜態和傳輸過程中加密敏感數據。第三,您應該定期更新您的依賴項,以避免任何已知的漏洞。最後,您應該監控您的應用程序是否有任何異常活動。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h3>如何在本地測試我的無服務器應用程序? <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>可以使用Serverless Offline等工具在本地測試無服務器應用程序。此工具在您的本地機器上模擬AWS Lambda和API Gateway,允許您測試無服務器應用程序,而無需部署它。您還可以使用Jest等單元測試框架來測試您的單個函數。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h3>如何監控我的無服務器應用程序? <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>可以使用各種工具來監控無服務器應用程序。 AWS提供了一些監控工具,如CloudWatch和X-Ray。CloudWatch為您提供數據和可操作的見解,以監控您的應用程序,了解並響應系統範圍的性能變化,優化資源利用率,並獲得操作狀況的統一視圖。 X-Ray幫助開發人員分析和調試生產分佈式應用程序,例如使用微服務架構構建的應用程序。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h3>如何處理無服務器應用程序中的錯誤? <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>可以在代碼中使用try-catch塊來處理無服務器應用程序中的錯誤。您還可以使用中間件函數來處理錯誤。此外,AWS Lambda會自動重試兩次失敗的Lambda函數,您可以配置其他重試。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h3>如何優化無服務器應用程序的性能? <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>優化無服務器應用程序的性能涉及多個步驟。首先,您應該為您的函數選擇合適的內存大小。其次,您應該最小化部署包大小以減少冷啟動時間。第三,您應該使用連接池來重用數據庫連接。最後,您應該使用緩存來減少數據庫調用的次數。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h3>我可以將MongoDB Atlas與無服務器應用程序一起使用嗎? <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>是的,您可以將MongoDB Atlas與無服務器應用程序一起使用。 MongoDB Atlas是由構建MongoDB的同一人開發的完全託管的雲數據庫。它提供了一種簡單的方法來在您選擇的雲上部署、操作和擴展MongoDB。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h3>如何將我現有的Express應用程序遷移到無服務器架構? <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>將現有的Express應用程序遷移到無服務器架構涉及多個步驟。首先,您應該將您的應用程序重構為更小、無狀態的函數。其次,您應該替換任何與無服務器架構不兼容的中間件。最後,您應該徹底測試您的應用程序,以確保它在無服務器環境中正常工作。 <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p></style></code>
以上是Express和MongoDB無服務器部署指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!