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のインポートエラー対策についてでした。
色々調べてたのですが、なかなか答えをピンポイントで書いてある記事が
なかったので、すぐ書き起こしました。
誰かが救われることを願って・・・。
それでは!!
20代前半までは東京で音楽をやりながら両手の指以上の業種でアルバイト生活をしていましたが、某大手プロバイダのテレアポのバイトでPCの知識の無さに愕然とし、コンピュータをもっと知りたい!と思ったことをきっかけに25歳の時にITの世界に未経験で飛び込みました。
紆余曲折を経て、現在は個人事業主としてお仕事させていただいており、10年ほどになります。
web制作から企業システム構築、ツール開発など、フロントエンドもバックエンドもサーバーもDBAも依頼があれば何でもやってきた雑食系エンジニアです。
今風にいうとフルスタックエンジニアということになるのでしょうか??
→ 詳細プロフィールというか、生い立ちはこちら
→スキルシートをご覧になる場合はこちら
→お仕事のご依頼やお見積りなどお問い合わせはこちらから!
コメント