最后修改: 2個個7/01/2021
閱讀時間:
無服務器是指由云提供商管理和分配服務器和資源的應用程序。 這意味著云提供商將動態(tài)分配資源。 該應用程序在可以由事件觸發(fā)的無狀態(tài)容器中運行。 上面的一個示例以及我們將在本文中使用的示例都是關于 AWS 拉姆達。
簡而言之, 我們可以將“無服務器應用程序”確定為基于事件的基于云的系統(tǒng)的應用程序。 該應用程序依賴第三方服務, 客戶端邏輯, 和遠程呼叫(直接調用它 服務功能)。
無服務器框架是一個開放源代碼框架。 它由命令行界面或CLI和托管的儀表板組成, 為我們提供了一個完全無服務器的應用程序管理系統(tǒng)。 使用框架可確保更少的開銷和成本, 快速開發(fā)和部署, 并保護無服務器應用程序。
在繼續(xù)安裝無服務器框架之前, 您必須先設置節(jié)點JS。 在大多數(shù)操作系統(tǒng)上,該操作非常容易-您只需訪問節(jié)點JS官方網(wǎng)站即可下載并安裝。 請記住選擇高于6的版本。0。0。
安裝后, 您可以通過在控制臺中運行來確認NodeJS可用。 它應該返回您已安裝的節(jié)點版本:
您現(xiàn)在可以出發(fā)了, 因此,繼續(xù)安裝無服務器框架。
為了做到這一點, 請按照文檔設置和配置框架。 如果你比較喜歡, 您只能為一個項目安裝它, 但是在DevriX, 我們通常在全球范圍內安裝框架:
等待該過程完成,并通過運行以下命令來確保Serverless已成功安裝:
在繼續(xù)創(chuàng)建示例應用程序之前, 您應該在中創(chuàng)建一個帳戶 亞馬遜AWS。 如果您還沒有, 就像去Amazon AWS并單擊 “創(chuàng)建一個AWS賬戶” 在右上角,然后按照以下步驟創(chuàng)建帳戶。
亞馬遜要求您輸入信用卡, 因此,您必須輸入相應的信息才能繼續(xù)操作。 成功注冊和登錄后,您應該看到AWS管理控制臺:
偉大的! 現(xiàn)在開始創(chuàng)建您的應用程序。
在這一步中 我們必須使用AWS提供程序配置無服務器框架。 某些服務(例如AWS 拉姆達)在訪問憑據(jù)時需要憑據(jù),以確保您擁有該服務擁有的資源的權限。 AWS建議使用AWS Identity 和 Access M一個ager(我是)來完成此任務。
所以, 首先也是最重要的是創(chuàng)建一個 我是 用戶 在 AWS 在我們的應用程序中使用它:
在AWS控制臺上:
- 類型 IAM 在里面 “查找服務” 場地。
- 點擊 “我是”。
- 去 “用戶”。
- 點擊 “添加用戶”。
為了 “用戶名” 使用任何您想要的。 例如, 我們正在使用 無服務器管理員。 為了 ”訪問類型” 查看 “程序訪問” 然后點擊 “下一個權限”。
在那之后, 我們必須為用戶附加權限, 點擊 “直接附加現(xiàn)有政策,” 搜索 “管理員訪問權限” 然后單擊它。 繼續(xù)點擊 “下一個標簽”
標簽是可選的, 因此您可以點擊 “下次點評” 和 “創(chuàng)建用戶”。 完成并加載后, 頁面上會顯示一條成功消息,其中包含我們所需的憑據(jù)。
現(xiàn)在我們必須運行以下命令:
代替 鑰匙 和 秘密 與上面提供的一個。 您的AWS憑證已創(chuàng)建為配置文件。 您可以通過打開 ?/。AWS /憑證 文件。 它應包含AWS配置文件。 目前, 在下面的示例中, 這只是我們創(chuàng)建的一個:
到目前為止做得好! 您可以繼續(xù)使用以下方法創(chuàng)建一個示例應用程序 NodeJS 以及內置的啟動模板。
筆記: 此外, 在文章中 我們正在使用命令, 這是的縮寫。
創(chuàng)建一個空目錄并輸入。 運行命令
使用 創(chuàng)建–模板 命令指定可用模板之一, 在這種情況下, aws-nodejs, 這是一個 NodeJS “ Hello world”模板應用程序。
完成后, 您的目錄應包含以下內容, 看起來像這樣:
我們已經創(chuàng)建了新文件 處理程序。js 和 無服務器。yml。
這 處理程序。js 文件存儲您的功能, 和 無服務器。yml 存儲您稍后將更改的配置屬性。 如果您想知道 。yml 文件是 簡而言之, 它是一個 可讀數(shù)據(jù)序列化語言。 熟悉它是一件好事, 因為在插入任何配置參數(shù)時使用它。 但是,讓我們看一下我們所擁有的 無服務器。yml 立即提交:
服務:aws-sample-applic在ion
提供者:
名稱:aws
運行時:nodejs12。X
功能:
你好:
處理程序:處理程序。你好
- 服務: –我們的服務名稱。
- 提供者: –包含提供程序屬性的對象, 正如我們在這里看到的 我們的提供商是AWS, 并且我們正在使用NodeJS運行時。
- 功能: –該對象包含可部署到拉姆達的所有功能。 在這個例子中 我們只有一個命名為 你好 指向 處理程序。js 你好函數(shù)。
在繼續(xù)部署應用程序之前,您必須在這里做一件重要的事情。 早一點 我們使用配置文件為AWS設置憑證(我們將其命名為 無服務器管理員)。 現(xiàn)在您要做的就是告訴 無服務器 配置以使用該配置文件和您所在的區(qū)域。 打開 無服務器。yml 并在 提供者 在運行時下面的屬性中輸入以下內容:
概要文件:serverless-admin
地區(qū):us-east-2
到底, 我們應該有這個:
提供者:
名稱:aws
運行時:nodejs12。X
概要文件:serverless-admin
地區(qū):us-east-2
筆記: 要獲得該地區(qū), 一種簡單的方法是登錄到控制臺后查找URL:示例:
現(xiàn)在,我們有了有關生成的模板的必要信息。 讓我們檢查一下如何在本地調用該函數(shù)并將其部署到AWS Lambda。
我們可以通過在本地調用該函數(shù)立即測試該應用程序:
它調用函數(shù)(但僅在本地?。?并將輸出返回到控制臺:
現(xiàn)在, 如果一切順利, 您可以嘗試將功能部署到 AWS Lambda。
所以, 這么復雜嗎? 不, 不是! 非常感謝 無服務器框架 這只是一個單行代碼:
等待一切完成, 可能要花幾分鐘 如果一切正常,您應該以以下內容結束:
現(xiàn)在,讓我們檢查一下AWS中發(fā)生了什么。 轉到Lambda(在“查找服務“ 類型 Lambda), 你應該看到你的 Lambda 函數(shù)已創(chuàng)建。
現(xiàn)在,您可以嘗試從AWS Lambda調用您的函數(shù)。 在終端類型
它應該返回與先前(當我們在本地測試時)相同的輸出:
您可以通過在 AWS Lambda 然后轉到“監(jiān)控方式”標簽,然后點擊“在CloudWatch中查看日志。”。
您應該在那里有一個日志。
現(xiàn)在, 您的應用程序中仍然缺少一件事, 但是這是什么。。。? 出色地, 您沒有端點可以訪問您的應用, 因此,我們使用 AWS API網(wǎng)關。
你必須打開 無服務器。yml 歸檔并首先清除注釋。 您需要添加一個 大事記 在我們的職能范圍內 http 財產。 這說明了 無服務器框架 在部署應用程序時創(chuàng)建一個API網(wǎng)關并將其附加到我們的Lambda函數(shù)。 我們的配置文件應以以下結尾:
服務:aws-sample-application
提供者:
名稱:aws
運行時:nodejs12。X
概要文件:serverless-admin
地區(qū):us-east-2
功能:
你好:
處理程序:處理程序。你好
事件:
-http:
路徑:/ 你好
方法:獲取
在 http 我們指定路徑和HTTP方法。
而已, 讓我們通過運行再次部署我們的應用程序
完成后, 一個新的東西應該出現(xiàn)在輸出終端中, 這就是已經創(chuàng)建的端點:
讓我們打開端點:
您應該看到您的函數(shù)正在執(zhí)行, 返回輸出, 以及有關請求的一些信息。 讓我們檢查一下Lambda函數(shù)中發(fā)生了什么變化。
打開 AWS Lambda, 然后點擊您的功能。
我們在“設計師”我們擁有的標簽 API網(wǎng)關 附加到我們的Lambda和API端點。
偉大的! 您已經創(chuàng)建了一個超級簡單的無服務器應用程序, 將其部署到AWS Lambda, 并測試了其功能。 還, 我們使用 AWS API網(wǎng)關。
迄今為止, 我們知道我們可以在本地調用函數(shù), 但是也, 我們可以使用serverless-offline插件離線運行整個應用程序。
該插件可在本地/開發(fā)計算機上模擬AWS Lambda和API網(wǎng)關。 它啟動一個HTTP服務器,該服務器處理請求并調用您的處理程序。
要安裝插件,請在應用目錄中運行以下命令
然后在項目的 無服務器。yml 打開文件并添加 外掛程式 財產:
插件:
-無服務器離線
配置應如下所示:
服務:aws-sample-application
提供者:
名稱:aws
運行時:nodejs12。X
概要文件:serverless-admin
地區(qū):us-east-2
功能:
你好:
處理程序:處理程序。你好
事件:
-http:
路徑:/ 你好
方法:獲取
插件:
-無服務器離線
要檢查我們是否已成功安裝和配置插件運行
您應該看到以下內容:
現(xiàn)在,在您項目的根目錄中, 運行命令
如你看到的, an HTTP 服務器正在監(jiān)聽端口3000, 您可以訪問您的功能, 例如, 在這里,我們的hello函數(shù)具有http:// localhost:3000 / dev / hello。 首先,我們的回應與 API網(wǎng)關, 我們之前創(chuàng)建的。
到目前為止,您做得很好! 您使用Serverless擁有一個可以正常運行的應用程序。 讓我們擴展我們的應用程序并添加 大查詢 與其集成,以查看其工作方式以及集成方式。
大查詢是一種無服務器的軟件即服務(SaaS), 這是一種支持查詢的經濟高效且快速的數(shù)據(jù)倉庫。 在我們繼續(xù)將其與NodeJS應用集成之前, 我們必須創(chuàng)建一個帳戶, 因此,讓我們繼續(xù)。
轉到https:// cloud。谷歌。com并使用您的帳戶登錄, 如果您還沒有,請創(chuàng)建一個帳戶并繼續(xù)。
當您登錄到Google Cloud Console時, 您必須創(chuàng)建一個新項目。 點擊徽標旁邊的三個點,它將打開一個模式窗口,您可以在其中選擇“新項目。”
輸入項目的名稱。 我們將使用 big詢問-eXample。 建立專案后, 導航 大查詢 使用抽屜:
當大查詢載入時, 在左側, 您將看到該項目的數(shù)據(jù), 您可以訪問的 以及公共數(shù)據(jù)集。 在此示例中,我們使用了公共數(shù)據(jù)集。 它被命名 covid19_ecdc:
播放數(shù)據(jù)集和可用表。 預覽其中的數(shù)據(jù)。 這是一個每小時更新一次的公共數(shù)據(jù)集,其中包含有關 新冠肺炎 全球數(shù)據(jù)。
我們必須創(chuàng)建一個IAM用戶-> 服務帳戶才能訪問數(shù)據(jù)。 所以, 在菜單中 點擊 “ IAM和管理員,” 然后 “服務帳戶?!?/strong>
點擊 “創(chuàng)建服務帳戶” 按鈕, 輸入服務帳戶名稱,然后單擊 “創(chuàng)建?!?/strong> 下一個, 去 ”服務帳戶權限”, 搜索并選擇, “ 大查詢 Admin”。
點擊 ”繼續(xù),”這是最后一步, 在這里,您需要您的鑰匙, 因此,請點擊“按鍵并導出為 JSON格式。 將其安全地保存在某個地方, 我們稍后將需要它。 點擊 完畢 完成服務帳戶的創(chuàng)建。
現(xiàn)在, 我們將使用此處生成的憑據(jù)連接NodeJS BigQuery庫。
您需要安裝 BigQuery NodeJS庫可在您剛剛創(chuàng)建的項目中使用它。 在app目錄中運行以下命令:
第一的, 通過運行初始化npm
填寫所有問題,然后繼續(xù)安裝 BigQuery 圖書館:
在繼續(xù)更改函數(shù)處理程序之前, 我們必須攜帶先前創(chuàng)建的JSON文件中的私鑰。 我們將要使用 無服務器環(huán)境 變量來做到這一點。 您可以在此處獲取更多信息。
打開 無服務器。yml, 和在 提供者 屬性添加 環(huán)境 像這樣的屬性:
環(huán)境:
PROJECT_ID:${file(https:// devrix。com / tutorial / build-application-serverless-framework-aws-bigquery / 配置 / bigquery-config。json):project_id}
CLIENT_EMAIL:${file(https:// devrix。com / tutorial / build-application-serverless-framework-aws-bigquery / config / bigquery-config。json):client_email}
PRIVATE_KEY:${file(https:// devrix。com / tutorial / build-application-serverless-framework-aws-bigquery / config / bigquery-config。json):private_key}
創(chuàng)建 PROJECT_ID, PRIVATE_KEY, 和 CLIENT_EMAIL 環(huán)境變量, 它具有與我們生成的JSON文件相同的屬性(小寫)。 我們已將其放置在 config 文件夾并命名 bigquery-config。json。
現(xiàn)在, 您應該最終得到無服務器的支持。yml文件如下所示:
服務:aws-sample-application
提供者:
名稱:aws
運行時:nodejs12。x
概要文件:serverless-admin
地區(qū):us-east-2
環(huán)境:
PROJECT_ID:${file(https:// devrix。com / tutorial / build-application-serverless-framework-aws-bigquery / config / bigquery-config。json):project_id}
CLIENT_EMAIL:${file(https:// devrix。com / tutorial / build-application-serverless-framework-aws-bigquery / config / bigquery-config。json):client_email}
PRIVATE_KEY:${file(https:// devrix。com / tutorial / build-application-serverless-framework-aws-bigquery / config / bigquery-config。json):private_key}
功能:
你好:
處理程序:處理程序。hello
事件:
-http:
路徑:/ hello
方法:獲取
插件:
-無服務器離線
現(xiàn)在打開 處理程序。js 并導入BigQuery庫, 在文件的“使用嚴格”下方,添加以下行:
現(xiàn)在,我們必須告訴BigQuery庫該憑據(jù)。 以此目的, 創(chuàng)建一個實例化的新常量 BigQuery 具有憑據(jù):
const bigQueryClient = new BigQuery({
projectId:進程。環(huán)境PROJECT_ID,
credentials: {
client_email:進程。環(huán)境CLIENT_EMAIL,
private_key:進程。環(huán)境PRIVATE_KEY
}
});
下一個, 讓我們創(chuàng)建我們的BigQuery SQL查詢。 我們想檢索有關的最新信息 新冠肺炎 保加利亞的案例。 在繼續(xù)之前,我們正在使用BigQuery查詢編輯器對其進行測試, 因此,我們創(chuàng)建了一個自定義查詢:
SELECT * FROM`bigquery-public-data。covid19_ecdc。covid_19_geographic_distribution_worldwide` WHERE geo_id ='BG'ORDER BY date DESC LIMIT 1
好的! 現(xiàn)在,在我們的NodeJS應用中實現(xiàn)它。
打開 處理程序。js 并粘貼下面的代碼
const query ='SELECT * FROM`bigquery-public-data。covid19_ecdc。covid_19_geographic_distribution_worldwide` WHERE geo_id=\'BG' ORDER BY date DESC LIMIT 1';
const 選項 ={
查詢:查詢
}
const [job]=await bigQueryClient。createQueryJob(options);
const [行數(shù)]=await job。getQueryResults();
我們已經創(chuàng)建了 query 和 options 常數(shù)。 然后,我們將查詢作為作業(yè)運行,并從中檢索結果。
我們還更改返回處理程序,以返回查詢生成的行:
return {
statusCode:200,
正文:JSON。串化(
{
行數(shù)
},
空值,
2
),
};
讓我們看看完整的 處理程序。js:
“使用嚴格”;
const {BigQuery}=require('@google-cloud/bigquery');
const bigQueryClient = new BigQuery({
projectId:進程。環(huán)境PROJECT_ID,
credentials: {
client_email:進程。環(huán)境CLIENT_EMAIL,
private_key:進程。環(huán)境PRIVATE_KEY
}
});
模塊。出口。你好=異步事件=> {
const query ='SELECT * FROM`bigquery-public-data。covid19_ecdc。covid_19_geographic_distribution_worldwide` WHERE geo_id=\'BG' ORDER BY date DESC LIMIT 1';
const options ={
查詢:查詢
}
const [job]=await bigQueryClient.createQueryJob(options);
const [rows]=await job.getQueryResults();
return {
statusCode:200,
正文:JSON。串化(
{
rows
},
空值,
2
),
};
};
好的! 讓我們在本地測試我們的功能:
我們應該看到輸出:
繼續(xù)部署應用程序以通過HTTP端點對其進行測試,因此運行
等待它完成并打開端點。 結果如下:
做得好! 現(xiàn)在,我們有了一個應用程序,可以從BigQuery檢索數(shù)據(jù)并返回響應! 最后,讓我們檢查一下它是否可以離線運行。 跑
并加載本地端點:
做得好。 我們幾乎快要結束了。 最后一步是稍微更改應用程序和行為。 代替 AWS API網(wǎng)關, 我們要使用 應用程序負載均衡器. 讓我們在下一章中了解如何實現(xiàn)這一目標。
我們使用 AWS API網(wǎng)關。 在這一章當中, 我們將介紹如何用替換API網(wǎng)關 應用程序負載平衡器(阿爾巴)。
第一的, 讓我們來看看與API網(wǎng)關相比,應用程序負載平衡器的工作原理:
在應用程序負載均衡器中, 我們會映射特定的路徑(例如G。,/你好/)到目標組–一組資源, 就我們而言 這 Lambda 功能。
目標組只能具有一個與其關聯(lián)的Lambda函數(shù)。 每當目標群體需要回應時, 應用程序負載平衡器向Lambda發(fā)送請求, 并且該功能必須使用響應對象進行響應。 像API網(wǎng)關一樣, 這 ALB 處理所有HTTP請求。
ALB和 API網(wǎng)關. 主要區(qū)別在于API網(wǎng)關僅支持HTTPS(SSL), 而ALB同時支持HTTP和HTTPS。
但, 讓我們來看看API網(wǎng)關的優(yōu)缺點:
API網(wǎng)關:
優(yōu)點:
- 出色的安全性。
- 實施起來很簡單。
- 部署迅速,一分鐘內即可完成。
- 可擴展性和可用性。
缺點:
- 面對高流量時,它可能會變得非常昂貴。
- 需要更多的編排, 這給開發(fā)人員增加了一定的難度。
- 性能下降 由于API場景, 可能會影響應用程序的速度和可靠性。
讓我們繼續(xù)創(chuàng)建ALB并切換到它,而不是使用API網(wǎng)關:
應用程序負載平衡器允許開發(fā)人員配置和路由傳入的流量。 這是“彈性負載平衡?!?/strong> 它是客戶的單一聯(lián)系點, 將傳入的應用程序流量分布在多個目標上, 例如多個區(qū)域中的EC2實例。
讓我們通過Amazon AWS中的UI創(chuàng)建應用程序負載平衡器(ALB)。 登錄到“ AWS控制臺”中的“查找服務。“ 類型 ”EC2”,然后找到“負載均衡器。”
點擊 ”創(chuàng)建負載均衡器,“ 在下面 ”應用程序負載均衡器,“ 選擇 ”創(chuàng)建.”。 為了一個名字, 輸入您的選擇, 我們使用了“樣本相冊“選擇方案”面向互聯(lián)網(wǎng),” IP地址類型 ipv4。
在 ”聽眾”, 保留原樣– HTTP和端口80。 可以為HTTPS進行配置, 盡管您必須先擁有一個域并進行確認,然后才能使用HTTPS。
可用區(qū)–適用 VPC 從下拉列表中選擇一個,然后將所有標記為“可用區(qū)”:
點擊 ”下一步配置安全設置”,提示您改善負載均衡器的安全性。 點擊下一步。
在 ”第三步配置安全組“, at 分配安全組 選擇“創(chuàng)建新的安全組?!苯酉聛恚c擊“下一步:配置路由。”。 在第4步中,如上面的屏幕截圖所示配置它:
點擊 下一個, 下一個, 和 創(chuàng)建.
回到負載均衡器并復制ARN,如屏幕截圖所示:
現(xiàn)在,我們必須更改無服務器。yml并刪除API Gateway http屬性。 在事件屬性下, 刪除http屬性并添加alb屬性。 函數(shù)對象應如下所示結束:
你好:
處理程序:處理程序。hello
事件:
-白:
listenerArn:arn:aws:elasticloadbalancing:us-east-2:115129174008:listener / app / sample-alb / ae6e398a898c48e6 / 67ce6bf319d0513d
優(yōu)先級:1
情況:
路徑:/ hello
保存文件并運行用于部署應用程序的命令
成功部署后,返回到AWS Load Balancers并找到您的DNS名稱,如屏幕截圖所示:
復制DNS名稱并輸入路徑 /你好.
它應該可以工作,并最終為您提供下載內容的選項:)。 迄今為止, 應用程序負載平衡器運行良好, 但是應用程序需要為我們的最終用戶返回正確的響應。 去做這個, 打開 處理程序。js 并將return語句替換為以下語句:
return {
statusCode:200,
狀態(tài)描述:“ 200 OK”,
headers: {
“ Content-Type”:“ application / json”
},
isBase64Encoded:否,
正文:JSON。串化(行)
}
ALB的區(qū)別在于響應必須包含容器statusDescription, 標頭 和isBase64Encoded。 請保存文件, 并再次部署, 但是這次不是整個應用程序, 但反而, 只有我們已更改的功能。 運行以下命令:
這條路, 我們只定義功能 hello 部署。 成功部署后, 再次訪問帶有路徑的DNS名稱, 您應該有適當?shù)幕貞?/p>
偉大的! 現(xiàn)在,我們已用Application Load Balancer替換了API網(wǎng)關。 應用程序負載平衡器比API網(wǎng)關便宜, 現(xiàn)在我們可以擴展我們的應用程序以滿足我們的需求, 特別是如果我們希望流量會更高。
我們使用 無服務器框架, AWS, and BigQuery, 并涵蓋了其主要用法。 無服務器是未來, 而且使用它來處理應用程序也毫不費力。 繼續(xù)學習并深入研究無服務器框架,以探索其所有功能和秘密。 這也是一個非常簡單易用的工具。
根據(jù)您的技術規(guī)范構建定制的解決方案。 提交您的提案或請求一個完整的發(fā)現(xiàn)會話,以確定您的要求并評估您的業(yè)務需求。
瀏覽更多:詢問您的代理商發(fā)展教程
后端開發(fā)人員
你好! 我是Dimitar Dimitrov,并且是DevriX后端開發(fā)團隊的成員。 我在銷售和產品管理方面有經驗, 但是成為開發(fā)人員一直是我兒時的夢想。 所以, 在DevriX,我的夢想成真了! 我喜歡與家人度過閑暇時光, 我也喜歡攝影 旅行和快車。 我也喜歡讀書(驚悚片, 小說), 我最喜歡的作家之一是詹姆斯·羅林斯。