使用 .zip 封存檔部署 Python Lambda 函數 - AWS Lambda

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 .zip 封存檔部署 Python Lambda 函數

AWS Lambda 函數的程式碼包含一個 .py 檔案,其中包含函數的處理常式程式碼,以及程式碼依賴的任何其他套件和模組。若要將此函數程式碼部署到 Lambda,您可以使用部署套件。此套件可以是 .zip 封存檔或容器映像。如需搭配 Python 使用容器映像檔的詳細資訊,請參閱使用容器映像部署 Python Lambda 函數

若要建立 .zip 封存檔的部署套件,您可以使用命令列工具的內建 .zip 封存檔公用程式,或任何其他 .zip 檔案公用程式 (例如 7zip)。以下各節顯示的範例假設您在 Linux 或 MacOS 環境中使用命令列 zip 工具。若要在 Windows 中使用相同命令,您可以安裝適用於 Linux 的 Windows 子系統,以取得 Ubuntu 和 Bash 的 Windows 整合版本。

請注意,Lambda 使用POSIX檔案許可,因此您可能需要在建立 .zip 檔案封存之前設定部署套件資料夾的許可

Python 中的執行期相依項

對於使用 Python 執行期的 Lambda 函數,相依項可以是任何 Python 套件或模組。使用 .zip 封存部署函數時,您可以使用函數程式碼將這些相依性新增至 .zip 檔案,或使用 Lambda 層 。 圖層是單獨的 .zip 檔案,可以包含其他程式碼和內容。若要進一步了解如何在 Python 中使用 Lambda 層,請參閱 使用 Python 函數的圖層

Lambda Python 執行期包含 AWS SDK for Python (Boto3) 及其相依性。Lambda 會在執行期SDK中提供 ,用於您無法新增自己的相依性之部署案例。這些案例包括使用內建程式碼編輯器在主控台中建立函數,或使用 AWS Serverless Application Model (AWS SAM) 或 AWS CloudFormation 範本中的內嵌函數。

Lambda 會定期更新 Python 執行期中的程式庫,以納入最新的更新和安全性修補程式。如果您的函數使用執行時間中SDK包含的 Boto3 版本,但您的部署套件包含SDK相依性,則可能會導致版本不一致問題。例如,您的部署套件可能包含SDK相依性 urllib3。當 Lambda 在執行階段SDK中更新 時,新版本的執行期與部署套件中的 urllib3 版本之間的相容性問題可能會導致您的函數失敗。

重要

為了保持對相依項的完全控制,並避免可能發生的版本不相容問題,建議您將函數的所有相依項新增至部署套件,即使這些相依項的版本包含在 Lambda 執行期中。這包括 Boto3 SDK。

若要了解您使用的執行階段中包含哪些版本的 SDK for Python (Boto3),請參閱 包含執行期的SDK版本

在 AWS  共同責任模式下,您負責管理函數部署套件中的任何相依項。這包括套用更新和安全性修補程式。若要更新函數部署套件中的相依項,請先建立新的 .zip 檔案,然後將其上傳至 Lambda。如需詳細資訊,請參閱 建立含相依項的 .zip 部署套件使用 .zip 檔案建立及更新 Python Lambda 函數

建立不含相依項的 .zip 部署套件

如果您的函數程式碼沒有相依項,則 .zip 檔案只會包含具有函數處理常式程式碼的 .py 檔案。使用您慣用的 zip 公用程式建立 .zip 檔案,並將 .py 檔案放在根目錄下。如果 .py 檔案不在 .zip 檔案的根目錄下,Lambda 將無法執行您的程式碼。

若要了解如何部署 .zip 檔案以建立新的 Lambda 函數或更新現有函數,請參閱使用 .zip 檔案建立及更新 Python Lambda 函數

建立含相依項的 .zip 部署套件

如果您的函數程式碼取決於其他套件或模組,您可以使用函數程式碼將這些相依性新增至 .zip 檔案,或使用 Lambda 層 。本節中的指示說明如何在 .zip 部署套件中包含相依項。若要讓 Lambda 執行程式碼,您必須將含有處理常式程式碼和所有函數相依性的 .py 檔案安裝在 .zip 檔案的根目錄。

假設您的函數代碼儲存在名為 lambda_function.py 的檔案中。下列範例CLI命令會建立名為 的 .zip 檔案,my_deployment_package.zip其中包含您的函數程式碼及其相依性。您可以將相依項直接安裝到專案目錄中的資料夾,也可以使用 Python 虛擬環境。

若要建立部署套件 (專案目錄)
  1. 導覽至包含 lambda_function.py 原始程式碼檔案的專案目錄。在此範例中,目錄名為 my_function

    cd my_function
  2. 建立名為 package 的新目錄,您將在其中安裝相依項。

    mkdir package

    請注意,對於 .zip 部署套件,Lambda 預期您的原始程式碼及其相依項全部位於 .zip 檔案的根目錄。不過,直接在專案目錄中安裝相依性可能會引入大量新檔案和資料夾,並使您IDE難以導覽。您可以在此處建立單獨的 package 目錄,將您的相依項與原始程式碼分開。

  3. 在 package 目錄中安裝您的相依項。以下範例使用 pip SDK 從 Python 套件索引安裝 Boto3。如果您的函數程式碼使用您自己建立的 Python 套件,請將其儲存在 package 目錄中。

    pip install --target ./package boto3
  4. 建立 .zip 檔案,將已安裝的程式庫放在根目錄下。

    cd package zip -r ../my_deployment_package.zip .

    這會在專案目錄中產生 my_deployment_package.zip 檔案。

  5. 將 lambda_function.py 檔案新增至 .zip 檔案的根目錄

    cd .. zip my_deployment_package.zip lambda_function.py

    您的 .zip 檔案應具有扁平的目錄結構,並將函數的處理常式程式碼和所有相依項資料夾安裝在根目錄下,如下所示。

    my_deployment_package.zip |- bin | |-jp.py |- boto3 | |-compat.py | |-data | |-docs ... |- lambda_function.py

    如果包含函數處理常式程式碼的 .py 檔案不在 .zip 檔案的根目錄下,Lambda 將無法執行您的程式碼。

若要建立部署套件 (虛擬環境)
  1. 在您的專案目錄中建立並啟用虛擬環境。在此範例中,專案目錄名為 my_function

    ~$ cd my_function ~/my_function$ python3.12 -m venv my_virtual_env ~/my_function$ source ./my_virtual_env/bin/activate
  2. 使用 pip 安裝所需的程式庫。下列範例會安裝 Boto3 SDK

    (my_virtual_env) ~/my_function$ pip install boto3
  3. 使用 pip show 在在虛擬環境中找出 pip 安裝相依項的位置。

    (my_virtual_env) ~/my_function$ pip show <package_name>

    pip 安裝程式庫的資料夾可以命名為 site-packages 或 dist-packages。此資料夾可以位於 lib/python3.x 或 lib64/python3.x 目錄下 (其中 python3.x 代表您所使用的 Python 版本)。

  4. 停用虛擬環境

    (my_virtual_env) ~/my_function$ deactivate
  5. 導覽至包含您使用 pip 所安裝相依項的目錄,在專案目錄中建立 .zip 檔案,並將安裝的相依項放在根目錄下。在此範例中,pip 已經在 my_virtual_env/lib/python3.12/site-packages 目錄中安裝了您的相依項。

    ~/my_function$ cd my_virtual_env/lib/python3.12/site-packages ~/my_function/my_virtual_env/lib/python3.12/site-packages$ zip -r ../../../../my_deployment_package.zip .
  6. 導覽至包含處理常式程式碼的 .py 檔案所在專案目錄的根目錄,並將該檔案新增至 .zip 套件的根目錄。在此範例中,您的函數程式碼檔案名稱為 lambda_function.py

    ~/my_function/my_virtual_env/lib/python3.12/site-packages$ cd ../../../../ ~/my_function$ zip my_deployment_package.zip lambda_function.py

相依項搜尋路徑和含執行期程式庫

當您在程式碼中使用 import 陳述式時,Python 執行期會在其搜尋路徑中搜尋目錄,直到找到模組或套件為止。依預設,執行期搜尋的第一個位置是 .zip 部署套件解壓縮並掛載的目錄 (/var/task)。如果您在部署套件中納入含執行期程式庫的版本,則您的版本的優先順序會高於執行期中包含的版本。部署套件中的相依項也優先於圖層中的相依項。

當您將相依項新增至層時,Lambda 會將其擷取到 /opt/python/lib/python3.x/site-packages(其中 python3.x 表示您所使用的執行期版本) 或 /opt/python。在搜尋路徑中,這些目錄的優先順序會高於包含含執行期程式庫和使用 pip 安裝的程式庫的目錄 (/var/runtime 和 /var/lang/lib/python3.x/site-packages)。因此,函數層中程式庫的優先順序高於執行期中包含的版本。

注意

在 Python 3.11 受管執行期和基礎映像中, AWS SDK及其相依性會安裝在 /var/lang/lib/python3.11/site-packages 目錄中。

您可以新增下列程式碼片段,以查看 Lambda 函數的完整搜尋路徑。

import sys search_path = sys.path print(search_path)
注意

由於部署套件或層中的相依性優先於包含執行期的程式庫,因此如果您在套件中包含SDK相依性,例如 urllib3,而不包含 SDK,則可能會導致版本不符問題。如果您部署自己的 Boto3 相依項版本,則還必須在部署套件中部署 Boto3 作為相依項。我們建議您封裝函數的所有相依項,即使其版本包含在執行期中。

您也可以在 .zip 套件內的個別資料夾中新增相依項。例如,您可以將 Boto3 的版本新增至名為 的 .zip 套件中的SDK資料夾common。解壓縮並掛載您的 .zip 套件時,此資料夾會放在 /var/task 目錄中。若要在程式碼中使用來自 .zip 部署套件中資料夾的相依項,請使用 import from 陳述式。例如,若要使用來自 .zip 套件中名為 common 的資料夾的 Boto3 版本,請使用下列陳述式。

from common import boto3

使用 __pycache__ 資料夾

我們建議您不要在函數的部署套件中包含 __pycache__ 資料夾。在架構或作業系統不同的建置機器上編譯的 Python 位元組程式碼可能與 Lambda 執行環境不相容。

建立含原生程式庫的 .zip 部署套件

如果您的函數只使用純 Python 套件和模組,您可以使用 pip install 命令在任何本機建置機器上安裝相依項,並建立 .zip 檔案。包括 NumPy 和 Pandas 在內的許多熱門 Python 程式庫都不是純 Python,且包含以 C 或 C++ 編寫的程式碼。將包含 C/C++ 程式碼的程式庫新增至部署套件時,必須正確建置套件,以確保套件與 Lambda 執行環境相容。

Python Package Index (PyPI)上提供的大多數套件都可以作為「wheel」(.whl 檔案)。.whl 檔案是一種ZIP檔案,其中包含具有特定作業系統和指令集架構之預先編譯二進位檔案的建置分佈。若要讓您的部署套件與 Lambda 相容,請安裝適用於 Linux 作業系統和您函數指令集架構的 wheel。

某些套件可能只能作為原始檔發佈。對於這些套件,您需要自行編譯和建置 C/C++ 元件。

若要查看所需套件可用的發佈,請執行以下操作:

  1. Python Package Index 主頁上搜尋套件名稱。

  2. 選擇您要使用的套件版本。

  3. 選擇下載檔案

使用內建發佈 (wheel)

若要下載與 Lambda 相容的 wheel,請使用 pip --platform 選項。

如果您的 Lambda 函數使用 x86_64 指令集架構,請執行下列 pip install 命令,在 package 目錄中安裝相容的 wheel。以您所使用的 Pytho 執行期版本取代 --python 3.x

pip install \ --platform manylinux2014_x86_64 \ --target=package \ --implementation cp \ --python-version 3.x \ --only-binary=:all: --upgrade \ <package_name>

如果您的函數使用 arm64 指令集架構,請執行下列命令。以您所使用的 Pytho 執行期版本取代 --python 3.x

pip install \ --platform manylinux2014_aarch64 \ --target=package \ --implementation cp \ --python-version 3.x \ --only-binary=:all: --upgrade \ <package_name>

使用原始檔發佈

如果您的套件只能作為原始檔發佈,則需要自行建置 C/C++ 程式庫。若要讓您的套件與 Lambda 執行環境相容,您需要在使用相同 Amazon Linux 2 作業系統的環境中建置套件。您可以在 Amazon EC2 Linux 執行個體中建置套件來執行此操作。

若要了解如何啟動並連線至 Amazon EC2 Linux 執行個體,請參閱 Amazon EC2 Linux 執行個體使用者指南 中的教學課程:開始使用 Amazon Linux 執行個體EC2

使用 .zip 檔案建立及更新 Python Lambda 函數

建立 .zip 部署套件之後,您可以使用它建立新的 Lambda 函數或更新現有的函數。您可以使用 Lambda 主控台、 AWS Command Line Interface和 Lambda 部署 .zip 套件API。您也可以使用 AWS Serverless Application Model  (AWS SAM) 和  AWS CloudFormation 建立並更新 Lambda 函數。

Lambda 的 .zip 部署套件大小上限為 250 MB (解壓縮)。請注意,此限制適用於您上傳的所有檔案 (包括任何 Lambda 層) 的大小總和。

Lambda 執行時間需有許可才能讀取部署套裝服務中的檔案。在 Linux 許可八進位表示法中,Lambda 需要 644 個不可執行檔案的許可 (rw-r--r--),以及 755 個目錄和可執行檔案的許可 (rwxr-xr-x)。

在 Linux 和 MacOS 中,使用 chmod 命令變更部署套件中檔案和目錄的檔案許可。例如,若要提供可執行檔正確的許可,請執行下列命令。

chmod 755 <filepath>

若要在 Windows 中變更檔案許可,請參閱 Microsoft Windows 文件的 Set, View, Change, or Remove Permissions on an Object

透過主控台使用 .zip 檔案建立及更新函數

若要建立新函數,您必須先在主控台中建立函數,然後上傳您的 .zip 封存檔。若要更新現有函數,請開啟函數的頁面,然後按照同樣的程序新增更新後的 .zip 檔案。

如果您的 .zip 檔案小於 50 MB,您可以透過直接從本機電腦上傳檔案來建立或更新函數。若 .zip 檔案大於 50 MB,您必須先將套件上傳至 Amazon S3 儲存貯體。如需如何使用 將檔案上傳至 Amazon S3 儲存貯體的指示 AWS Management Console,請參閱 Amazon S3 入門。若要使用 上傳檔案 AWS CLI,請參閱 AWS CLI 使用者指南 中的移動物件

注意

您無法變更現有函數的部署套件類型 (.zip 或容器映像)。例如,您無法將容器映像函數轉換為使用 .zip 檔案封存。您必須建立新的函數。

若要建立新的函數 (主控台)
  1. 開啟 Lambda 主控台的函數頁面,然後選擇建立函數

  2. 選擇 Author from scratch (從頭開始撰寫)。

  3. 基本資訊下,請執行下列動作:

    1. 函數名稱中輸入函數名稱。

    2. 執行期中選取要使用的執行期。

    3. (選用) 在架構中選擇要用於函數的指令集架構。預設架構值為 x86_64。請確定函數的 .zip 部署套件與您選取的指令集架構相容。

  4. (選用) 在 許可 下,展開 變更預設執行角色 。您可建立新的執行角色,或使用現有的角色。

  5. 選擇建立函數。Lambda 會使用您選擇的執行期建立一個基本的「Hello world」函數。

若要從本機電腦上傳 .zip 封存檔 (主控台)
  1. 在 Lambda 主控台的函數頁面中選擇要上傳 .zip 檔案的函數。

  2. 選取程式碼索引標籤。

  3. 程式碼來源窗格中選擇上傳來源

  4. 選擇 .zip 檔案

  5. 若要上傳 .zip 檔案,請執行下列操作:

    1. 選擇上傳,然後在檔案選擇器中選取您的 .zip 檔案。

    2. 選擇 Open (開啟)。

    3. 選擇 Save (儲存)。

若要從 Amazon S3 儲存貯體上傳 .zip 封存檔 (控制台)
  1. 在 Lambda 主控台的函數頁面中選擇要上傳新 .zip 檔案的函數。

  2. 選取程式碼索引標籤。

  3. 程式碼來源窗格中選擇上傳來源

  4. 選擇 Amazon S3 位置

  5. 貼上 .zip 檔案URL的 Amazon S3 連結,然後選擇儲存

使用主控台程式碼編輯器更新 .zip 檔案函數

對於某些具有 .zip 部署套件的函數,您可以使用 Lambda 主控台的內建程式碼編輯器直接更新函數程式碼。若要使用此功能,您的函數必須符合下列條件:

  • 您的函數必須使用其中一種轉譯語言執行期 (Python、Node.js 或 Ruby)

  • 函數的部署套件必須小於 3MB。

具有容器映像部署套件之函數的函數程式碼無法直接在主控台中編輯。

若要使用主控台程式碼編輯器更新函數程式碼
  1. 開啟 Lambda 主控台的函數頁面,然後選取您的函數。

  2. 選取程式碼索引標籤。

  3. 程式碼來源窗格中,選取您的原始程式碼檔案,然後在整合式程式碼編輯器中加以編輯。

  4. 完成編輯程式碼後,請選擇部署,以儲存變更並更新函數。

使用 使用 .zip 檔案建立和更新函數 AWS CLI

您可以使用 AWS CLI 建立新函數,或使用 .zip 檔案更新現有函數。使用 create-functionupdate-function-code 命令來部署 .zip 套件。如果您的 .zip 檔案小於 50 MB,則可以從本機建置電腦的檔案位置上傳 .zip 套件。若檔案較大,則必須先從 Amazon S3 儲存貯體上傳 .zip 套件。如需如何使用 將檔案上傳至 Amazon S3 儲存貯體的指示 AWS CLI,請參閱 AWS CLI 使用者指南 中的移動物件

注意

如果您使用 從 Amazon S3 儲存貯體上傳 .zip 檔案 AWS CLI,則該儲存貯體必須與您的 AWS 區域 函數位於相同位置。

若要使用具有 的 .zip 檔案建立新的函數 AWS CLI,您必須指定以下內容:

  • 函數名稱 (--function-name)

  • 函數的執行期 (--runtime)

  • 函數執行角色 (ARN) 的 Amazon Resource Name (--role

  • 函數程式碼中處理常式方法的名稱 (--handler)

您也必須指定 .zip 檔案的位置。如果您的 .zip 檔案位於本機建置電腦上的資料夾中,請使用 --zip-file 選項來指定檔案路徑,如下列範例命令所示。

aws lambda create-function --function-name myFunction \ --runtime python3.12 --handler lambda_function.lambda_handler \ --role arn:aws:iam::111122223333:role/service-role/my-lambda-role \ --zip-file fileb://myFunction.zip

若要在 Amazon S3 儲存貯體中指定 .zip 檔案的位置,請使用如下列範例命令所示的 --code 選項。您只需針對版本控制的物件使用 S3ObjectVersion 參數。

aws lambda create-function --function-name myFunction \ --runtime python3.12 --handler lambda_function.lambda_handler \ --role arn:aws:iam::111122223333:role/service-role/my-lambda-role \ --code S3Bucket=amzn-s3-demo-bucket,S3Key=myFileName.zip,S3ObjectVersion=myObjectVersion

若要使用 更新現有函數CLI,您可以使用 --function-name 參數指定函數的名稱。您也必須指定要用來更新函數程式碼的 .zip 檔案的位置。如果您的 .zip 檔案位於本機建置電腦上的資料夾中,請使用 --zip-file 選項來指定檔案路徑,如下列範例命令所示。

aws lambda update-function-code --function-name myFunction \ --zip-file fileb://myFunction.zip

若要在 Amazon S3 儲存貯體中指定 .zip 檔案的位置,請使用如下列範例命令所示的 --s3-bucket 和 --s3-key 選項。您只需針對版本控制的物件使用 --s3-object-version 參數。

aws lambda update-function-code --function-name myFunction \ --s3-bucket amzn-s3-demo-bucket --s3-key myFileName.zip --s3-object-version myObject Version

使用 Lambda 使用 .zip 檔案建立和更新函數 API

若要使用 .zip 檔案封存建立和更新函數,請使用下列API操作:

使用 .zip 檔案建立和更新函數 AWS SAM

AWS Serverless Application Model (AWS SAM) 是一種工具組,可協助簡化在 上建置和執行無伺服器應用程式的程序 AWS。您可以在 YAML或 JSON 範本中定義應用程式的資源,並使用 AWS SAM 命令列界面 (AWS SAM CLI) 來建置、封裝和部署應用程式。當您從 AWS SAM 範本建置 Lambda 函數時, AWS SAM 會自動使用函數程式碼和您指定的任何相依性建立 .zip 部署套件或容器映像。若要進一步了解如何使用 AWS SAM 建置和部署 Lambda 函數,請參閱 AWS Serverless Application Model 開發人員指南 中的入門 AWS SAM

您也可以使用 AWS SAM 來使用現有的 .zip 檔案封存來建立 Lambda 函數。若要使用 建立 Lambda 函數 AWS SAM,您可以將 .zip 檔案儲存在 Amazon S3 儲存貯體或建置機器的本機資料夾中。如需如何使用 將檔案上傳至 Amazon S3 儲存貯體的指示 AWS CLI,請參閱 AWS CLI 使用者指南 中的移動物件

在 AWS SAM 範本中,AWS::Serverless::Function資源會指定您的 Lambda 函數。在本資源中設定下列屬性,以使用 .zip 封存檔建立函數:

  • PackageType:設定為 Zip

  • CodeUri - 設定為函數程式碼的 Amazon S3 URI、本機資料夾的路徑或FunctionCode物件

  • Runtime:設定為所選執行期

使用 AWS SAM時,如果您的 .zip 檔案大於 50MB則不需要先將其上傳至 Amazon S3 儲存貯體。 AWS SAM 可以從本機建置機器的位置上傳 .zip 套件,最大允許大小為 250MB (解壓縮)。

若要進一步了解如何在 中使用 .zip 檔案部署函數 AWS SAM,請參閱 AWS SAM 開發人員指南 中的 AWS::Serverless::Function

使用 .zip 檔案建立和更新函數 AWS CloudFormation

您可以使用 AWS CloudFormation 來使用 .zip 檔案封存建立 Lambda 函數。若要使用 .zip 檔案建立 Lambda 函數,您必須先將檔案上傳至 Amazon S3 儲存貯體。如需如何使用 將檔案上傳至 Amazon S3 儲存貯體的指示 AWS CLI,請參閱 使用者指南中的移動物件AWS CLI

對於 Node.js 和 Python 執行期,您也可以在 AWS CloudFormation 範本中提供內嵌原始程式碼。 AWS CloudFormation 然後在建置函數時建立包含程式碼的 .zip 檔案。

使用現有的 .zip 檔案

在 AWS CloudFormation 範本中,AWS::Lambda::Function資源會指定您的 Lambda 函數。在本資源中設定下列屬性,以使用 .zip 封存檔建立函數:

  • PackageType:設定為 Zip

  • Code:在 S3Bucket 和 S3Key 欄位中輸入 Amazon S3 儲存貯體名稱和 .zip 檔案名稱。

  • Runtime:設定為所選執行期

從內嵌程式碼建立 .zip 檔案

您可以在 AWS CloudFormation 範本中宣告以 Python 或 Node.js inline 編寫的簡單函數。由於程式碼內嵌在 YAML或 中JSON,因此您無法將任何外部相依項目新增至部署套件。這表示您的函數必須使用執行期中包含的 AWS SDK版本。範本的要求,例如必須逸出某些字元,也使得 更難使用 IDE的語法檢查和程式碼完成功能。也就是說,您的範本可能需要進行其他測試。由於這些限制,宣告內嵌函數最適合不經常變更的非常簡單程式碼。

若要從 Node.js 和 Python 執行期的內嵌程式碼建立 .zip 檔案,請在範本的 AWS::Lambda::Function 資源中設定下列屬性:

  • PackageType:設定為 Zip

  • Code:在 ZipFile 欄位中輸入您的函數程式碼

  • Runtime:設定為所選執行期

AWS CloudFormation 產生的 .zip 檔案不得超過 4MB 。若要進一步了解如何在 中使用 .zip 檔案部署函數 AWS CloudFormation,請參閱 AWS CloudFormation 使用者指南 中的 AWS::Lambda::Function