首先介紹下在本文出現的幾個比較重要的概念:php
函數計算(Function Compute): 函數計算是一個事件驅動的服務,經過函數計算,用戶無需管理服務器等運行狀況,只需編寫代碼並上傳。函數計算準備計算資源,並以彈性伸縮的方式運行用戶代碼,而用戶只需根據實際代碼運行所消耗的資源進行付費。函數計算更多信息 參考。
Fun: Fun 是一個用於支持 Serverless 應用部署的工具,能幫助您便捷地管理函數計算、API 網關、日誌服務等資源。它經過一個資源配置文件(template.yml),協助您進行開發、構建、部署操做。Fun 的更多文檔 參考。
備註: 本文介紹的技巧須要 Fun 版本大於等於 3.0.0-beta.1 。html
本項目是在 MacOS 下開發的,涉及到的工具是平臺無關的,對於 Linux 和 Windows 桌面系統應該也一樣適用。在開始本例以前請確保以下工具已經正確的安裝,更新到最新版本,並進行正確的配置。java
Fun 和 Fcli 工具依賴於 docker 來模擬本地環境。node
對於 MacOS 用戶能夠使用 homebrew 進行安裝:python
brew cask install docker brew tap vangie/formula brew install fun
Windows 和 Linux 用戶安裝請參考:https://github.com/aliyun/fun...linux
安裝好後,記得先執行 fun config
初始化一下配置。c++
注意, 若是你已經安裝過了 fun,確保 fun 的版本在 3.0.0-beta.1 以上。git
$ fun --version 3.0.0-beta.1
函數計算以 Zip 壓縮文件格式做爲約定的交付物,交付物一般包含代碼和依賴庫文件。這些依賴庫文件一般分爲系統依賴(使用 apt-get 包管理安裝的庫)和語言運行時依賴(使用語言相關的包管理器如 npm、pip 安裝的庫)。github
一般狀況下系統依賴和環境相關,好比咱們但願在函數裏調用 brotli 命令解壓文件,若是咱們在開發機 mac 上,使用 brew install brotli
安裝了 brotil 命令,而後打包發佈到函數計算平臺是沒法運行的。有時候即便開發機是 linux 也不必定能夠。這是由於經過系統提供的包管理工具安裝的可執行程序和動態連接庫與系統的類型和版本強相關。不一樣系統上安裝的這些程序和文件不具有可移植性。docker
一般狀況下語言依賴是平臺無關的,好比說使用 npm install jszip
安裝一個 nodejs 依賴,該依賴能夠運行在不一樣的操做系統和不一樣的 nodejs 版本下。語言平臺上的依賴一般是可移植的,單也有例外的狀況。如: npm install node-pty
就是一個存在原生綁定(native binding)的例子。node-pty 模塊安裝過程當中,依賴一些 c/c++ 代碼,這些代碼會在安裝的過程當中進行編譯,咱們知道 c/c++ 代碼雖然也具有平臺移植性,可是其編譯產物是不可移植的。
Fun 2.0 版本支持依賴安裝 DSL 文件 fun.yml,fun.yml 爲依賴安裝提供了批量模式。平常開發提供了一種命令模式,如:fun install --package-type pip tensorflow
。在 Fun 3.0 中咱們提供了一種全新的 DSL 文件 Funfile。Funfile 能夠理解爲 Dockerfile 的語法子集,讓熟悉 docker 的開發者能夠快速上手。
可是不管是 fun.yml 或 Funfile,以及命令模式,對於開發者都有一個痛點。那就是不知道環境裏當前的狀態:
開發者須要能夠交互的沙箱環境。該功能在 Fun 2.0 中沒有,用戶經常使用 fcli sbox
命令做爲替代,或者直接使用 fc-docker 項目提供的鏡像啓動一個 container。docker run --rm -it -v $(pwd):/code aliyunfc/runtime-python2.7:build bash
可是這些複雜的命令和參數須要用戶具有足夠的 docker 背景知識以及對函數計算工做原理的瞭解。
爲了更好的解決上述問題,提高用戶的開發體驗,咱們在 Fun 3.0 中提供了 fun install sbox
子命令。
$ 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 configuration Options: -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.yml 0 directories, 4 files
其中 template.yml 文件內容以下
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.handler Runtime: python3 Timeout: 60 MemorySize: 128 CodeUri: .
$ 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 所在的項目目錄執行 fun install sbox,其中參數
若是 template.yml 文件並不存在,或者 template.yml 配置文件內的函數還沒有配置能夠 使用 --runtime 參數啓動交互模式,此時當前目錄會被掛載到沙箱環境的 /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 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 -c for f in $(ls /code/.fun/tmp/archives/*.deb); do dpkg -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" ]; then FUN_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 Compute Options: -h, --help output usage information Commands: apt-get install apt depencies pip install pip depencies build build function codes for Function Compute help [cmd] display help for [cmd]
使用以下一行命令打印出 pyzbar-fun 函數的 sbox 內預裝的 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 ...(此處省略了許多行)
也能夠經過管道將外部命令的內容傳遞到內部
$ echo hello | fun install sbox -r nodejs10 -i -c 'cat -' hello
注意這裏 -i
參數不能省略,該參數表示接受標準輸入。
fun install sbox
是 fcli sbox
的替代工具,除了支持交互模式,沿用了指定 runtime 啓動 sbox,也實現了 fun 風格的指定函數啓動 sbox,更加便利。同時也支持內聯命令和管道等非交互模式的用法,爲編寫腳本提供了更好的支持。
「 阿里巴巴雲原生關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,作最懂雲原生開發者的技術圈。」