serverless 項目配置及創建helloworld應用(二)


閱讀目錄

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM