开发函数计算的正确姿势——使用交互模式安装依赖
前言
首先介紹下在本文出現(xiàn)的幾個比較重要的概念:
函數(shù)計算(Function Compute): 函數(shù)計算是一個事件驅(qū)動的服務(wù),通過函數(shù)計算,用戶無需管理服務(wù)器等運行情況,只需編寫代碼并上傳。函數(shù)計算準(zhǔn)備計算資源,并以彈性伸縮的方式運行用戶代碼,而用戶只需根據(jù)實際代碼運行所消耗的資源進(jìn)行付費。函數(shù)計算更多信息參考。
Fun: Fun 是一個用于支持 Serverless 應(yīng)用部署的工具,能幫助您便捷地管理函數(shù)計算、API 網(wǎng)關(guān)、日志服務(wù)等資源。它通過一個資源配置文件(template.yml),協(xié)助您進(jìn)行開發(fā)、構(gòu)建、部署操作。Fun 的更多文檔參考。
備注: 本文介紹的技巧需要 Fun 版本大于等于 3.0.0-beta.1 。
依賴工具
本項目是在 MacOS 下開發(fā)的,涉及到的工具是平臺無關(guān)的,對于 Linux 和 Windows 桌面系統(tǒng)應(yīng)該也同樣適用。在開始本例之前請確保如下工具已經(jīng)正確的安裝,更新到最新版本,并進(jìn)行正確的配置。
- Docker
- Fun
Fun 和 Fcli 工具依賴于 docker 來模擬本地環(huán)境。
對于 MacOS 用戶可以使用 homebrew 進(jìn)行安裝:
brew cask install docker brew tap vangie/formula brew install funWindows 和 Linux 用戶安裝請參考:https://github.com/aliyun/fun/blob/master/docs/usage/installation.md
安裝好后,記得先執(zhí)行 fun config 初始化一下配置。
注意, 如果你已經(jīng)安裝過了 fun,確保 fun 的版本在 3.0.0-beta.1 以上。
$ fun --version 3.0.0-beta.1背景
函數(shù)計算以 Zip 壓縮文件格式作為約定的交付物,交付物通常包含代碼和依賴庫文件。這些依賴庫文件通常分為系統(tǒng)依賴(使用 apt-get 包管理安裝的庫)和語言運行時依賴(使用語言相關(guān)的包管理器如 npm、pip 安裝的庫)。
系統(tǒng)依賴通常不可移植
通常情況下系統(tǒng)依賴和環(huán)境相關(guān),比如我們希望在函數(shù)里調(diào)用 brotli 命令解壓文件,如果我們在開發(fā)機 mac 上,使用 brew install brotli 安裝了 brotil 命令,然后打包發(fā)布到函數(shù)計算平臺是無法運行的。有時候即使開發(fā)機是 linux 也不一定可以。這是因為通過系統(tǒng)提供的包管理工具安裝的可執(zhí)行程序和動態(tài)鏈接庫與系統(tǒng)的類型和版本強相關(guān)。不同系統(tǒng)上安裝的這些程序和文件不具備可移植性。
語言依賴也存在不可移植的情況
通常情況下語言依賴是平臺無關(guān)的,比如說使用 npm install jszip 安裝一個 nodejs 依賴,該依賴可以運行在不同的操作系統(tǒng)和不同的 nodejs 版本下。語言平臺上的依賴通常是可移植的,單也有例外的情況。如: npm install node-pty 就是一個存在原生綁定(native binding)的例子。node-pty 模塊安裝過程中,依賴一些 c/c++ 代碼,這些代碼會在安裝的過程中進(jìn)行編譯,我們知道 c/c++ 代碼雖然也具備平臺移植性,但是其編譯產(chǎn)物是不可移植的。
DSL 腳本的不足
Fun 2.0 版本支持依賴安裝 DSL 文件 fun.yml,fun.yml 為依賴安裝提供了批量模式。日常開發(fā)提供了一種命令模式,如:fun install --package-type pip tensorflow。在 Fun 3.0 中我們提供了一種全新的 DSL 文件 Funfile。Funfile 可以理解為 Dockerfile 的語法子集,讓熟悉 docker 的開發(fā)者可以快速上手。
但是無論是 fun.yml 或 Funfile,以及命令模式,對于開發(fā)者都有一個痛點。那就是不知道環(huán)境里當(dāng)前的狀態(tài):
開發(fā)者需要可以交互的沙箱環(huán)境。該功能在 Fun 2.0 中沒有,用戶常常使用 fcli sbox 命令作為替代,或者直接使用 fc-docker 項目提供的鏡像啟動一個 container。docker run --rm -it -v $(pwd):/code aliyunfc/runtime-python2.7:build bash 但是這些復(fù)雜的命令和參數(shù)需要用戶具備足夠的 docker 背景知識以及對函數(shù)計算工作原理的了解。
為了更好的解決上述問題,提升用戶的開發(fā)體驗,我們在 Fun 3.0 中提供了 fun install sbox 子命令。
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Z8HxmFxk-1578536859694)(https://data-analysis.cn-shanghai.log.aliyuncs.com/logstores/article-logs/track_ua.gif?APIVersion=0.6.0&title=%E5%BC%80%E5%8F%91%E5%87%BD%E6%95%B0%E8%AE%A1%E7%AE%97%E7%9A%84%E6%AD%A3%E7%A1%AE%E5%A7%BF%E5%8A%BF%E2%80%94%E2%80%94%E4%BD%BF%E7%94%A8%E4%BA%A4%E4%BA%92%E6%A8%A1%E5%BC%8F%E5%AE%89%E8%A3%85%E4%BE%9D%E8%B5%96&author=%E5%80%9A%E8%B4%A4&src=article)]
命令行參數(shù)
$ fun install sbox --help Usage: fun install sbox [-f|--function <[service/]function>] [-r|--runtime <runtime>] [-i|--interactive] [-e|--env key=val ...] [-e|--cmd <cmd>]Start a local sandbox for installation dependencies or configurationOptions:-f, --function <[service/]function> Specify which function to execute installation task.-r, --runtime <runtime> function runtime, avaliable choice is: nodejs6, nodejs8, nodejs10, python2.7, python3, java8, php7.2, custom-i, --interactive run as interactive mode. Keep STDIN open and allocate a pseudo-TTY when in a interactive shell. (default: false)-e, --env <env> environment variable, ex. -e PATH=/code/bin (default: [])-c, --cmd <cmd> command with arguments to execute inside the installation sandbox.-h, --help output usage information快速開始
下面以項目 pyzbar_example 為例, pyzbar_example 項目包含如下文件
$ tree . . ├── fun.yml ├── index.py ├── qrcode.png └── template.yml0 directories, 4 files其中 template.yml 文件內(nèi)容如下
ROSTemplateFormatVersion: '2015-09-01' Transform: 'Aliyun::Serverless-2018-04-03' Resources: pyzbar-srv: Type: 'Aliyun::Serverless::Service' pyzbar-fun:Type: 'Aliyun::Serverless::Function'Properties:Handler: index.handlerRuntime: python3Timeout: 60MemorySize: 128CodeUri: .啟動交互模式 sbox
$ fun install sbox -f pyzbar-fun -i using template: template.yml root@fc-python3:/code# ls fun.yml index.py qrcode.png template.yml root@fc-python3:/code# exit exit $在 template.yml 所在的項目目錄執(zhí)行 fun install sbox,其中參數(shù)
- -f/–function 參數(shù)指定啟動 sbox 的函數(shù),本例中函數(shù)所設(shè)定的 runtime 為 python3,所以 python3 環(huán)境的沙箱環(huán)境會被啟動起來,函數(shù) pyzbar-fun 所對應(yīng)的 CodeUri 目錄會被掛載到沙箱環(huán)境內(nèi)部的 /code 目錄,上面例子中在沙箱環(huán)境內(nèi) ls 命令返回的文件列表證實了這一點。
- -i/–interactive 參數(shù)表示啟動交互模式,對應(yīng)非交互模式的用途可以看后面的示例。
如果 template.yml 文件并不存在,或者 template.yml 配置文件內(nèi)的函數(shù)尚未配置可以 使用 --runtime 參數(shù)啟動交互模式,此時當(dāng)前目錄會被掛載到沙箱環(huán)境的 /code 目錄。
$ fun install sbox -r nodejs10 -i root@fc-nodejs10:/code# ls fun.yml index.py qrcode.png template.yml root@fc-nodejs10:/code# exit exit $上面的方法適用于臨時啟動一個 sbox 做些動手實驗的場景。
使用 fun-install 安裝 apt 和 pip 依賴
$ fun install sbox -f pyzbar-fun -i using template: template.yml root@fc-python3:/code# fun-install apt-get install libblas3 Task => [UNNAMED]=> apt-get update (if need)=> apt-get install -y -d -o=dir::cache=/code/.fun/tmp libblas3=> bash -cfor f in $(ls /code/.fun/tmp/archives/*.deb); dodpkg -x $f /code/.fun/root;mkdir -p /code/.fun/tmp/deb-control/${f%.*};dpkg -e $f /code/.fun/tmp/deb-control/${f%.*};if [ -f "/code/.fun/tmp/deb-control/${f%.*}/postinst" ]; thenFUN_INSTALL_LOCAL=true /code/.fun/tmp/deb-control/${f%.*}/postinst configure;fi;done;=> bash -c 'rm -rf /code/.fun/tmp/archives' root@fc-python3:/code# fun-install --help Usage: fun local [options] [command]build function codes or install related depedencies for Function ComputeOptions:-h, --help output usage informationCommands:apt-get install apt depenciespip install pip depenciesbuild build function codes for Function Computehelp [cmd] display help for [cmd]非交互模式下使用 sbox
使用如下一行命令打印出 pyzbar-fun 函數(shù)的 sbox 內(nèi)預(yù)裝的 deb 包。
$ fun install sbox -f pyzbar-fun -c 'dpkg -l' using template: template.yml Desired=Unknown/Install/Remove/Purge/Hold | Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend |/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad) ||/ Name Version Architecture Description +++-==================================-================================-============-=============================================================================== ii acl 2.2.52-2 amd64 Access control list utilities ii adduser 3.113+nmu3 all add and remove users and groups ii apt 1.0.9.8.4 amd64 commandline package manager ii apt-utils 1.0.9.8.5 amd64 package management related utility programs ii autoconf 2.69-8 all automatic configure script builder ii automake 1:1.14.1-4+deb8u1 all Tool for generating GNU Standards-compliant Makefiles ...(此處省略了許多行)也可以通過管道將外部命令的內(nèi)容傳遞到內(nèi)部
$ echo hello | fun install sbox -r nodejs10 -i -c 'cat -' hello注意這里 -i 參數(shù)不能省略,該參數(shù)表示接受標(biāo)準(zhǔn)輸入。
小結(jié)
fun install sbox 是 fcli sbox 的替代工具,除了支持交互模式,沿用了指定 runtime 啟動 sbox,也實現(xiàn)了 fun 風(fēng)格的指定函數(shù)啟動 sbox,更加便利。同時也支持內(nèi)聯(lián)命令和管道等非交互模式的用法,為編寫腳本提供了更好的支持。
“阿里巴巴云原生關(guān)注微服務(wù)、Serverless、容器、Service Mesh 等技術(shù)領(lǐng)域、聚焦云原生流行技術(shù)趨勢、云原生大規(guī)模的落地實踐,做最懂云原生開發(fā)者的技術(shù)圈?!?/p> 《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)
以上是生活随笔為你收集整理的开发函数计算的正确姿势——使用交互模式安装依赖的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kubernetes 会不会“杀死” D
- 下一篇: 函数计算支持应用中心功能