如何解決在 Python 中執行 Lambda 程式碼時收到的「無法匯入模組」錯誤?

2 分的閱讀內容
0

當我嘗試在 Python 中執行 AWS Lambda 程式碼時,收到「無法匯入模組」錯誤。

簡短描述

當您的 Lambda 環境無法在 Python 程式碼中找到指定的程式庫時,通常會收到此錯誤訊息。這是因為 Lambda 並未與所有 Python 函式庫一起預先封裝。

若要解決這個問題,請建立部署套件或 Lambda 層,其中包含您要在 Lambda 的 Python 程式碼中使用的程式庫。

**重要事項:**確保您將為 Python 匯入的程式庫放入 /python 資料夾。

解決方法

**注意:**下列步驟說明如何建立 Lambda 層而非部署套件。這是因為您可以在多個 Lambda 函式中重複使用 Lambda 層。每個 Lambda 執行期會在 PATH 變數所參考的 /opt 目錄中新增特定資料夾。如果圖層使用相同的資料夾結構,則 Lambda 函數的程式碼無需指定路徑即可存取圖層內容。

最佳做法是在 Lambda 執行期所依據的相同作業系統上建立 Lambda 圖層。例如,Python 3.8 是基於 Amazon Linux 2 Amazon Machine Image (AMI)。但是,Python 3.7 和 Python 3.6 是基於 Amazon Linux AMI。

若要為 Python 3.8 庫建立 Lambda 圖層,請執行以下操作:

**注意:**步驟 1-3 是可選的。

  1. AWS Cloud9 主控台中,使用 Amazon Linux 2 AMI 建立一個 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體。如需指示,請參閱 AWS Cloud9 使用者指南中的建立 EC2 環境

  2. 建立 AWS 身份和存取管理 (IAM) 政策,以授予調用 PublishLayerVersion API 作業的權限。

授予調用 PublishLayerVersion API 作業之權限的 IAM 政策陳述式範例

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": "lambda:PublishLayerVersion",
      "Resource": "*"
    }
  ]
}

3.    建立 IAM 角色,並將 IAM 政策附加到該角色。然後,將 IAM 角色附加到 Amazon EC2 執行個體

**注意:**您的 EC2 執行個體現在具有為 PublishLayerVersion API 調用上傳 Lambda 圖層的權限。

4.    開啟 AWS Cloud9 Amazon EC2 環境。然後,執行下列命令來安裝 Python 3.8 和 pip3:

$ sudo amazon-linux-extras install python3.8
$ curl -O https://bootstrap.pypa.io/get-pip.py
$ python3.8 get-pip.py --user

5.    執行下列命令以建立 python 資料夾:

$ mkdir python

6.    執行下列命令將 Pandas 庫檔案安裝到 python 資料夾:

**重要事項:**使用您要匯入的 Python 庫之名稱替換 Pandas

$ python3.8 -m pip install pandas -t python/

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

$ zip -r layer.zip python

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

**重要事項:**將 us-east-1 替換為 Lambda 函數所在的 AWS 區域。

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

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


相關資訊

如何對上傳 Lambda 部署套件時的「權限被拒絕」或「無法匯入模組」錯誤進行疑難排解?

AWS 官方
AWS 官方已更新 1 年前