🅰️

AWS Lambda Pythonランタイム更新したらRuntime.ImportModuleErrorで動作しなくなった

2024/02/18に公開

状況

AWS Lambda(以下 Lambda) のPython3.7ランタイムサポートの非推奨化 (フェーズ 1)が2023年11月27日までという事で、AWSコンソール上でPython3.11に更新して動作検証すると、

[ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': No module named 'psycopg2._psycopg'

が発生しました。
前任者が突如居なくなって、業務の整理もできていない状態だったので、このLambdaの存在自体AWSからの通知で気付いたような感じでした。
とりあえず色々調査開始です。

結論

Lambdaで利用しているDB接続ライブラリawslambda-psycopg2がPython3.7専用で、LambdaのPythonランタイムバージョンに合わせたパッケージに変更してあげないといけませんでした。

これは私の環境に合った方法ですが、通常のpsycopg2のライブラリをレイヤーに登録して利用する方法もあるようです。

レイヤー構成に変更するとバージョンを意識しなくても、とりあえず動作するようにはできるのかな?今度試してみよう。(完璧に放置は無理だろうけど...)

変更方法は以下に詳しく書いておこうと思いますが、本当に入れ替えるだけでした。

https://github.com/jkehler/awslambda-psycopg2/tree/master

手順

余計な手順も含まれますが、一緒の環境だった場合に役に立つと思うので記述していきます。

  1. 更新対象のLambdaのソースコードをダウンロードする
  2. ライブラリをクローンする
  3. パッケージを入れ替える
  4. Lambdaにアップロードするためにzip化する
  5. 更新対象のLambdaにソースコードをアップロードする
  6. 動作検証

では、それぞれの詳細を・・・

1. 更新対象のLambdaのソースコードをダウンロードする

以下画像の箇所からダウンロードできます。
私の場合、対象プロジェクトは前任者の端末で管理されていたみたいです。
zipでダウンロードできるので、解凍して利用します。

2. ライブラリをクローンする

以下のリンクからクローンしましょう。
https://github.com/jkehler/awslambda-psycopg2/tree/master
この対応をしようとしている人ならクローン方法は大丈夫だと思っている。
もし分からなかったら「GitHub Clone 方法」で検索。

3. パッケージを入れ替える

先程Lambdaから取得したプロジェクトに存在するパッケージとクローンしたライブラリに含まれるパッケージを入れ替えます。
今回私の場合は、

  1. プロジェクトのpsycopg2というディレクトリを削除して
  2. クローンしたライブラリに含まれているpsycopg2-3.9をプロジェクトにコピーして
  3. psycopg2-3.9という名前からpsycopg2という名前に変更した ※変更したいバージョンに合わせて下さい。

4. Lambdaにアップロードするためにzip化する

この作業をプロジェクト下で作業している場合のサンプルコードを記述しておく。
zip化する際に、プロジェクト/プロジェクト/ソースコード みたいな感じになって悲しくなった。

% zip -r ProjectName .

5. 更新対象のLambdaにソースコードをアップロードする

AWSコンソール上で実施します。
コマンドで行う方法もまた調べておこうかな。

6. 動作検証

私はAWSコンソール上にあります「テスト」ボタンで検証しました。
異常が出た時の操作をしてみて下さい。
解消していれば幸いです。

最後に

以上です。
初めての取り組みで調査対応まで時間がかかりました。
こういう経験を経て自分が開発する時はどんな情報を残しておくと役に立つのか分かってきて良い経験になったと思いました。

Discussion