最近在处理线上工单的时候,遇到一个用户使用 nodejs runtime 时由于函数计算运行环境的 gcc 版本太低致使没法运行的问题,以为很是有意思,因此深刻的帮用户寻找了解决方案。以为这个场景应该具备必定的通用性,因此在这篇文章里面重点的介绍一下如何使用函数计算的周边工具 fun 解决由于 runtime 中系统版本致使的各类兼容性问题。html
用户问题node
简要描述一下用户当时遇到的问题:linux
用户使用函数计算的 nodejs8 runtime,在本地本身的开发环境使用 npm install couchbase
安装了 couchbase 这个第三方库。couchbase 封装了 C 库,依赖系统底层动态连接库 libstdc++.so.6。由于用户本身的开发环境的操做系统内核比较新,因此本地安装、编译和调试都比较顺利。因此,最后按照函数计算的打包方式成功建立了 Function,可是执行 InvokeFunction 时,遇到了这样的错误:c++
"errorMessage": "/usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by /code/node_modules/couchbase/build/Release/couchbase_impl.node)", "errorType": "Error", "stackTrace": [ "Error: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by /code/node_modules/couchbase/build/Release/couchbase_impl.node)", ...
错误发生的缘由如堆栈描述,即没有 CXXABI_1.3.9 这个版本,能够看到函数计算 nodejs 环境中的支持状况:git
root@1fe79eb58dbd:/code# strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 |grep CXXABI_ CXXABI_1.3 CXXABI_1.3.1 CXXABI_1.3.2 CXXABI_1.3.3 CXXABI_1.3.4 CXXABI_1.3.5 CXXABI_1.3.6 CXXABI_1.3.7 CXXABI_1.3.8 CXXABI_TM_1
升级底层系统版本的代价比较大,须要长时间的稳定性、兼容性测试和观察,因此,为了支持这类使用场景,咱们但愿可以有比较简单的方式绕行。github
场景复现和问题解决shell
前提:先按照 fun 的安装步骤安装 fun工具,并进行 fun config 配置。npm
在本地很快搭建了一个项目目录:bash
- test_code/ - index.js - template.yml
其中 index.js 和 template.yml 的 内容分别为less
# index.js const couchbase = require('couchbase').Mock; module.exports.handler = function(event, context, callback) { var cluster = new couchbase.Cluster(); var bucket = cluster.openBucket(); bucket.upsert('testdoc', {name:'Frank'}, function(err, result) { if (err) throw err; bucket.get('testdoc', function(err, result) { if (err) throw err; console.log(result.value); // {name: Frank} }); }); callback(null, { hello: 'world' }) } # template.yml ROSTemplateFormatVersion: '2015-09-01' Transform: 'Aliyun::Serverless-2018-04-03' Resources: fc: # service name Type: 'Aliyun::Serverless::Service' Properties: Description: 'fc test' helloworld: # function name Type: 'Aliyun::Serverless::Function' Properties: Handler: index.handler Runtime: nodejs8 CodeUri: './' Timeout: 60
为了可以在本地模拟函数计算的真实环境进行依赖包安装和调试,这里生成一个 fun.yml 文件用于 fun install 安装使用,内容以下:
runtime: nodejs8 tasks: - shell: |- if [ ! -f /code/.fun/root/usr/lib/x86_64-linux-gnu/libstdc++.so.6 ]; then mkdir -p /code/.fun/tmp/archives/ curl http://mirrors.ustc.edu.cn/debian/pool/main/g/gcc-6/libstdc++6_6.3.0-18+deb9u1_amd64.deb -o /code/.fun/tmp/archives/libstdc++6_6.3.0-18+deb9u1_amd64.deb bash -c 'for f in $(ls /code/.fun/tmp/archives/*.deb); do dpkg -x $f /code/.fun/root; done;' rm -rf /code/.fun/tmp/archives fi - name: install couchbase shell: npm install couchbase
fun.yml中参数说明:
$strings .fun/root/usr/lib/x86_64-linux-gnu/libstdc++.so.6|grep CXXABI_ CXXABI_1.3 CXXABI_1.3.1 CXXABI_1.3.2 CXXABI_1.3.3 CXXABI_1.3.4 CXXABI_1.3.5 CXXABI_1.3.6 CXXABI_1.3.7 CXXABI_1.3.8 CXXABI_1.3.9 CXXABI_1.3.10 CXXABI_TM_1 CXXABI_FLOAT128
执行 fun install 命令
安装各类第三方依赖,显示以下:
本地执行状况
执行 fun local invoke helloworld
,能够看到执行成功的效果:
$fun local invoke helloworld begin pullling image aliyunfc/runtime-nodejs8:1.4.0............................................................... pull image finished pull image finished FC Invoke Start RequestId: 78e20963-b314-4d69-843a-35a3f465796c load code for handler:index.handler FC Invoke End RequestId: 78e20963-b314-4d69-843a-35a3f465796c {"hello":"world"}2019-02-19T08:16:45.073Z 78e20963-b314-4d69-843a-35a3f465796c [verbose] { name: 'Frank' }
发布上线
使用 fun deploy
发布上线,而后到控制台执行一下线上实际的运行效果:
fun install 功能可以将代码和依赖文件分离开,独立安装系统依赖文件,并且 fun local 和 fun deply 都可以自动帮你设置第三方库的依赖引用路径,让您无需关心环境变量问题。
本文的解法只是提供了一个对于系统版本偏低没法知足用户一些高级库使用需求时的简单绕行方案,仅供参考,对于一些复杂的环境依赖问题,可能还须要具体状况具体分析。
99dXnVk4I)
本文为云栖社区原创内容,未经容许不得转载。