serverless 專案配置及建立helloworld應用(二)

龍恩0707發表於2019-06-26

閱讀目錄

一:學習使用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 檢視即可:

相關文章