先日、Lambdaでparamiko(ssh等のライブラリ)を使用しようとした際に、”invalid ELF header”が発生しました。
さっくりと調べて対応しましたので、「詳しいことは分からないけど動けばOK」ぐらいの方は参考にしてください。
まず結論
まず結論を述べておきます。
- エラー理由: Lambdaの環境とライブラリをインストールした環境が異なると起きる
- 対処法1: Dockerで仮想環境を作ってライブラリをインストールする
- 対処法2: EC2で環境を作ってライブラリをインストールする
という感じです。
EC2で環境を作るのは骨が折れるため、今回は対処法1のDockerを使う方法で作成しました。
EC2で環境を作る方の手順は記載していませんのでご承知おきください。
このエラーは何?
“invalid ELF header”は、ライブラリをインストールした環境とLambdaの環境が異なる場合に起きることがあるようです。
LambdaはAmazon LinuxというOSのなんですが、それをMacOSなどの環境からインストールしてきたライブラリをアップロードすると、齟齬が生じて動かなくなります。
これは全てのライブラリで起きる現象ではないようで、今回はparamikoを入れる際に現象が発生しました。
Dockerで仮想環境を作ってライブラリをインストールする
このエラーに見舞われる方はおそらくDockerでLambdaを開発する環境を作っていないことと思います。
この機会に開発環境を整えるのもありだと思いますが、それはいずれ別記事で記載いたします。
「ごたくは良いから早くしろ」と思われる前に、早速対処手順を記載いたします。
- Dockerを入れる
- Lambda環境を作る
- ライブラリをインストールする
- パッケージ化してアップロードしたら動く
という感じです。
Dockerを入れる
まずはDockerを入れて、dockerコマンドを実行できるようにします。
お金かかりそうな雰囲気がありますが、本記事執筆時点では一定以上の社員数に満たない企業や個人は無料で使用できるので心配ご無用です。
Lambda環境を作る&ライブラリをインストールする
Dockerを入れたらあとは単純作業。
まずは普段使っているターミナルで環境を作りたいディレクトリに移動します。
その後、以下を実行します。
今回はPython3.9で、かつLambdaのレイヤーにparamikoを入れる想定で実行しています。
$ docker run --rm -v $(pwd):/var/task amazon/aws-sam-cli-build-image-python3.9:latest \
> pip install paramiko -t python/lib/python3.9/site-packages/
これで環境のできあがりです。
Pythonのバージョンと pipで指定するディレクトリだけ、それぞれの目的に応じて変える必要があるかと思います。
パッケージ化してアップロードしたら動く
$ zip -r paramiko.zip python
これで作成されたZipファイルをLambdaにアップロードすれば完了です。