AWS CloudShellでPython3.11互換のopencv-pythonのLambda Layerを作る

こんにちは、エンジニアの君島です。

 

AWS CloudShell便利ですよね。私はCLIを使う時には、ローカルよりもよく使っていると思います。

Lambda開発まわりでも使うことがあったので、試行錯誤した過程も含めて紹介します。

 

はじめに

2023年11月現在、AWS LambdaにおけるPythonの最新ランタイムは3.11になります。

Pyhon3.11でコードを書いていたところ、OpenCV-pythonが必要になったので、AWS CloudShellを使いながらLambda Layerを作ってみました。

いくつかのつまづきポイントがあったので、それも踏まえて手順を紹介していきます。

 

AWS CloudshellでPython3.11互換のopencv-pythonのLambda Layerを作る

AWS CloudShellにPython3.11をインストールする

CloudShellのOSや入っているPythonのバージョンを確認

2023年11月現在では、AWS CloudShellのOSはAmazon Linux2でデフォルトでPython3.7が入っています。

 

また、Extras LibraryではPython3.8まで上げることができるようです。

 

ただ、今回はPython3.11を使用したいので、手動で入れていきましょう。

 

AWS CloudShellにpyenvを使ってPython3.11.6をインストールする

pyenvというPython用のバージョン管理ツールを利用していきましょう。

 

正常に終了したら以下のような出力となるはずです。

 

ビルドとインストールが無事に完了したら、バージョンを切り替えて確認してみましょう。

pyenvは、CloudShellの永続的ストレージ上にgit cloneしているので、セッションが切れてもまた利用することができます。

 

つまづきポイント① opensslのバージョン要件

なお、Python3.10からOpenSSL1.1.1以上が要件となっています。

 

Amazon Linux2でバージョン指定せずにOpenSSLをインストールすると、バージョンは1.0.2kになってしまうため、この要件に満たしません。

そのため、このままビルドしてもModuleNotFoundErrorとなってしまいます。

 

OpenCV-pythonのLambdaレイヤーを作成する

Layer保存用のs3バケットを作成する

 

OpenCV-pythonをインストールする

 

requirements.txtを用意するやり方もありますが、スモールなLayerなので直接コマンドでインストールするモジュールを指定しました。

 

mesa-libGLのインストールと共有ライブラリの配置

opencv-pythonのLambda Layerを作る場合には必要な手順になります。

 

Lambda Layerを作成して登録する

 

このような出力になればLayerとして登録されています。

 

つまづきポイント② mesa-libGLの共有ライブラリ不足

mesa-libGLの作業を飛ばして、単にopencv-pythonだけを含むLayerを登録したLambdaを実行するとResponseは以下のようになってしまいます。

 

これは、libGL.so.1がLayerやLambdaの実行環境に存在しないからなので、Layerに含めてしまいましょう。

ただし、単に該当する共有ライブラリをいれるだけではなく、依存しているライブラリも同梱する必要があります。そこでlibGL.so.1の依存関係も調べてみましょう。

 

ただ、実際には上記のものだけでは足りなくて、libGL.so.1以外にもlibgthread-2.0.so.0とlibglib-2.0.so.0でもModuleNotFoundErrorが出てしまいました。

同じようにLayerに含めてあげる必要がありました。

 

AWS Lambdaにレイヤーを設定して実行してみる

実行する関数の用意

ランタイムを最新のPython3.11にした関数を用意します。

コードには、opencv-pythonをインポートした簡単な実装を施します。

 

この状態で関数を実行してもモジュールが見つかりません、というエラーになってしまいます。

 

レイヤーの設定

それでは、これまでに作成したレイヤーを関数に設定しましょう。

AWS Lambdaのコンソールからレイヤーとバージョンを指定してあげます。

 

その上で、関数を実行すれば、正常に終了して、ログにopencvのバージョン情報も記載されているのが分かります。

 

まとめ

AWS CloudShellでPython3.11互換のopencv-pythonのLambda Layerを作ってみました。

いくつかのつまづきポイントがありましたが、それらを乗り越えていく過程もご紹介しました。

 

念のため、Layer作成後のAWS CloudShellのストレージ状況を見ると80%強の使用状況で、まだ余裕がありました。

 

一方で、Layerの展開後のサイズはほぼ250MBなので、そちらの方がAWS Lambdaのクオータに引っかかる寸前でした。

 

なお、展開後のサイズが250MB以上の場合は、Layerを作成する際に以下のようなエラーとなってしまいます。

 

告知

カジュアル面談も実施中

ギークフィードではAWSエンジニアなどの職種で一緒に働く仲間を募集しています。

弊社に興味を持っていただいたり、会社のことをカジュアルに聞いてみたいという場合でも、ご気軽にフォームからお問い合わせください。その場合はコメント欄に、カジュアルにお話したいです、と記載ください!

採用情報はコチラ

 

2023 Advent Calendar開催します

ギークフィードでは今年もアドベントカレンダーを開催、及び参加します。

開催、あるいは社員が参加することが決まっているアドベントカレンダーを以下に列挙しておきます。

 

ギークフィード Advent Calendar 2023

ギークフィード主催のアドベントカレンダーです。スカイアーチHRソリューションズさんもご参加いただきます。

 

Amazon Connect Advent Calendar 2023

Amazon Connectにフォーカスしたアドベントカレンダーです。昨年に引き続きクラスメソッドさんと共催です。スカイアーチHRソリューションズさんもご参加いただきます。

 

Japan AWS Ambassadors Advent Calendar 2023

Japan AWS Ambassadorsによるアドベントカレンダーです。

 

Japan AWS Jr. Champions Advent Calendar 2023

Japan AWS Jr.Championsによるアドベントカレンダーです。

 

この記事が気に入ったら
いいね ! しよう

Twitter で
The following two tabs change content below.
君島翔
君島翔
AI事業部事業部長株式会社ギークフィード
Java, .NET系の言語が得意。Laravelも使います。 エディタはvim派。 自分が楽するためにテストやビルド、デプロイを自動化させたい。 2022-2023 AWS Ambassador / 2022-2023 Japan AWS Top Engineer / 2022-2023 Japan AWS ALL Certifications Engineer

【採用情報】一緒に働く仲間を募集しています

採用情報
ページトップへ