閱讀目錄
一:學習使用AWS Lambda來作為伺服器引擎
在開發應用中,我們一般採用 AWS Lambda 來作為 Serverless服務背後的計算引擎。AWS Lambda 是一種函式即服務的計算服務,簡單的來說就是開發人員可以直接編寫執行在雲上的函式,功能及服務,由雲伺服器供應商提供作業系統、執行環境、閘道器等一系列的基礎環境。我們只需要編寫我們的業務程式碼即可。
我們不需要考慮可擴充套件、部署等一系列的問題,Amazon運維工程師已經幫助我們打造了一系列的基礎設施。並且它是按流量收錢的。
1. AWS Lambda 是如何收費的?
我們知道AWS Lambda 是按流量來收費的,如果沒有使用流量是不需要錢的,那麼它是怎麼樣來收費的呢?如果想對一個執行的函式收費,那肯定會考慮這幾個方面,執行時間、CPU、記憶體佔用、硬碟等幾個主要條件。那麼對於應用程式程式碼來講,一個應用佔用的硬碟空間我們可以忽略不計。
因此AWS會採用的是 執行時間 + 記憶體的計算方式來計算收費的。
記憶體(MB) 每個月的免費套餐秒數 每100ms的價格(USD) 128 3,200,000 0.000000208 192 2,133,333 0.000000313 256 1,600,000 0.000000417 ... ... ... 1024 400,000 0.000001667
如下圖所示:
具體可以看下AWS官網收費的 (https://aws.amazon.com/cn/lambda/pricing/)
在執行程式的時候,AWS 會統計出一個時間和記憶體,如下所示:
REPORT RequestId: 041138f9-bc81-11e7-aa63-0dbab83f773d Duration: 2.49 ms Billed Duration: 100 ms Memory Size: 1024 MB Max Memory Used: 20 MB
如下圖所示:
Memory Size的含義是:是我們選用的套餐型別。
Duration 的含義是:執行的時間。
Max Memory Used 的含義是:我們應用執行時佔用的記憶體。
因此我們可以根據 Max Memory Used 的數值及應用的計算量,我們可以選擇我們需要的套餐。
比如我們現在選用的是1024M的套餐,如果執行了是320次的話,那麼一共使用了320G的流量,假如上面我們的程式執行的時間是2.49ms,也會被當做100ms來計算的, 那麼假如我們的320次計算一共花了1s的時間,也就是 10 * 100ms,由於1024MB的套餐,每100ms需要 0.000001667 美元,因此我們需要支付的總費用就是 10 * 320 * 0.000001667 = 0.0053344刀,即使轉成人民幣也就是不到 4 毛錢的 0.03627392。
那麼相對來說是非常的便宜了。並且AWS Lambda 每個月也有免費的套餐的。因此在很長的一段時間內,我們的費用是很低的或不需要一分錢。
具體我們可以下AWS官網介紹(https://aws.amazon.com/cn/lambda/pricing/). 如下圖所示:
二:使用serverless環境搭建
在實踐demo之前,我們需要註冊一個AWS賬號,AWS提供了一年的免費使用。去官網註冊下(https://aws.amazon.com/cn/)如下圖所示:
注意:申請過程中,儘量不要繫結真正的信用卡了,具體原因我也不多解釋,反正我是不敢繫結真正的信用卡,具體原因看人家怎麼說(https://www.v2ex.com/amp/t/433538)。但是我們可以繫結一個 visa 虛擬的信用卡,我特意申請了中國建設銀行信用卡,然後辦理了一個虛擬信用卡。然後繫結虛擬信用卡,然後AWS會扣1美元來確認你該信用卡是否正確,最後你完成註冊,會發4位簡訊驗證碼到我們手機上,我拿到驗證碼是輸入,註冊就成功了。我們現在就可以使用AWS裡面的雲服務了。
2.1 安裝 serverless
首先我們需要安裝serverless框架,如下命令:
npm install -g serverless
如下所示:
2.2 設定AWS憑證
1. 登入AWS賬號,然後點選進入IAM,如下圖所示:
2. 點選使用者,然後新增使用者,比如叫 serverless-admin, 並且在 【選擇AWS訪問型別】裡,勾選上 程式設計訪問,如下圖所示:
3. 點選 "下一步許可權" 按鈕,選擇 【直接附加現有策略】,勾選 AdministratorAccess, 然後建立使用者。如下圖所示:
注意:AdministratorAccess 許可權,所以儘量不要洩漏你的金鑰出去。
如下我們需要新增新金鑰和金鑰值,如下所示:
我們需要輸入一個金鑰和值即可。然後繼續下一步等操作後,最後我們會出現如下的頁面,從下面我們可以看到,我們可以看到我們當前的使用者,訪問金鑰ID, 私有訪問金鑰等資訊,如下圖所示:
最後我們可以匯出證照後,我們需要儲存好證照即可。接著我們使用官方的命令,將會自動生成配置到 ~/.aws/credentials
如下命令:
serverless config credentials --provider aws --key AKIAIOSFODNN7EXAMPLE --secret wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
--key:應該就是我們剛剛生成的 "訪問金鑰 ID".
--secret: 就是我們的 “私有訪問金鑰”。
可以對應的我們如下圖所示的"訪問金鑰 ID" 和 "私有訪問金鑰":
然後我們可以在命令中使用命令後,會自動生成配置到 ~/.aws/credentials, 如下所示:
三:建立我們的第一個應用,hello world 服務
serverless create --template aws-nodejs --path hello-world
如下圖所示:
因此在我專案目錄下,會生成 hello-world 資料夾,該資料夾包含兩個檔案:handler.js 和 serverless.yml。 如下圖所示:
1. .gitignore 程式碼如下:
# package directories
node_modules
jspm_packages
# Serverless directories
.serverless
.gitignore裡面有3個忽略項,分別如下:
node_modules, 是Node.js包管理安裝後的目錄。
jspm_packages: jspm是javascript包管理器,它是基於 SystemJS這種通用模組載入器之上的包管理器。
.serverless: 它是一個serverless部署時的打包生成目錄,當我們執行 serverless deploy 時才會生成。
2. handler.js 程式碼如下:
'use strict'; module.exports.hello = async (event) => { return { statusCode: 200, body: JSON.stringify({ message: 'Go Serverless v1.0! Your function executed successfully!', input: event, }, null, 2), }; // Use this code if you don't use the http event with the LAMBDA-PROXY integration // return { message: 'Go Serverless v1.0! Your function executed successfully!', event }; };
handler.js 是通過如上命令 serverless create --template aws-nodejs --path hello-world 中的 --template aws-nodejs 引數生成出來的js檔案,如上hello函式程式碼就是返回一個json檔案。
3. serverless.yml 的內容如下:
service: hello-world
provider:
name: aws
runtime: nodejs10.x
functions:
hello:
handler: handler.hello
該檔案是serverless的描述檔案,服務名為:hello-world, 伺服器提供商為:aws, 執行環境為:nodejs10.x
functions:
hello:
這樣的,如上hello是呼叫時的名稱。如程式碼:serverless invoke -f hello -l 這樣的語法來觸發hello函式。如果我們的hello改成 helloxxx, 那麼我們呼叫的函式命令就變成:serverless invoke -f helloxxx -l
functions:
hello:
handler: handler.hello
如上程式碼:handler: 是不能亂改的。handler.hello 這個的含義:點號(.)前面的handler是檔名,也就是我們說的 handler.js,點號後面的 hello 是預設的函式名,也就是說我們的 handler.js中的 module.exports.hello 這個匯出的函式名。如果我們現在把handler.js 重新命名為 handler2.js 的話,那麼我們需要把 serverless.yml裡面的內容改成:handler: handler2.hello. 同理如果我們把handler.js中的hello函式改成其他名稱的話,那麼serverless.yml的呼叫名也要改了。
4. 部署 hello-world
使用如下命令:
serverless deploy -v
注意:-v 不是顯示版本,而是 --verbose 詳細資訊
在如上命令執行後,我們列印的日誌如下:
如上命令,當我們執行 serverless deploy 命令之後就會變成如下目錄:
|----- hello-world | |--- .serverless | | |--- cloudformation-template-create-stack.json | | |--- cloudformation-template-update-stack.json | | |--- hello-world.zip | | |--- serverless-state.json | |--- .gitignore | |--- handler.js | |--- serverless.yml
如下所示:
hello-world.zip 是專案程式碼檔案打包後的壓縮檔案。
serverless-state.json 是服務部署後的資訊,包含服務名稱,服務提供商等資訊。
5. 呼叫服務
然後我們需要通過如下命令來觸發下該函式,命令如下所示:
serverless invoke -f hello -l
執行命令後如下所示:
然後我們伺服器會返回如上結果,如上返回的結果就是我們專案下的 handler.js 中的hello函式返回的程式碼。也就意味著,我們的第一個服務已經成功上線了。
如上命令解釋:
invoke 是呼叫服務的意思。
-f 是表示 function 名的含義
-l 是表示log(日誌)的含義
如上 serverless 我們也可以寫成它的縮寫形式 sls,
-d 表示傳入的data(資料)
更多的 invoke 解釋,我們只需要使用命令: sls invoke -h 檢視即可: