开发函数计算的正确姿势——使用交互模式安装依赖

前言

首先介绍下在本文出现的几个比较重要的概念:

函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。函数计算更多信息参考
Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API 网关、日志服务等资源。它通过一个资源配置文件(template.yml),协助您进行开发、构建、部署操作。Fun 的更多文档参考

备注: 本文介绍的技巧需要 Fun 版本大于等于 3.0.0-beta.1 。

依赖工具

本项目是在 MacOS 下开发的,涉及到的工具是平台无关的,对于 Linux 和 Windows 桌面系统应该也同样适用。在开始本例之前请确保如下工具已经正确的安装,更新到最新版本,并进行正确的配置。

Fun 和 Fcli 工具依赖于 docker 来模拟本地环境。

对于 MacOS 用户可以使用 homebrew 进行安装:

brew cask install docker
brew tap vangie/formula
brew install fun

Windows 和 Linux 用户安装请参考:<https://github.com/aliyun/fun/blob/master/docs/usage/installation.md&gt;

安装好后,记得先执行 fun config 初始化一下配置。

注意, 如果你已经安装过了 fun,确保 fun 的版本在 3.0.0-beta.1 以上。

$ fun --version
3.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,以及命令模式,对于开发者都有一个痛点。那就是不知道环境里当前的状态:

  1. 已经安装的软件有哪些
  2. 某个目录下有些什么文件
  3. 文件的内容以及属性是什么

开发者需要可以交互的沙箱环境。该功能在 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: .

启动交互模式 sbox

$ fun install sbox -f pyzbar-fun -i
using template: template.yml
[email protected]:/code# ls
fun.yml  index.py  qrcode.png  template.yml
[email protected]:/code# exit
exit
$

在 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
[email protected]:/code# ls
fun.yml  index.py  qrcode.png  template.yml
[email protected]:/code# exit
exit
$

上面的方法适用于临时启动一个 sbox 做些动手实验的场景。

使用 fun-install 安装 apt 和 pip 依赖

$ fun install sbox -f pyzbar-fun -i
using template: template.yml
[email protected]:/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‘
[email protected]:/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]

非交互模式下使用 sbox

使用如下一行命令打印出 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 sboxfcli sbox 的替代工具,除了支持交互模式,沿用了指定 runtime 启动 sbox,也实现了 fun 风格的指定函数启动 sbox,更加便利。同时也支持内联命令和管道等非交互模式的用法,为编写脚本提供了更好的支持。

原文地址:https://blog.51cto.com/13778063/2465427

时间: 2024-10-01 06:25:17

开发函数计算的正确姿势——使用交互模式安装依赖的相关文章

开发函数计算的正确姿势 —— 使用 Fun Local 本地运行与调试

前言首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费.函数计算更多信息 参考. Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算.API 网关.日志服务等资源.它通过一个资源配置文件(template.yml),

开发函数计算的正确姿势——轻松解决大依赖部署

<a name="1"></a> 前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费.函数计算更多信息 参考.Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算.API 网关.

开发函数计算的正确姿势 —— 爬虫

在 <函数计算本地运行与调试 - Fun Local 基本用法> 中,我们介绍了利用 Fun Local 本地运行.调试函数的方法.但如果仅仅这样简单的介绍,并不能展现 Fun Local 对函数计算开发的巨大效率的提升. 这一次,我们拿一个简单的场景来举例子--开发一个简单的爬虫函数(代码参考函数计算控制台模板),介绍如何以正确姿势,从零开始,开发一个自动伸缩.按调用次数收费的 serverless 爬虫应用. 开发步骤我们将这个完整的应用拆分成多步,并且在每一步完成后,我们都会进行相应的运

开发函数计算的正确姿势——网页截图服务

前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费.函数计算更多信息参考. Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算.API 网关.日志服务等资源.它通过一个资源配置文件(template.yml),

开发函数计算的正确姿势——运行 Selenium Java

前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费.函数计算更多信息参考. Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算.API 网关.日志服务等资源.它通过一个资源配置文件(template.yml),

开发函数计算的正确姿势———为 PHP 运行时添加自定义扩展

PHP 语言提供了一种扩展机制(Extension),通过 PHP 扩展可以增强语法.调用 C/C++ 实现的库函数以及优化执行性能.PHP 扩展是与平台相关的动态链接库,在 Linux 和 Mac 平台是 .so 文件,在 Windows 平台是 .dll 文件.由于函数计算的开发通常在 Mac 和 Windows 平台,而运行时是 Linux(Debain)环境,所以为函数计算 PHP 运行时添加扩展会遇到由于动态链接库平台相关而导致要么本地无法调试,要么远端无法运行的问题.本文介绍借助 F

Serverless 解惑——函数计算如何安装字体

<a name="1"></a> 前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费.函数计算更多信息 参考.Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算.API 网关.

函数计算: 让小程序开发进入 Serverless 时代

点击下载<不一样的 双11 技术:阿里巴巴经济体云原生实践> 本文节选自<不一样的 双11 技术:阿里巴巴经济体云原生实践>一书,点击上方图片即可下载! 作者 | 吴天龙(木吴)阿里云函数计算技术专家 导读:小程序是轻量级的快速迭代的移动应用,对开发者从开发到上线的效率提出了更高的要求.使用函数计算,开发者无需关心后端服务的搭建运维,只需要编写函数就能够为小程序提供稳定可靠并且弹性伸缩的服务.并且随着小程序访问量增加,函数计算能够自动快速地弹性伸缩,即使应对 双11 活动高峰也能够

SpringBoot 开发案例之参数传递的正确姿势

前言 开发这么多年,肯定还有不少小伙伴搞不清各种类型的参数是如何传递的,很多同学都是拿来即用,复制粘贴一把撸,遇到问题还是一脸懵逼. 姿势 学习参数传递的正确姿势,先说怎么做,再说为什么,本质上还是复制粘贴一把撸,问题是你想问不想问为什么! 传递 用户登录 前端代码: var param = { "username": "admin", "password": "admin" } $.ajax({ url: "/sy