您好,登錄后才能下訂單哦!
本篇文章為大家展示了怎樣快速搭建serverless網盤服務,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
函數計算支持以無服務器架構快速構建企業和開發者的軟件系統,以其全托管事件觸發模式、超彈性伸縮以及低廉的計費方式,相對于傳統服務器架構,在開發效能和運維模式上都取得了明顯優勢。另外還提供了各種服務間的觸發功能,作為云端各種產品的黏合劑,適用于各種應用場景。
將帶領大家利用函數計算,快速搭建一個功能完整的網盤服務。
網盤服務功能詳細介紹請參考文章網盤服務系統和相應的項目 repo 。
本文重點不是介紹網盤功能,所以,請大家通過已經搭建好的網盤 demo 自行體驗,這里不做過多贅述。
網盤服務功能集較多,這里就以上傳文件功能為例,展現其網盤的實現架構。
網盤服務的模塊實現分為三個部分,如下圖所示:
apis : 提供了網盤的 API 接口功能,這部分功能是 serverless 架構實現的核心,使用 FC+API Gateway 架構模式實現主體功能,如上圖無服務器架構圖中展現的。
Site : 提供了網盤實例的管理控制臺,還有對應的網盤宣傳、使用文檔以及 api 文檔等。
UI : 提供用戶使用和維護網盤的客戶端。
這里,Site 和 UI 這兩個子模塊的實現都是靜態網站模式,可以直接使用 OSS bucket 的 website 特性實現。為了簡化整個部署流程和自動化資源編排過程,將 Site 和 UI 的部署方式也整合到 FC 中統一維護,見下面的詳細的部署流程描述。
網盤服務功能后臺依賴資源羅列如下:
fun 是 have Fun with Serverless
的縮寫,是一款 Serverless 應用開發的工具,可以幫助用戶定義函數計算、API 網關、日志服務等資源,旨在與阿里云 ROS 兼容(盡管到目前為止 ROS 還不支持函數計算。但是,fun 作為 ROS 的子集是我們的目標)。
使用 fun 能夠解決復雜服務的資源依賴維護問題,能夠快速部署、更新,簡化資源編排運維。針對該網盤服務的眾多資源依賴,使用 fun 能夠很方便、迅速的解決各種資源的搭建和維護過程。下面我們將演示如何使用 fun 部署網盤服務系統。
網盤服務目前實現了三種身份登錄驗證功能: 釘釘、支付寶和特殊賬號密碼(用于測試)。
因為釘釘、支付寶登錄方式需要走一些申請流程獲取對應的 appID 和 appSecret ,這里為了簡化流程,我們僅僅使用特殊賬號密碼方式。
部署的具體步驟如下:
準備工作:
云賬號準備
代碼準備
fun 下載和配置
配置 fun 的 template.yml
部署 template.yml 定義資源,獲取二級域名等信息
更新 apis function
部署 Site ,創建 groupID 實例
部署 UI,配置 storage 實例
首先,準備一個能夠登錄阿里云官網的云賬號, 登錄控制臺獲取這個賬號的 UID ( accountID )、 accessKeyID 和 accessKeySecret 。部署演示使用的資源全部在華東 2 ( cn-shanghai )。也可以使用其他 region 資源,但是必須保證所有的服務都在同一個 region 中。
然后開通如下服務:
函數計算支持多種代碼上傳方式,這里統一打包成 zip 文件,并上傳到該云賬號的某個 bucket 上(用戶自行在華東 2 創建即可)。參考代碼如下連接:
apis.zip
注意: apis 使用 nodejs 實現,在打包之前需要執行 tnpm i
命令安裝項目依賴。
解壓后目錄結構如下:
|-- controllers # 控制層,主要邏輯 |-- routes # api路由 |-- services # 公共方法,包含調用各個云產品的方法 |-- utils |-- models |-- node_modules # 項目依賴 |-- index.js # 服務入口 |-- conf.js # config 配置 |-- package.json
site.zip
|-- deploy.py # 部署函數 |-- site # site代碼目錄 |-- 404.html |-- index.html |-- docs |-- static
解壓后文件結構如下:
ui.zip
|-- deploy.py # 部署函數 |-- ui # ui代碼目錄 |-- 404.html |-- index.html |-- static
解壓后文件結構如下:
如果您的系統已經安裝有 node 8 及以上的環境配置,那么可以直接執行如下命令進行 fun 的安裝
npm install @alicloud/fun -g
如果您不想安裝 node 運行環境,那么可以直接下載 fun 的 binary 執行,參考各種環境 fun 的 release binary 。
然后設置 accountID、accessKeyID 和 accessKeySecret 以及 region,請使用準備步驟中的已經申請的云賬號的參數進行配置,本示例中 region 選擇 cn-shanghai :
# 如果是 binary ,執行 ./${binary_name} configfun config
template.yml 模板配置是本部署中最重要的部分,因為網盤服務依賴的資源項比較多(主要是 API網關資源和表格存儲資源), 建議下載參考模板直接修改,需要修改的內容已經使用 "TODO" 標識。
template.yml 的語法規范參考 fun 規范文檔。
這面具體介紹配置中的相關部分:
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 文件主要做了以下幾件事情:
創建一個名為 'apsaradrivefc' 的 Service , 并且為這個 Service 創建一個具有 AliyunOTSFullAccess
、AliyunSTSAssumeRoleAccess
、 AliyunOTSFullAccess
、 AliyunLogFullAccess
和AliyunFCInvocationAccess
這幾大權限的 Service Role。然后在這個 Service 下面創建三個 Function ,分別名為 'apis', 'DeploySite' 和 'DeployUI' 。
創建一個 LOG Project名為 'log-yunpan' , 然后在這個LOG Project 下面創建一個名為 'fclog' 的 Logstore ,作為 apsaradrivefc 這個 Service 下 Function 執行的日志收集 store 。
創建一個名為 'ts-yunpan' 的 OTS Instance , 并且在這面生成各種 Table 。
創建一個 API 網關分組: apsaradriveapis ,以及其下的各種 API 定義。
需要修改的內容:
OTS Instance name: 全局有三處地方需要修改,請統一,因為 OTS Instance 在 region 范圍全局唯一,盡量保持命名唯一性,注意: OTS Instance 命名規范。
LOG Project name: 全局有兩處地方需要修改,請統一,因為 LOG Project在region范圍全局唯一,盡量保持命名唯一性,注意: LOG Project 命名規范。
三處 CodeUri ,分別是 apis ,Site 和 UI 三個模塊的代碼位置,目前 template.yml 中的默認配置可用,可以不修改。
apis 這個 Function 中的 EnvironmentVariables 屬性內部需要配置 API 網關分組的二級域名,因為當前步驟還沒有生成這個參數,這里先不修改。
直接執行如下命令:
# 在 template.yml 所在目錄執行# 如果是 binary ,執行 ./${binary_name} configfun deploy
這個時候,你可以在 OTS、SLS、RAM、API 網關和 FC 的控制臺上分別看到 fun 為網盤服務創建的各種資源,如下圖:
從上一步 fun 的部署輸出日志中可以找到對應的 API 網關分組的二級域名,如下:
修改 apis 這個 Function 中的 EnvironmentVariables 屬性內部需要配置 API 網關分組的二級域名,如下圖位置:
仍然執行如下命令,進行function的環境變量更新
fun deploy
至此,apis 模塊部署完畢。
Site 模塊的實現其實就是一個靜態網站,我們可以利用 OSS 的靜態網站功能實現,步驟如下:
修改 static/global.js 中的 endpoint ( apis 的二級域名)和 ui_endpoint (如果在華東2, 那么就是 ${uid}-ui.oss-cn-shanghai.aliyuncs.com )
創建 ${uid}-site 這個 bucket ,并設置為 public-read ACL
設置這個 bucket 的 website 的默認首頁和 404 頁面
上傳整個代碼目錄
將所有的步驟按照函數計算編程模型封裝如下,并創建為 Function: DeploySite 。封裝的 Function 實現如下所示:
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 這個 Function 就能夠完成 Site 模塊的部署。接下來演示一下 Invoke 的過程。
登錄函數計算控制臺,找到對應的 Function: DeploySite ,修改觸發事件,然后點擊執行:
{ "uid": "replace with you accountID", "endpoint": "replace with the SLD"}
然后打開 Site 頁面(如果 uid 為 apsaradrive 的話,那么 Site 的 URL 為: http://apsaradrive-site.oss-cn-shanghai.aliyuncs.com ),登錄之后(使用默認的 username: admin, password: 1234 登錄),創建 group 實例。
部署 UI 的過程和 Site 類似,同樣在控制臺上找到 DeployUI,修改觸發事件,注意事件格式定義如下:
{ "uid": "replace with you accountID", "group_id": "replace with the group_id you just create in the Site web" "endpoint": "replace with the SLD"}
點擊執行之后,就可以通過剛剛 Site 頁面的 Group 入口進入 UI 頁面:
在 UI 頁面配置相關的 Storage :
接下來,您就可以對您的網盤進行各種文件操作了。
上述內容就是怎樣快速搭建serverless網盤服務,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。