怎樣快速搭建serverless網(wǎng)盤服務(wù)

本篇文章為大家展示了怎樣快速搭建serverless網(wǎng)盤服務(wù),內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

成都創(chuàng)新互聯(lián)公司專注于石景山企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站建設(shè),成都做商城網(wǎng)站。石景山網(wǎng)站建設(shè)公司,為石景山等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站策劃,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)

前言

函數(shù)計(jì)算支持以無服務(wù)器架構(gòu)快速構(gòu)建企業(yè)和開發(fā)者的軟件系統(tǒng),以其全托管事件觸發(fā)模式、超彈性伸縮以及低廉的計(jì)費(fèi)方式,相對于傳統(tǒng)服務(wù)器架構(gòu),在開發(fā)效能和運(yùn)維模式上都取得了明顯優(yōu)勢。另外還提供了各種服務(wù)間的觸發(fā)功能,作為云端各種產(chǎn)品的黏合劑,適用于各種應(yīng)用場景。

將帶領(lǐng)大家利用函數(shù)計(jì)算,快速搭建一個(gè)功能完整的網(wǎng)盤服務(wù)。

網(wǎng)盤服務(wù)簡介

功能

網(wǎng)盤服務(wù)功能詳細(xì)介紹請參考文章網(wǎng)盤服務(wù)系統(tǒng)和相應(yīng)的項(xiàng)目 repo 。

本文重點(diǎn)不是介紹網(wǎng)盤功能,所以,請大家通過已經(jīng)搭建好的網(wǎng)盤 demo 自行體驗(yàn),這里不做過多贅述。

網(wǎng)盤系統(tǒng)無服務(wù)器架構(gòu)

怎樣快速搭建serverless網(wǎng)盤服務(wù)

網(wǎng)盤服務(wù)功能集較多,這里就以上傳文件功能為例,展現(xiàn)其網(wǎng)盤的實(shí)現(xiàn)架構(gòu)。

網(wǎng)盤服務(wù)自身模塊以及資源依賴

網(wǎng)盤服務(wù)的模塊實(shí)現(xiàn)分為三個(gè)部分,如下圖所示:

怎樣快速搭建serverless網(wǎng)盤服務(wù)

  • apis : 提供了網(wǎng)盤的 API 接口功能,這部分功能是 serverless 架構(gòu)實(shí)現(xiàn)的核心,使用 FC+API Gateway 架構(gòu)模式實(shí)現(xiàn)主體功能,如上圖無服務(wù)器架構(gòu)圖中展現(xiàn)的。

  • Site : 提供了網(wǎng)盤實(shí)例的管理控制臺,還有對應(yīng)的網(wǎng)盤宣傳、使用文檔以及 api 文檔等。

  • UI : 提供用戶使用和維護(hù)網(wǎng)盤的客戶端。

這里,Site 和 UI 這兩個(gè)子模塊的實(shí)現(xiàn)都是靜態(tài)網(wǎng)站模式,可以直接使用 OSS bucket 的 website 特性實(shí)現(xiàn)。為了簡化整個(gè)部署流程和自動化資源編排過程,將 Site 和 UI 的部署方式也整合到 FC 中統(tǒng)一維護(hù),見下面的詳細(xì)的部署流程描述。

網(wǎng)盤服務(wù)功能后臺依賴資源羅列如下:

怎樣快速搭建serverless網(wǎng)盤服務(wù)

fun 介紹

fun 是 have Fun with Serverless 的縮寫,是一款 Serverless 應(yīng)用開發(fā)的工具,可以幫助用戶定義函數(shù)計(jì)算、API 網(wǎng)關(guān)、日志服務(wù)等資源,旨在與阿里云 ROS 兼容(盡管到目前為止 ROS 還不支持函數(shù)計(jì)算。但是,fun 作為 ROS 的子集是我們的目標(biāo))。

使用 fun 能夠解決復(fù)雜服務(wù)的資源依賴維護(hù)問題,能夠快速部署、更新,簡化資源編排運(yùn)維。針對該網(wǎng)盤服務(wù)的眾多資源依賴,使用 fun 能夠很方便、迅速的解決各種資源的搭建和維護(hù)過程。下面我們將演示如何使用 fun 部署網(wǎng)盤服務(wù)系統(tǒng)。

具體部署過程

網(wǎng)盤服務(wù)目前實(shí)現(xiàn)了三種身份登錄驗(yàn)證功能: 釘釘、支付寶和特殊賬號密碼(用于測試)。
因?yàn)獒斸?、支付寶登錄方式需要走一些申請流程獲取對應(yīng)的 appID 和 appSecret ,這里為了簡化流程,我們僅僅使用特殊賬號密碼方式。

部署的具體步驟如下:

  1. 準(zhǔn)備工作:

    • 云賬號準(zhǔn)備

    • 代碼準(zhǔn)備

    • fun 下載和配置

  2. 配置 fun 的 template.yml

  3. 部署 template.yml 定義資源,獲取二級域名等信息

  4. 更新 apis function

  5. 部署 Site ,創(chuàng)建 groupID 實(shí)例

  6. 部署 UI,配置 storage 實(shí)例

準(zhǔn)備工作

云賬號準(zhǔn)備

首先,準(zhǔn)備一個(gè)能夠登錄阿里云官網(wǎng)的云賬號, 登錄控制臺獲取這個(gè)賬號的 UID ( accountID )、 accessKeyID 和 accessKeySecret 。部署演示使用的資源全部在華東 2 ( cn-shanghai )。也可以使用其他 region 資源,但是必須保證所有的服務(wù)都在同一個(gè) region 中。

然后開通如下服務(wù):
怎樣快速搭建serverless網(wǎng)盤服務(wù)

代碼準(zhǔn)備

函數(shù)計(jì)算支持多種代碼上傳方式,這里統(tǒng)一打包成 zip 文件,并上傳到該云賬號的某個(gè) bucket 上(用戶自行在華東 2 創(chuàng)建即可)。參考代碼如下連接:

  • apis.zip

    • 注意: apis 使用 nodejs 實(shí)現(xiàn),在打包之前需要執(zhí)行 tnpm i 命令安裝項(xiàng)目依賴。

    • 解壓后目錄結(jié)構(gòu)如下:

        |-- controllers # 控制層,主要邏輯
      
        |-- routes        # api路由
      
        |-- services     # 公共方法,包含調(diào)用各個(gè)云產(chǎn)品的方法
      
        |-- utils    
      
        |-- models
      
        |-- node_modules   # 項(xiàng)目依賴
      
        |-- index.js     # 服務(wù)入口
      
        |-- conf.js       # config 配置
      
        |-- package.json
  • site.zip

        |-- deploy.py   # 部署函數(shù)
    
        |-- site             # site代碼目錄
    
       |-- 404.html  
    
       |-- index.html    
    
       |-- docs
    
       |-- static
    • 解壓后文件結(jié)構(gòu)如下:

  • ui.zip

        |-- deploy.py   # 部署函數(shù)
    
        |-- ui                # ui代碼目錄
    
       |-- 404.html  
    
       |-- index.html    
    
       |-- static
    • 解壓后文件結(jié)構(gòu)如下:

fun 下載和配置

如果您的系統(tǒng)已經(jīng)安裝有 node 8 及以上的環(huán)境配置,那么可以直接執(zhí)行如下命令進(jìn)行 fun 的安裝

npm install @alicloud/fun -g

如果您不想安裝 node 運(yùn)行環(huán)境,那么可以直接下載 fun 的 binary 執(zhí)行,參考各種環(huán)境 fun 的 release binary 。

然后設(shè)置 accountID、accessKeyID 和 accessKeySecret 以及 region,請使用準(zhǔn)備步驟中的已經(jīng)申請的云賬號的參數(shù)進(jìn)行配置,本示例中 region 選擇 cn-shanghai :

# 如果是 binary ,執(zhí)行 ./${binary_name} configfun config

template.yml 配置

template.yml 模板配置是本部署中最重要的部分,因?yàn)榫W(wǎng)盤服務(wù)依賴的資源項(xiàng)比較多(主要是 API網(wǎng)關(guān)資源和表格存儲資源), 建議下載參考模板直接修改,需要修改的內(nèi)容已經(jīng)使用 "TODO" 標(biāo)識。

template.yml 的語法規(guī)范參考 fun 規(guī)范文檔。

這面具體介紹配置中的相關(guān)部分:

ROSTemplateFormatVersion: '2015-09-01'Transform: 'Aliyun::Serverless-2018-04-03'Resources:

  apsaradrivefc:

    Type: 'Aliyun::Serverless::Service'

    Properties:

      Description: apsara drive

      Policies:

        - AliyunOTSFullAccess

        - AliyunSTSAssumeRoleAccess

        - AliyunOTSFullAccess

        - AliyunLogFullAccess

        - AliyunFCInvocationAccess

      LogConfig:

        Project: log-yunpan # TODO replace sls project name

        Logstore: fclog

    apis:

      Type: 'Aliyun::Serverless::Function'

      Properties:

        Description: apis

        Runtime: nodejs8

        Timeout: 30

        MemorySize: 128

        Handler: index.handler

        CodeUri: oss://apsaradrive-ui/download/apis.zip # TODO replaced the code location

        EnvironmentVariables: # TODO replace all the values which has 'TODO' tag

          ENV_CONFIG: '...'

    DeploySite: # function name which deploys site

         Type: 'Aliyun::Serverless::Function'

         Properties:

            Handler: 'deploy.my_handler'

            Runtime: 'python2.7'

            Description: 'function to deploy site'

            MemorySize: 128

            Timeout: 30

            CodeUri: 'oss://apsaradrive-ui/download/site.zip' # TODO replaced by the code location

    DeployUI: # function name witch deploys ui

         Type: 'Aliyun::Serverless::Function'

         Properties:

            Handler: 'deploy.my_handler'

            Runtime: 'python2.7'

            Description: 'function to deploy ui'

            MemorySize: 128

            Timeout: 30

            CodeUri: 'oss://apsaradrive-ui/download/ui.zip' # TODO replaced by the code location

  apsaradriveapis:

    Type: 'Aliyun::Serverless::Api'

    ...


  ts-yunpan: # TODO replace ots instance name

    Type: 'Aliyun::Serverless::TableStore'

    Properties:

      ClusterType: HYBRID

      Description: for apsaradrive

     ...  log-yunpan: # TODO replace sls project name

    Type: 'Aliyun::Serverless::Log'

    Properties:

      Description: log

    fclog:

      Type: 'Aliyun::Serverless::Log::Logstore'

      Properties:

        TTL: 10

        ShardCount: 1

上面定義的 yaml 文件主要做了以下幾件事情:

  1. 創(chuàng)建一個(gè)名為 'apsaradrivefc' 的 Service , 并且為這個(gè) Service 創(chuàng)建一個(gè)具有 AliyunOTSFullAccess 、AliyunSTSAssumeRoleAccess 、 AliyunOTSFullAccess 、 AliyunLogFullAccess 和AliyunFCInvocationAccess 這幾大權(quán)限的 Service Role。然后在這個(gè) Service 下面創(chuàng)建三個(gè) Function ,分別名為 'apis', 'DeploySite' 和 'DeployUI' 。

  2. 創(chuàng)建一個(gè) LOG Project名為 'log-yunpan' , 然后在這個(gè)LOG Project 下面創(chuàng)建一個(gè)名為 'fclog' 的 Logstore ,作為 apsaradrivefc 這個(gè) Service 下 Function 執(zhí)行的日志收集 store 。

  3. 創(chuàng)建一個(gè)名為 'ts-yunpan' 的 OTS Instance , 并且在這面生成各種 Table 。

  4. 創(chuàng)建一個(gè) API 網(wǎng)關(guān)分組: apsaradriveapis ,以及其下的各種 API 定義。

需要修改的內(nèi)容:

  1. OTS Instance name: 全局有三處地方需要修改,請統(tǒng)一,因?yàn)?OTS Instance 在 region 范圍全局唯一,盡量保持命名唯一性,注意: OTS Instance 命名規(guī)范。

  2. LOG Project name: 全局有兩處地方需要修改,請統(tǒng)一,因?yàn)?LOG Project在region范圍全局唯一,盡量保持命名唯一性,注意: LOG Project 命名規(guī)范。

  3. 三處 CodeUri ,分別是 apis ,Site 和 UI 三個(gè)模塊的代碼位置,目前 template.yml 中的默認(rèn)配置可用,可以不修改。

  4. apis 這個(gè) Function 中的 EnvironmentVariables 屬性內(nèi)部需要配置 API 網(wǎng)關(guān)分組的二級域名,因?yàn)楫?dāng)前步驟還沒有生成這個(gè)參數(shù),這里先不修改。

部署 template.yml 定義資源

直接執(zhí)行如下命令:

# 在 template.yml 所在目錄執(zhí)行# 如果是 binary ,執(zhí)行 ./${binary_name} configfun deploy

這個(gè)時(shí)候,你可以在 OTS、SLS、RAM、API 網(wǎng)關(guān)和 FC 的控制臺上分別看到 fun 為網(wǎng)盤服務(wù)創(chuàng)建的各種資源,如下圖:

怎樣快速搭建serverless網(wǎng)盤服務(wù)

怎樣快速搭建serverless網(wǎng)盤服務(wù)

怎樣快速搭建serverless網(wǎng)盤服務(wù)

怎樣快速搭建serverless網(wǎng)盤服務(wù)

更新 apis function

從上一步 fun 的部署輸出日志中可以找到對應(yīng)的 API 網(wǎng)關(guān)分組的二級域名,如下:
怎樣快速搭建serverless網(wǎng)盤服務(wù)

修改 apis 這個(gè) Function 中的 EnvironmentVariables 屬性內(nèi)部需要配置 API 網(wǎng)關(guān)分組的二級域名,如下圖位置:

怎樣快速搭建serverless網(wǎng)盤服務(wù)

仍然執(zhí)行如下命令,進(jìn)行function的環(huán)境變量更新

fun deploy

至此,apis 模塊部署完畢。

部署 Site ,創(chuàng)建 groupID 實(shí)例

Site 模塊的實(shí)現(xiàn)其實(shí)就是一個(gè)靜態(tài)網(wǎng)站,我們可以利用 OSS 的靜態(tài)網(wǎng)站功能實(shí)現(xiàn),步驟如下:

  1. 修改 static/global.js 中的 endpoint ( apis 的二級域名)和 ui_endpoint (如果在華東2, 那么就是 ${uid}-ui.oss-cn-shanghai.aliyuncs.com )

  2. 創(chuàng)建 ${uid}-site 這個(gè) bucket ,并設(shè)置為 public-read ACL

  3. 設(shè)置這個(gè) bucket 的 website 的默認(rèn)首頁和 404 頁面

  4. 上傳整個(gè)代碼目錄

將所有的步驟按照函數(shù)計(jì)算編程模型封裝如下,并創(chuàng)建為 Function: DeploySite 。封裝的 Function 實(shí)現(xiàn)如下所示:

import oss2import loggingimport jsonimport shutilimport osimport sys

reload(sys)
sys.setdefaultencoding('utf8')from oss2.models import BucketWebsitedef delete_file(filePath):

    if os.path.exists(filePath):        for fileList in os.walk(filePath):            for name in fileList[2]:

                os.remove(os.path.join(fileList[0],name))

        shutil.rmtree(filePath)def my_handler(event, context):

    # event is json string, parse it

    evt = json.loads(event)

    logger = logging.getLogger()

    endpoint = 'oss-cn-shanghai-internal.aliyuncs.com'

    creds = context.credentials

    auth = oss2.StsAuth(creds.accessKeyId, creds.accessKeySecret, creds.securityToken)    # create bucket for site named ${uid}-site, and set the ACL to public read

    bucket_name = '%s-site' % (evt['uid'])

    bucket = oss2.Bucket(auth, endpoint, bucket_name)    try:

        bucket.create_bucket(permission=oss2.BUCKET_ACL_PUBLIC_READ)    except oss2.exceptions.BucketAlreadyExists:

        logger.info("Bucket %s is already exist" % bucket_name)    # set static website

    bucket.put_bucket_website(BucketWebsite('index.html', '404.html'))   # modify the config for site

    code_dir = '/tmp/site/'

    delete_file(code_dir)

    shutil.copytree('/code/site/', code_dir)

    data = u''

    with open(os.path.join(code_dir, 'static/global.js')) as f:        for line in f.readlines():            if line.startswith('var endpoint = '):

                line = u'var endpoint = \'%s\';\n' % (evt['endpoint'])            elif line.startswith('var ui_endpoint = '):

                line = u'var ui_endpoint = \'http://%s.oss-cn-shanghai.aliyuncs.com\';\n' % (bucket_name)

            data += line    with open(os.path.join(code_dir, '/tmp/site/static/global.js'), "w") as f:

        f.writelines(data)    # put all the static code to the bucket

    for root,dirs,files in os.walk(code_dir):        for filespath in files:

            full_file_name = os.path.join(root,filespath)

            bucket.put_object_from_file(full_file_name[len(code_dir):], full_file_name)

所以,只需要 Invoke 這個(gè) Function 就能夠完成 Site 模塊的部署。接下來演示一下 Invoke 的過程。

登錄函數(shù)計(jì)算控制臺,找到對應(yīng)的 Function: DeploySite ,修改觸發(fā)事件,然后點(diǎn)擊執(zhí)行:

怎樣快速搭建serverless網(wǎng)盤服務(wù)

{  "uid": "replace with you accountID",  "endpoint": "replace with the SLD"}

然后打開 Site 頁面(如果 uid 為 apsaradrive 的話,那么 Site 的 URL 為: http://apsaradrive-site.oss-cn-shanghai.aliyuncs.com ),登錄之后(使用默認(rèn)的 username: admin, password: 1234 登錄),創(chuàng)建 group 實(shí)例。

怎樣快速搭建serverless網(wǎng)盤服務(wù)

部署 UI,配置 storage 實(shí)例

部署 UI 的過程和 Site 類似,同樣在控制臺上找到 DeployUI,修改觸發(fā)事件,注意事件格式定義如下:

{  "uid": "replace with you accountID",  "group_id": "replace with the group_id you just create in the Site web"

  "endpoint": "replace with the SLD"}

點(diǎn)擊執(zhí)行之后,就可以通過剛剛 Site 頁面的 Group 入口進(jìn)入 UI 頁面:
怎樣快速搭建serverless網(wǎng)盤服務(wù)

在 UI 頁面配置相關(guān)的 Storage :

怎樣快速搭建serverless網(wǎng)盤服務(wù)

接下來,您就可以對您的網(wǎng)盤進(jìn)行各種文件操作了。
怎樣快速搭建serverless網(wǎng)盤服務(wù)
怎樣快速搭建serverless網(wǎng)盤服務(wù)

上述內(nèi)容就是怎樣快速搭建serverless網(wǎng)盤服務(wù),你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

名稱欄目:怎樣快速搭建serverless網(wǎng)盤服務(wù)
網(wǎng)頁URL:http://bm7419.com/article22/pschjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、品牌網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化、網(wǎng)站策劃、用戶體驗(yàn)商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站