如何解決在 Python 中執行 Lambda 程式碼時收到的 "Unable to import module" 錯誤?

2 分的閱讀內容
0

當我嘗試在 Python 中執行 AWS Lambda 程式碼時,收到 "Unable to import module" 錯誤。

簡短描述

當 AWS Lambda 環境在 Lambda 部署套件中找不到指定的程式庫時,您會收到 "Unable to import module" 錯誤。

若要解決此錯誤,請建立包含所有必要程式庫的部署套件。或者,使用所需程式庫建立 Lambda 圖層,並將其連接至 Lambda 函數。Lambda 圖層方法可讓您在多個 Lambda 函數中重複使用此圖層。

解決方法

建立 Lambda 圖層以連接至多個 Lambda 函數

**注意:**建立 Lambda 圖層時,將程式庫放在 /pythonpython/lib/python3.x/site-packages 資料夾中。最佳實務是在 Lambda 執行期所依據的相同作業系統 (OS) 上建立 Lambda 圖層。例如,Python 3.12 基於 Amazon Linux 2023 Amazon Machine Image (AMI)。因此,在 Amazon Linux 2023 作業系統上建立圖層。

如果您的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體無權透過 PublishLayerVersion API 呼叫上傳 Lambda 圖層,請執行步驟 1-3。如果您的執行個體已具有許可,請繼續執行步驟 4。

  1. 使用 Amazon EC2 主控台建立具有 Amazon Linux 2023 AMI 的執行個體。或者,使用 AWS Cloud9 主控台

  2. 建立 AWS Identity and Access Management (IAM) 政策,以授予呼叫 PublishLayerVersion API 操作的許可。
    IAM 政策陳述式範例:

    {
     "Version": "2012-10-17",
     "Statement": [
     {
     "Sid": "VisualEditor0",
     "Effect": "Allow",
     "Action": "lambda:PublishLayerVersion",
     "Resource": "*"
     }
     ]
    }
  3. 建立 IAM 角色,然後將 IAM 政策連接至此角色。

  4. 將 IAM 角色連接至執行個體。

  5. 連線至您的執行個體Cloud9 環境

  6. 執行下列命令以建立新資料夾,並使用 pip 來安裝名為 "numpy" 的程式庫:

    mkdir -p lambda-layer/python
    cd lambda-layer/python
    pip3 install --platform manylinux2014_x86_64 --target . --python-version 3.12 --only-binary=:all: numpy

    注意:更新您的函數類型的平台參數。對於 x86_64 Lambda 函數,將值設定為 manylinux2014_x86_64。對於 arm64 函數,將值設定為 manylinux2014_aarch64。將 python-version 參數更新為 Lambda 函數使用的相同版本。

  7. 執行下列命令以將 python 資料夾的內容壓縮到 layer.zip 檔案:

    cd ..
    zip -r layer.zip python

    執行下列命令以發佈 Lambda 圖層:

    aws lambda publish-layer-version --layer-name numpy-layer --zip-file fileb://layer.zip --compatible-runtimes python3.12 --region us-east-1

    **注意:**將 us-east-1 取代為 Lambda 函數的 AWS 區域。

  8. 將圖層新增至您的 Lambda 函數。

  9. 若要測試 Lambda 函數,請匯入套件並列印版本。
    成功輸出的範例:

    import json
    import numpy
    
    
    def lambda_handler(event, context):
     print(numpy.__version__)
     return {
     'statusCode': 200,
     'body': json.dumps('Hello from Lambda!')
     }	
AWS 官方
AWS 官方已更新 4 個月前