函数运行环境系统动态链接库版本太低?函数计算 fun 神助力分忧解难
背景
最近在處理線上工單的時(shí)候,遇到一個(gè)用戶(hù)使用 nodejs runtime 時(shí)因?yàn)楹瘮?shù)計(jì)算運(yùn)行環(huán)境的 gcc 版本過(guò)低導(dǎo)致無(wú)法運(yùn)行的問(wèn)題,覺(jué)得非常有意思,所以深入的幫用戶(hù)尋找了解決方案。覺(jué)得這個(gè)場(chǎng)景應(yīng)該具有一定的通用性,所以在這篇文章里面重點(diǎn)的介紹一下如何使用函數(shù)計(jì)算的周邊工具?fun?解決因?yàn)?runtime 中系統(tǒng)版本導(dǎo)致的各種兼容性問(wèn)題。
場(chǎng)景介紹
用戶(hù)問(wèn)題
簡(jiǎn)要描述一下用戶(hù)當(dāng)時(shí)遇到的問(wèn)題:
用戶(hù)使用函數(shù)計(jì)算的 nodejs8 runtime,在本地自己的開(kāi)發(fā)環(huán)境使用?npm install couchbase?安裝了?couchbase?這個(gè)第三方庫(kù)。couchbase 封裝了 C 庫(kù),依賴(lài)系統(tǒng)底層動(dòng)態(tài)鏈接庫(kù) libstdc++.so.6。因?yàn)橛脩?hù)自己的開(kāi)發(fā)環(huán)境的操作系統(tǒng)內(nèi)核比較新,所以本地安裝、編譯和調(diào)試都比較順利。所以,最后按照函數(shù)計(jì)算的打包方式成功創(chuàng)建了 Function,但是執(zhí)行 InvokeFunction 時(shí),遇到了這樣的錯(cuò)誤:
"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)", ...錯(cuò)誤發(fā)生的原因如堆棧描述,即沒(méi)有 CXXABI_1.3.9 這個(gè)版本,可以看到函數(shù)計(jì)算 nodejs 環(huán)境中的支持情況:
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升級(jí)底層系統(tǒng)版本的代價(jià)比較大,需要長(zhǎng)時(shí)間的穩(wěn)定性、兼容性測(cè)試和觀察,所以,為了支持這類(lèi)使用場(chǎng)景,我們希望能夠有比較簡(jiǎn)單的方式繞行。
場(chǎng)景復(fù)現(xiàn)和問(wèn)題解決
前提:先按照?fun 的安裝步驟安裝 fun工具,并進(jìn)行 fun config 配置。
在本地很快搭建了一個(gè)項(xiàng)目目錄:
- test_code/- index.js- template.yml其中 index.js 和 template.yml 的 內(nèi)容分別為
# 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 nameType: 'Aliyun::Serverless::Service'Properties:Description: 'fc test'helloworld: # function nameType: 'Aliyun::Serverless::Function'Properties:Handler: index.handlerRuntime: nodejs8CodeUri: './'Timeout: 60為了能夠在本地模擬函數(shù)計(jì)算的真實(shí)環(huán)境進(jìn)行依賴(lài)包安裝和調(diào)試,這里生成一個(gè) fun.yml 文件用于 fun install 安裝使用,內(nèi)容如下:
runtime: nodejs8 tasks: - shell: |-if [ ! -f /code/.fun/root/usr/lib/x86_64-linux-gnu/libstdc++.so.6 ]; thenmkdir -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.debbash -c 'for f in $(ls /code/.fun/tmp/archives/*.deb); do dpkg -x $f /code/.fun/root; done;'rm -rf /code/.fun/tmp/archivesfi - name: install couchbaseshell: npm install couchbasefun.yml中參數(shù)說(shuō)明:
- 前面的分析已經(jīng)了解到函數(shù)計(jì)算 nodejs8 runtime 的 libstdc++.so.6 的版本偏低,所以,我們找到一個(gè)更新的版本來(lái)支持,見(jiàn)新版本的 libstdc++.so.6 的 CXXABI_ 參數(shù):
執(zhí)行 fun install 命令
安裝各種第三方依賴(lài),顯示如下:
本地執(zhí)行情況
執(zhí)行?fun local invoke helloworld,可以看到執(zhí)行成功的效果:
$fun local invoke helloworld begin pullling image aliyunfc/runtime-nodejs8:1.4.0............................................................... pull image finishedpull 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' }發(fā)布上線
使用?fun deploy?發(fā)布上線,然后到控制臺(tái)執(zhí)行一下線上實(shí)際的運(yùn)行效果:
總結(jié)
fun install 功能能夠?qū)⒋a和依賴(lài)文件分離開(kāi),獨(dú)立安裝系統(tǒng)依賴(lài)文件,而且 fun local 和 fun deply 都能夠自動(dòng)幫你設(shè)置第三方庫(kù)的依賴(lài)引用路徑,讓您無(wú)需關(guān)心環(huán)境變量問(wèn)題。
本文的解法只是提供了一個(gè)對(duì)于系統(tǒng)版本偏低無(wú)法滿(mǎn)足用戶(hù)一些高級(jí)庫(kù)使用需求時(shí)的簡(jiǎn)單繞行方案,僅供參考,對(duì)于一些復(fù)雜的環(huán)境依賴(lài)問(wèn)題,可能還需要具體情況具體分析。
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的函数运行环境系统动态链接库版本太低?函数计算 fun 神助力分忧解难的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 基于智能家居场景的POALRDB性能体验
- 下一篇: WAF+SLB负载不均衡案例分享