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

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

注意

自 2022 年 7 月 18 日起終止對 Python 3.6 執行時間的支援。如需詳細資訊,請參閱 執行時間淘汰政策

您的 AWS Lambda 函數的程式碼由指令碼或編譯程式及其相依項所組成。使用部署套件將函數程式碼部署到 Lambda。Lambda 支援兩種類型的部署套件:容器映像和 .zip 封存檔。

若要建立 .zip 存檔檔案的部署套件,您可以為命令列工具使用內建 .zip 檔案封存公用程式或任何其他 .zip 檔案公用程式 (例如 7zip)。請注意使用 .zip 檔案作為部署套件的下列需求:

  • .zip 檔案必須包含函數程式碼和用於在 Lambda 上執行函數程式碼 (如果適用) 的任何相依性。如果您的函數僅依賴於標準程式庫或 AWS 開發套件程式庫,則不需要在 .zip 檔案中包含這些程式庫。這些程式庫包含支援的 Lambda 執行時間環境。

  • 如果 .zip 檔案大於 50 MB,建議您將檔案從 Amazon Simple Storage Service (Amazon S3) 儲存貯體上傳至您的函數。

  • 如果您的部署套件包含原生程式庫,您可以使用 AWS Serverless Application Model(AWS SAM)。您可以將 AWS SAM CLI sam build 命令搭配 --use-container 使用來建立您的部署套件。此選項會在與 Lambda 執行環境相容的 Docker 映像內建置部署套件。

    如需詳細資訊,請參閱 AWS Serverless Application Model 開發人員指南中的 sam 建置

  • 您需要建置要與函數的這個指令集架構相容的部署套件。

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

注意

python 套件可能包含 __init__.py 檔案中的初始化程式碼。在 Python 3.9 之前,Lambda 並未針對函數處理常式目錄或父目錄中的套件執行 __init__.py 程式碼。在 Python 3.9 及更高版本中,Lambda 會在初始化期間針對這些目錄中的套件執行初始化程式碼。

請注意,Lambda 只會在第一次初始化執行環境時執行初始化程式碼,而不是針對初始化環境中的每個函數。

先決條件

您需要 AWS Command Line Interface (AWS CLI) 來呼叫服務 API 操作。若要安裝或升級 AWS CLI,請參閱《AWS Command Line Interface 使用者指南》中的安裝 AWS CLI

什麼是執行時間相依性?

建立或更新具有或不具有執行時間相依性的 Lambda 函數需要部署套件。部署套件充當原始碼套件來執行 Lambda 上函數的程式碼和相依性 (如果適用)。

相依性可以是任何套件、模組或其他組件相依性,它不包含在函數程式碼的 Lambda 執行時間環境中。

下面描述了沒有執行時間相依性的 Lambda 函數:

  • 如果您的函數程式碼是 Python 3.8 或更高版本,並且它只取決於標準 Python 數學和日誌記錄程式庫,則不需要將程式庫包含在 .zip 檔案中。Python 執行時間包含這些程式庫。

  • 如果您的函數程式碼依賴於 AWS SDK for Python (Boto3),則不需要在 .zip 檔案中包含 boto3 程式庫。Python3.8 和更高版本的執行時間包含這些程式庫。

注意:Lambda 會定期更新 Boto3 程式庫,以啟用最新的一組功能與安全更新。若要完全掌控您函式所使用的相依性,請利用部署套件封裝您的所有相依性。

部署沒有相依性的套件

為您的部署套件建立 .zip 檔案。

建立部署套件

  1. 開啟命令提示字元並建立 my-math-function 專案目錄。例如,在 macOS 上:

    mkdir my-math-function
  2. 導覽至 my-math-function 專案目錄。

    cd my-math-function
  3. 從 GitHub 複製範例 Python 程式碼的內容,並將其儲存在名為 lambda_function.py 的新檔案中。您的目錄結構看起來應該會這樣:

    my-math-function$ | lambda_function.py
  4. lambda_function.py 檔案新增至 .zip 檔案的根目錄。

    zip my-deployment-package.zip lambda_function.py

    這會在專案目錄中產生 my-deployment-package.zip 檔案。該命令會產生以下的輸出:

    adding: lambda_function.py (deflated 50%)

部署具有相依性的套件

為您的部署套件建立 .zip 檔案。

建立部署套件

  1. 開啟命令提示字元並建立 my-sourcecode-function 專案目錄。例如,在 macOS 上:

    mkdir my-sourcecode-function
  2. 導覽至 my-sourcecode-function 專案目錄。

    cd my-sourcecode-function
  3. 複製下列範例 Python 程式碼的內容,並將其儲存在名為 lambda_function.py 的新檔案中:

    import requests def lambda_handler(event, context): response = requests.get("https://www.example.com/") print(response.text) return response.text

    您的目錄結構看起來應該會這樣:

    my-sourcecode-function$ | lambda_function.py
  4. 將請求程式庫安裝到新 package 目錄。

    pip install --target ./package requests
  5. 在根目錄中使用已安裝的程式庫建立部署套件。

    cd package zip -r ../my-deployment-package.zip .

    這會在專案目錄中產生 my-deployment-package.zip 檔案。該命令會產生以下的輸出:

    adding: chardet/ (stored 0%) adding: chardet/enums.py (deflated 58%) ...
  6. lambda_function.py 檔案新增至 zip 檔案的根目錄。

    cd .. zip -g my-deployment-package.zip lambda_function.py

使用虛擬環境

若要使用虛擬環境更新 Python 函數

  1. 啟用虛擬環境。例如:

    ~/my-function$ source myvenv/bin/activate
  2. 使用 pip 安裝程式庫。

    (myvenv) ~/my-function$ pip install requests
  3. 停用虛擬環境。

    (myvenv) ~/my-function$ deactivate
  4. 使用已安裝程式庫的內容建立部署套件。

    ~/my-function$cd myvenv/lib/python3.8/site-packages zip -r ../../../../my-deployment-package.zip .

    最後一個命令會將部署套件儲存至 my-function 目錄的根目錄。

    提示

    程式庫可能會出現在 site-packagesdist-packages 以及第一個資料夾 liblib64 中。您可以使用 pip show命令來尋找特定套件。

  5. 將函數程式碼檔案新增至部署套件的根目錄。

    ~/my-function/myvenv/lib/python3.8/site-packages$ cd ../../../../ ~/my-function$ zip -g my-deployment-package.zip lambda_function.py

    完成此步驟後,您應具有下列目錄結構:

    my-deployment-package.zip$ │ lambda_function.py │ __pycache__ │ certifi/ │ certifi-2020.6.20.dist-info/ │ chardet/ │ chardet-3.0.4.dist-info/ ...

將您的 .zip 檔案部署至函數

若要將新程式碼部署至您的函數,請上傳新的 .zip 檔案部署套件。您可以使用 Lambda 主控台,將 .zip 檔案上傳到該函數,或者您可以使用 UpdateFunctionCode CLI 命令。

下面的範例上傳名為 my-deployment-package.zip 的檔案。使用 fileb:// 檔案字首,將二進位 .zip 檔案上傳至 Lambda。

~/my-function$ aws lambda update-function-code --function-name MyLambdaFunction --zip-file fileb://my-deployment-package.zip { "FunctionName": "mylambdafunction", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:mylambdafunction", "Runtime": "python3.9", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Handler": "lambda_function.lambda_handler", "CodeSize": 5912988, "CodeSha256": "A2P0NUWq1J+LtSbkuP8tm9uNYqs1TAa3M76ptmZCw5g=", "Version": "$LATEST", "RevisionId": "5afdc7dc-2fcb-4ca8-8f24-947939ca707f", ... }