雲計算

函數計算入門-HelloWorld應用開發

場景介紹

場景介紹如何使用函數計算服務開發HelloWorld應用。您可以通過控制檯或Funcraft工具實現。

背景知識

什麼是Serverless

自2006年8月9日,Google首席執行官埃裡克·施密特(Eric Schmidt)在搜索引擎大會(SESSanJose2006)首次提出“雲計算”(Cloud Computing)的概念之後,雲計算的發展可以用日新月異這個詞來形容。那麼究竟什麼才是Serverless呢?

簡單來說,Serverless可以說是一種架構,一種雲計算髮展的產物,至於具體說什麼是Serverless,可能沒有誰能給他一個明確的概念,如果非要說一個可以稍微容易理解一些的概念,那或許可以參考Martin Fowler在《Serverless Architectures》中對Serverless這樣定義:Serverless=BaaS + FaaS
在這裡插入圖片描述
Serverless架構和傳統的項目的區別

首先,我們以一個常見的Web服務為例:

在這裡插入圖片描述
在這個圖中,服務器中可能涉及路由規則、鑑權邏輯以及其他各類複雜的業務代碼。同時,開發團隊要付出很大的精力在這個服務器的運維上面,例如要時刻關注以下問題:

客戶量突然增多時是否需要擴容服務器。
服務器上的腳本和業務代碼等是否還在健康運行。
是否有黑客在不斷地對服務器發起攻擊。
當我們把這個思路切換到Serverless的邏輯之後,變成了這樣:
在這裡插入圖片描述
可以認為,當客戶端和數據庫未發生變化的前提下,服務器變化巨大。

之前需要開發團隊維護的路由模塊以及鑑權模塊都將接入服務商提供的API網關係統以及鑑權系統,開發團隊無須再維護這兩部分的業務代碼,只需要持續維護相關規則即可。
在這個結構下,業務代碼也被拆分成了函數粒度,不同函數表示不同的功能。
我們已經看不到服務器的存在,是因為Serverless的目的是讓使用者只關注自己的業務邏輯即可,所以一部分安全問題、資源調度問題(例如用戶量暴增、如何實現自動擴容等)全都交給雲廠商負責。
相對於傳統項目而言,傳統項目無論是否有用戶訪問,服務都在運行中,都是有成本支出,而Serverless而言,只有在用去發起請求時,函數才會被激活並且執行,並且會按量收費,相對來說可以在有流量的時候才有支持,沒有流量的時候就沒有支出,相對來說,成本會進一步降低。
通過以上分析和描述,不難看出Serverless架構相對於傳統的開發模式的區別,也逐漸的發現了它的優勢。但是問題來了,很多工作都交給了雲廠商來做,那我們做什麼呢?
在這裡插入圖片描述

步驟一:連接ECS服務器

阿里云云產品資源體驗地址:https://developer.aliyun.com/adc/scenario/20c4bead7e0b4758a6ab857bce793187

場景將提供一臺配置了CentOS 7.7的ECS實例(雲服務器)。通過本教程的操作

步驟二:開通函數計算服務

在使用函數計算前,需要開通函數計算服務。

說明: 本場景中提供的阿里雲子賬號無函數計算服務操作權限,請使用您自己的阿里雲賬號操作。您無需擔心扣費問題,因為函數計算服務有一定的免費額度,請參見計費方式。

1.使用您自己的阿里雲賬號登錄阿里雲控制檯,然後進入函數計算產品詳情頁。

2.單擊【免費開通】。
在這裡插入圖片描述

  1. 閱讀《函數計算服務協議》勾選同意服務協議,最後單擊 【立即開通】 。

在這裡插入圖片描述
4.單擊【管理控制檯】進入函數計算控制檯。
在這裡插入圖片描述

步驟三:在控制檯開發函數計算HelloWorld應用

1.在函數計算控制檯首頁,單擊【新建函數】。
在這裡插入圖片描述
2.選擇【HTTP函數】,然後單擊【下一步】。
在這裡插入圖片描述

3.參考以下說明填寫函數和觸發器配置,然後單擊【完成】。

  • 所在服務:例如hello_world_service。
  • 綁定日誌:填寫所在服務名稱後默認勾選綁定日誌,日誌服務會收取少量費用,您可以選擇取消勾選。
  • 函數名稱:例如hello_world。
  • 運行環境:選擇nodejs10。
  • 觸發器名稱:例如hello_world_trigger。
  • 認證方式:選擇anonymous。
  • 請求方式:選擇GET。

在這裡插入圖片描述
4.在 代碼執行管理 頁面,將index.js文件中的內容替換為如下所示:

var getRawBody = require('raw-body')
module.exports.handler = function (request, response, context) {
    getRawBody(request, function (err, data) {
        var respBody = new Buffer.from("你好,世界!");
        response.setStatusCode(200)
        response.setHeader('content-type', 'text/html')
        response.send(respBody)
    })
};

替換後如下所示:
在這裡插入圖片描述

  1. 單擊編輯器右上角【Save Invoke】保存並運行示例代碼。

在這裡插入圖片描述
可以看到函數運行成功,並返回: 你好,世界!

步驟四:使用Funcraft開發函數計算HelloWorld應用

Funcraft 是一個用於支持Serverless應用部署的工具,能幫助您便捷地管理函數計算、API 網關和日誌服務等資源。它通過一個資源配置文件(template.yml),協助您進行開發、構建和部署操作。
本步驟操作將在ECS服務器上使用Funcraft工具開發函數計算HelloWorld應用。
1.按照以下步驟創建資源。

a.  在頁面左側,單擊 雲產品資源 下拉菜單,查看本次實驗資源。
b.  單擊 免費開通 創建所需資源。

說明: 資源創建過程需要1~3分鐘。完成實驗資源的創建後,您可以在 雲產品資源 列表查看已創建的資源信息,例如:IP地址、用戶名和密碼等。

  1. 參考以下步驟連接ECS服務器。
    a. 打開終端工具。

Windows:打開命令窗口。
MAC:打開命令行終端Terminal。

Windows用戶請檢查系統中是否安裝有SSH工具。檢查方法:
在終端中輸入命令 ssh -V 。

ssh -V

如果顯示SSH版本則表示已安裝,如下圖所示。

在這裡插入圖片描述
如果未安裝,請下載安裝OpenSSH工具。
b. 在終端中輸入連接命令ssh [username]@[ipaddress]。您需要將其中的username和ipaddress替換為步驟一中創建的ECS服務器的彈性公網IP。
例如:

ssh [email protected]

在這裡插入圖片描述
命令顯示結果如下:
在這裡插入圖片描述

c.  輸入 yes。

d.  同意繼續後將會提示輸入登錄密碼。 密碼為已創建的雲服務的ECS的登錄密碼。

在這裡插入圖片描述
登錄成功後會顯示如下信息。
在這裡插入圖片描述

3.在連接到ECS服務器的終端中執行以下命令安裝NodeJS。

curl -sL https://rpm.nodesource.com/setup_10.x | bash - && yum install -y nodejs

4.執行以下命令安裝Funcraft。

npm install request @alicloud/fun -g

5.執行 fun config 命令進行本地配置。

fun config

請參考以下信息輸入您的阿里雲賬號ID、AccessKeyID和AccessKey密鑰等信息。

Aliyun Account ID:請在賬號安全設置頁面查看您的賬號ID。

在這裡插入圖片描述

Aliyun Access Key ID和Aliyun Access Key Secret:請在 安全信息管理 頁面查看您賬號的AK ID和AK Secret。
如果您使用的是阿里雲主賬號,請在安全信息管理頁面的安全提示彈框中單擊繼續使用AccessKey。

在這裡插入圖片描述

如果您使用的是阿里雲RAM子用戶,需要確保您的子用戶擁有函數計算管理權限 AliyunFCFullAccess ,請參見為RAM用戶授權。
如下圖所示為您的AccessKey ID和AccessKey Secret。如果您的賬號未使用過AccessKey,請單擊右上角創建AccessKey。

在這裡插入圖片描述

Default region name:請選擇開通的函數計算服務所在地域。

在這裡插入圖片描述
正確設置如下所示:
在這裡插入圖片描述
6.執行以下命令新建工作空間。

mkdir demo && cd demo

7.執行 fun init 命令新建一個HTTP函數觸發器。

fun init http-trigger-nodejs10

命令執行結果如下所示:
在這裡插入圖片描述
其中 index.js 文件為生成的HelloWorld函數模板,template.yml 文件中包含了HelloWorld函數和HTTP觸發器的默認配置信息。
8.參考以下步驟修改 index.js 文件內容。

a.  將 index.js 文件內容清空。
cat /dev/null > index.js
b.  使用vim打開 index.js 文件。
vim index.js
c.  按下 i 鍵進入vim的編輯模式,在文件中新增以下內容。
var getRawBody = require('raw-body')
module.exports.handler = function (request, response, context) {
    getRawBody(request, function (err, data) {
        var respBody = new Buffer.from("你好,世界!");
        response.setStatusCode(200)
        response.setHeader('content-type', 'text/html')
        response.send(respBody)
    })
};
d.  按下 esc 鍵進入命令模式,輸入 :wq 保存並退出vim。

9.執行 fun deploy -y 命令部署應用到函數計算服務。

fun deploy -y

命令執行結果如下所示:
在這裡插入圖片描述
至此,我們完成了一個HTTP觸發器的函數部署。此時,我們可以打開HTTP觸發器的默認URL,瀏覽器會以文件形式將函數響應內容下載到本地,您可以參考步驟四使用控制檯在線調試。或者您可以綁定一個自定義域名以避免該問題,請參見綁定自定義域名。

Leave a Reply

Your email address will not be published. Required fields are marked *