サイトアイコン たーちゃんの「ゼロよりはいくらかましな」

【sls】【python】【Mac】lambdaでimportエラー(cannot import name ‘etree’ from ‘lxml’)の回避

serverless frameworkにてdeployしたlambdaを実行したところ、

Unable to import module 'モジュール名': cannot import name 'etree' from 'lxml'

 

こんなものが・・・。

環境はMacで行っていて、

serverless frameworkのpluginとしてserverless-python-requirementsを使用しています。

 

packageされたものにはしっかり入っているのになぜ?

ということで調査し、解決しましたので共有です。

 

 

 

 

 

 

 

 

原因

lxmlはどうやらC拡張ライブラリのよう。(こちら公式?)

Mac側でpip installしたlxmlライブラリは、

OSの違いからそのままlambdaでは使用できないよう。

※lambdaはサーバーレスですが実行環境はAmazon Linux(だったはず!)

 

 

 

回避策

serverless.yamlのpluginの設定で、

Amazon Linuxのdocker imageを使用しpackageさせるとうまくいきました。

 

 

とはいえ、何も難しいことはなく、

もともとplugnに備わっている機能を使用するというだけです。

 

custom:
  pythonRequirements:
    cacheLocation: ".static_cache"
    dockerizePip: true

 

ポイントはdockerizePip: trueですね。

cacheLocationはダウンロードしたライブラリのキャッシュ領域で、

ここに残っていると、dockerizePipを追記してもキャッシュが

先に利用されてうまく動作しませんでした。

 

 

そのため、今後のキャッシュクリアなどのやりやすさなんかを加味して、

ルートにcache_locationを改めて設定したという感じです。

 

 

ともあれ、これでバッチリ動作することが確認できました。

めでたしめでたし。

 

 

まとめ

今回はlambdaのインポートエラー対策についてでした。

色々調べてたのですが、なかなか答えをピンポイントで書いてある記事が

なかったので、すぐ書き起こしました。

誰かが救われることを願って・・・。

 

 

それでは!!

 

 


にほんブログ村


人気ブログランキング

モバイルバージョンを終了