閱讀目錄
一:學習使用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 查看即可: