函數運行環境系統動態連接庫版本過低?函數計算 fun 神助力分憂解難

背景

最近在處理線上工單的時候,遇到一個用戶使用 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中參數說明:

  • 前面的分析已經瞭解到函數計算 nodejs8 runtime 的 libstdc++.so.6 的版本偏低,因此,咱們找到一個更新的版本來支持,見新版本的 libstdc++.so.6 的 CXXABI_ 參數:
$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)



本文做者:清宵

閱讀原文

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索