首先介绍下在本文出现的几个比较重要的概念:php
函数计算(Function Compute): 函数计算是一个事件驱动的服务,经过函数计算,用户无需管理服务器等运行状况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。函数计算更多信息参考。 Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API 网关、日志服务等资源。它经过一个资源配置文件(template.yml),协助您进行开发、构建、部署操做。Fun 的更多文档参考。html
备注: 本文介绍的技巧须要 Fun 版本大于等于 3.0.0-beta.1 。java
本项目是在 MacOS 下开发的,涉及到的工具是平台无关的,对于 Linux 和 Windows 桌面系统应该也一样适用。在开始本例以前请确保以下工具已经正确的安装,更新到最新版本,并进行正确的配置。node
Fun 和 Fcli 工具依赖于 docker 来模拟本地环境。python
对于 MacOS 用户可使用 homebrew 进行安装:linux
brew cask install docker brew tap vangie/formula brew install fun
Windows 和 Linux 用户安装请参考:https://github.com/aliyun/fun/blob/master/docs/usage/installation.mdc++
安装好后,记得先执行 fun config
初始化一下配置。git
注意, 若是你已经安装过了 fun,确保 fun 的版本在 3.0.0-beta.1 以上。github
$ fun --version 3.0.0-beta.1
函数计算以 Zip 压缩文件格式做为约定的交付物,交付物一般包含代码和依赖库文件。这些依赖库文件一般分为系统依赖(使用 apt-get 包管理安装的库)和语言运行时依赖(使用语言相关的包管理器如 npm、pip 安装的库)。docker
一般状况下系统依赖和环境相关,好比咱们但愿在函数里调用 brotli 命令解压文件,若是咱们在开发机 mac 上,使用 brew install brotli
安装了 brotil 命令,而后打包发布到函数计算平台是没法运行的。有时候即便开发机是 linux 也不必定能够。这是由于经过系统提供的包管理工具安装的可执行程序和动态连接库与系统的类型和版本强相关。不一样系统上安装的这些程序和文件不具有可移植性。
一般状况下语言依赖是平台无关的,好比说使用 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 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,作最懂云原生开发者的技术圈。”