函数打算(Function Compute): 函数打算是一个事宜驱动的做事,通过函数打算,用户无需管理做事器等运行情形,只需编写代码并上传。函数打算准备打算资源,并以弹性伸缩的办法运行用户代码,而用户只需根据实际代码运行所花费的资源进行付费。
Fun: Fun 是一个用于支持 Serverless 运用支配的工具,能帮助您便捷地管理函数打算、API 网关、日志做事等资源。它通过一个资源配置文件(template.yml),帮忙您进行开拓、构建、支配操作。
备注: 本文先容的技巧须要 Fun 版今年夜于即是 3.0.0-beta.1 。

本项目是在 MacOS 下开拓的,涉及到的工具是平台无关的,对付 Linux 和 Windows 桌面系统该当也同样适用。在开始本例之前请确保如下工具已经精确的安装,更新到最新版本,并进行精确的配置。
DockerFunFun 和 Fcli 工具依赖于 docker 来仿照本地环境。
对付 MacOS 用户可以利用 homebrew 进行安装:
brew cask install dockerbrew tap vangie/formulabrew install fun
Windows 和 Linux 用户安装请参考:
https://github.com/aliyun/fun/blob/master/docs/usage/installation.md安装好后,记得先实行 fun config 初始化一下配置。
把稳, 如果你已经安装过了 fun,确保 fun 的版本在 3.0.0-beta.1 以上。
$ fun --version3.0.0-beta.1背景
函数打算以 Zip 压缩文件格式作为约定的交付物,交付物常日包含代码和依赖库文件。这些依赖库文件常日分为系统依赖(利用 apt-get 包管理安装的库)和措辞运行时依赖(利用措辞干系的包管理器如 npm、pip 安装的库)。
系统依赖常日不可移植
常日情形下系统依赖和环境干系,比如我们希望在函数里调用 brotli 命令解压文件,如果我们在开拓机 mac 上,利用 brew install brotli 安装了 brotil 命令,然后打包发布到函数打算平台是无法运行的。有时候纵然开拓机是 linux 也不一定可以。这是由于通过系统供应的包管理工具安装的可实行程序和动态链接库与系统的类型和版本强干系。不同系统上安装的这些程序和文件不具备可移植性。
措辞依赖也存在不可移植的情形
常日情形下措辞依赖是平台无关的,比如说利用 npm install jszip 安装一个 nodejs 依赖,该依赖可以运行在不同的操作系统和不同的 nodejs 版本下。措辞平台上的依赖常日是可移植的,单也有例外的情形。如: npm install node-pty 便是一个存在原生绑定(native binding)的例子。node-pty 模块安装过程中,依赖一些 c/c++ 代码,这些代码会在安装的过程中进行编译,我们知道 c/c++ 代码虽然也具备平台移植性,但是其编译产物是不可移植的。
DSL 脚本的不敷
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 --helpUsage: 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 文件内容如下
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: .
启动交互模式 sbox
$ fun install sbox -f pyzbar-fun -iusing template: template.ymlroot@fc-python3:/code# lsfun.yml index.py qrcode.png template.ymlroot@fc-python3:/code# exitexit$
在 template.yml 所在的项目目录实行 fun install sbox,个中参数
-f/--function 参数指定启动 sbox 的函数,本例中函数所设定的 runtime 为 python3,以是 python3 环境的沙箱环境会被启动起来,函数 pyzbar-fun 所对应的 CodeUri 目录会被挂载到沙箱环境内部的 /code 目录,上面例子中在沙箱环境内 ls 命令返回的文件列表证明了这一点。-i/--interactive 参数表示启动交互模式,对应非交互模式的用场可以看后面的示例。如果 template.yml 文件并不存在,或者 template.yml 配置文件内的函数尚未配置可以 利用 --runtime 参数启动交互模式,此时当前目录会被挂载到沙箱环境的 /code 目录。
$ fun install sbox -r nodejs10 -i root@fc-nodejs10:/code# lsfun.yml index.py qrcode.png template.ymlroot@fc-nodejs10:/code# exitexit$
上面的方法适用于临时启动一个 sbox 做些动手实验的场景。
利用 fun-install 安装 apt 和 pip 依赖
$ fun install sbox -f pyzbar-fun -i using template: template.ymlroot@fc-python3:/code# fun-install apt-get install libblas3Task => [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 --helpUsage: fun local [options] [command]build function codes or install related depedencies for Function ComputeOptions: -h, --help output usage informationCommands: apt-get install apt depencies pip install pip depencies build build function codes for Function Compute help [cmd] display help for [cmd]
非交互模式下利用 sbox
利用如下一行命令打印出 pyzbar-fun 函数的 sbox 内预装的 deb 包。
$ fun install sbox -f pyzbar-fun -c 'dpkg -l'using template: template.ymlDesired=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 utilitiesii adduser 3.113+nmu3 all add and remove users and groupsii apt 1.0.9.8.4 amd64 commandline package managerii apt-utils 1.0.9.8.5 amd64 package management related utility programsii autoconf 2.69-8 all automatic configure script builderii 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,更加便利。同时也支持内联命令和管道等非交互模式的用法,为编写脚本供应了更好的支持。
作者:倚贤
本文为云栖社区内容,未经许可不得转载。