使用 .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 函數的圖層

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

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

重要

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

若要瞭解您正在使用的執行階段中包含哪個版本的適用於 Python (Boto3) 的 SDK,請參閱。包含執行階段的 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 命令會建立名為 my_deployment_package.zip 的 .zip 檔案,其中包含函數程式碼及其相依項。您可以將相依項直接安裝到專案目錄中的資料夾,也可以使用 Python 虛擬環境。

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

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

    mkdir package

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

  3. 在 package 目錄中安裝您的相依項。以下範例使用 pip 從 Python Package Index 安裝 Boto3 SDK。如果您的函數程式碼使用您自己建立的 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)
注意

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

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

from common import boto3

使用 __pycache__ 資料夾

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

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

如果您的函數只使用純 Python 套件和模組,您可以使用 pip install 命令在任何本機建置機器上安裝相依項,並建立 .zip 檔案。許多流行的 Python 庫(包括 NumPy 熊貓)都不是純粹的 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 執行個體,請參閱《適用於 Linux 執行個體的 Amazon EC2 使用者指南》中的教學課程:Amazon EC2 Linux 執行個體入門

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

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

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

Lambda 執行時間需有許可才能讀取部署套裝服務中的檔案。在 Linux 許可八進位標記法中,Lambda 需要 644 個許可 (rw-r--r--) 用於非可執行檔,以及 755 個許可 (rwxr-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. 選擇儲存

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

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

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

  4. 選擇 Amazon S3 位置

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

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

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

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

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

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

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

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

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

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

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

您可以使用 AWS CLI 建立新函數,或使用 .zip 檔案更新現有函數。使用 create-function 和 update-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)

  • 函數執行角色的 Amazon Resource Name (ARN) (--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=DOC-EXAMPLE-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 DOC-EXAMPLE-BUCKET --s3-key myFileName.zip --s3-object-version myObject Version

透過 Lambda API 使用 .zip 檔案建立及更新函數

若要使用 .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中的入門使用。

您也可以使用現有的 .zip 檔案封存 AWS SAM 來建立 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 內聯編寫的簡單函數。由於程式碼內嵌在 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中的。