YuuN0808
@YuuN0808 (YuuN)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

AWS Lambdaにコードをアップするとライブラリがインポートされない

解決したいこと

AWSLambdaでMessagingAPIを利用してlinebotを作成しようと考えています。
コードとライブラリをまとめたzipファイルをアップロードして、検証したところライブラリがインポートされないというエラーが発生しました。

何が原因かはっきりせず、解決策をわからない初心者のためご教授いただければ幸いです。

発生している問題・エラー

ログには以下のエラーが入っていました。

INIT_REPORT Init Duration: 182.98 ms	Phase: init	Status: error	Error Type: Runtime.ImportModuleErro

インポートしたモジュール

import os
import openai
import requests
import json
from bs4 import BeautifulSoup
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage

考えられる原因

ライブラリをpipでインストールしてzipファイルでlambdaにアップロードする方法で行っています。
ライブラリをインストールする際に、linebotとopenaiの一部のライブラリで適応しているバージョンが食い違っているとのエラーが出たのが大きな原因?かなと考えています。
zipでアップロードするのではなく、openaiのそれ以外でレイヤーで分けてアップロードしても同様にモジュールがインポートされなかったので、共通するライブラリのバージョンを統一する必要があるのでしょうか?

原因があっているかも、やり方もわからず困っているためどうかお力添え願います、、、、、

0

2Answer

以下内容で試した限り、ライブラリも問題なく認識されておりました。

前提

Python Version:Python 3.10.12
Pip Version:22.0.2

1. ライブラリ作成

mkdir -p lambda_layer/python
pip3 install openai requests beautifulsoup4 line-bot-sdk -t lambda_layer/python 
cd lambda_layer/
zip -r ../lambda_layer.zip .

作成したライブラリが10MBを超えていたのでS3にアップ

2. レイヤー作成

以下のような形でレイヤーを作成します。
image.png

3. 関数作成

image.png

4. 以下コードでテスト

import json
import pkg_resources
import requests
from bs4 import BeautifulSoup
from linebot import LineBotApi
from linebot.models import TextSendMessage

def lambda_handler(event, context):
    packages = ["openai", "requests", "beautifulsoup4", "line-bot-sdk"]
    versions = {}

    for package in packages:
        try:
            versions[package] = pkg_resources.get_distribution(package).version
            print(f"{package} version: {versions[package]}")
            
        except pkg_resources.DistributionNotFound:
            versions[package] = "Not Found"
            
    try:
        response = requests.get("https://www.google.com")
        status_code = response.status_code
        
        soup = BeautifulSoup(response.text, "html.parser")
        title = soup.title.string if soup.title else "No Title"

        return {
            "statusCode": 200,
            "body": json.dumps({
                "message": "Lambda Layer Test Successful!",
                "status_code": status_code,
                "title": title
            })
        }
    except Exception as e:
        return {
            "statusCode": 500,
            "body": json.dumps({"error": str(e)})
        }

テストログ
image.png

image.png

0Like

Comments

  1. @YuuN0808

    Questioner

    回答ありがとうございます。返信遅くなり申し訳ございません。

    回答していただいた手順とテストコードで実行したところ私のほうでも問題なく実行できました。
    ただテストコード内にopenaiのライブラリがインポートされてないためそこを付け加えたところ同様のエラーが出現しました。openaiのライブラリが何か悪さしてそうだな、、と気づけたのですが原因わからず、、、、

    何かお分かりだったりしますか、、、?

    追記:ローカルで同様の条件(pythonとライブラリのバージョンは同じ)で実行すると問題なく動かせるので、アップロードの問題のような気はしています。

  2. @YuuNo0808さん
    ご連絡ありがとうございます。

    ただテストコード内にopenaiのライブラリがインポートされてないためそこを付け加え ところ同様のエラーが出現しました。

    大変失礼しました。こちらで改めてopenaiをインポートした形でテストコードを実行しましたが、こちらではエラーはでませんでした。

    import json
    import openai
    import pkg_resources
    import requests
    from bs4 import BeautifulSoup
    from linebot import LineBotApi
    from linebot.models import TextSendMessage
    
    def lambda_handler(event, context):
        packages = ["openai", "requests", "beautifulsoup4", "line-bot-sdk"]
        versions = {}
    
        for package in packages:
            try:
                versions[package] = pkg_resources.get_distribution(package).version
                print(f"{package} version: {versions[package]}")
                
            except pkg_resources.DistributionNotFound:
                versions[package] = "Not Found"
                
        try:
            response = requests.get("https://www.google.com")
            status_code = response.status_code
            
            soup = BeautifulSoup(response.text, "html.parser")
            title = soup.title.string if soup.title else "No Title"
    
            return {
                "statusCode": 200,
                "body": json.dumps({
                    "message": "Lambda Layer Test Successful!",
                    "status_code": status_code,
                    "title": title
                })
            }
        except Exception as e:
            return {
                "statusCode": 500,
                "body": json.dumps({"error": str(e)})
            }
    
    

    image.png

    image.png

    追記:ローカルで同様の条件(pythonとライブラリのバージョンは同じ)で実行すると問題なく動かせるので、アップロードの問題のような気はしています。

    S3にアップする形で実行していただいている感じですね?
    レイヤー作成時の互換性のあるアーキテクチャがx86_64ではなくarm64になっていたケースで同事象が発生したことはあるのですが、こちらはx86_64になっていますよね?

    作成いただいたzipファイルをいただければこちらでも確認ができるのですが・・・・Qiitaにはファイルをアップする機能がないとおもいますので、その際は X のDMを頂けると助かります。

返信ありがとうございます。

確認したのですが、x86_64になっていました。(正確にはどちらも互換性のあるアーキテクチャに追加していました。)
一点伺いたいのですが、ライブラリをローカルにインストールする際、バージョンの違いに関する警告などは出ていますでしょうか?その関係でちゃんとインストールされてない可能性などありますかね?
また、Windowsのためコマンドプロンプトでzipコマンドが使えず、pythonでzipファイル化しているのですがこのコードが間違っているのかもしれない?です、、、

0Like

Comments

  1. @YuuNo0808さん

    失礼しました。Windows環境だったのですね。
    以下方法でもzipは作成できるみたいです。

    cd .\lambda_layer\python\
    pip install openai requests beautifulsoup4 line-bot-sdk -t .   
    Compress-Archive -Path . -DestinationPath ..\..\lambda_layer.zip
    

    これでもNGの場合、dockerが利用できればLinuxコンテナ上でzipファイルを作成したほうが、早いかもしれません。

    ※Linuxで作成したzipファイルを以下に置いておきますね。

  2. @YuuN0808

    Questioner

    返信遅くなり申し訳ありません。

    ご丁寧にありがとうございます。アップロードしていただいたzipファイルをダウンロードして、同様にS3経由でレイヤー設定したところ同様のエラーが出ました、、、
    (openaiのライブラリのインポートを消すとうまくいきます)

  3. ご連絡ありがとうございます。

    確認したのですが、x86_64になっていました。(正確にはどちらも互換性のあるアーキテクチャに追加していました。)

    ためしに、x86_64だけにしても変わらないでしょうか? Pythonのバージョンは3.10で作成されていますでしょうか?

    こちらで、確認した限りではレイヤー作成時に互換性のあるバージョンに3.10と3.11を選択させて作成し、関数作成時にランタイムを3.11にすると確かにopenaiをimportすると以下エラーがでていました。

    INIT_REPORT Init Duration: 211.67 ms Phase: init Status: error Error Type: Runtime.ImportModuleError
    [ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': No module named 'pydantic_core._pydantic_core' Traceback (most recent call last):
    

    ※openaiをコメントにするとうまく動くので、完全にこの事象の様な気がしますが。

    表示されているerrorはこれではないでしょうか?もしそうなら、関数のランタイムを3.10(作り直し)すれば解消すると思います。

  4. @YuuN0808

    Questioner

    pythonのランタイムは複数入れてしまっていました!!
    ありがとうございます、確認します!

  5. @YuuN0808

    Questioner

    真摯に対応していただきありがとうございます(´;ω;`)

    image.png

    こちらのレイヤーを設定して実行したところ同様に以下のエラーが出ました、、、

    image.png

    zipファイルもアップロードしていただいたものなので、バージョンは問題ないかと思うのですが、なぜなのでしょうか、、、?

  6. 念の為、確認ですが、「こちらから提示した手順通りすべてやり直しされている」でお間違い無いでしょうか?

    解消できていないのは、謎ですが些細な違いからくる可能性もあるため、これ以上はZoomとかで画面見ながらでないと厳しいですね。。。
    ※色々思われた上でだと思いますが、エラーログもすべて記載されてないですよね?

    できれば、X をフォローいただき、DMでやり取り出来ませんか?
    ※もし、不要であれば誠に残念ではありますが、その旨お伝えくださいませ。

  7. @YuuN0808

    Questioner

    ありがとうございます。
    改めて1度はじめからやり直してみます。その上で、やはりできなかったらまたご連絡させていただいてもよろしいでしょうか?
    ぜひXのDMでやり取りしていただけると大変助かります。

  8. @YuuN0808

    Questioner

    改めてインストールから行うと、初めに原因かな?と思ったエラーが同じく出たので共有させていただきます。nw-engineerさんはインストール時こちらのエラーは見られないでしょうか?

    ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
    jupyter-server 1.13.5 requires anyio<4,>=3.1.0, but you have anyio 4.8.0 which is incompatible.
    jupyter-server 1.13.5 requires pywinpty<2; os_name == "nt", but you have pywinpty 2.0.2 which is incompatible.
    botocore 1.24.32 requires urllib3<1.27,>=1.25.4, but you have urllib3 2.3.0 which is incompatible.
    astroid 2.6.6 requires wrapt<1.13,>=1.11, but you have wrapt 1.17.2 which is incompatible.
    

    依存している1部ライブラリのバージョンが競合していてダメだよ、みたいな理由だと思っているのですが、関係ありますかね?

  9. 私の環境ではでてないですね。。。すみません。windows環境でレイヤー作成はせずに、Amazon Linux2023を使ってやっているので。。。

    競合しているなら、venを利用された方が、いいような気がします。

    python -m venv layer
    source layer\Scripts\activate
    pip install xxxx -t .
    
  10. @YuuN0808

    Questioner

    なるほど、仮想環境ですかね?そういった手法もあるのですね。
    勉強になります、ありがとうございます。

    ただいま海外旅行に来ており、プログラム動かせない状態なので帰国してから試してみます!m(_ _)m

  11. あらあら、そうだったんですね😊
    快適な旅行をお過ごしください!

Your answer might help someone💌