aws 部署python lambda_Python 中的 AWS Lambda 部署套件 - AWS Lambda

毕嘉
2023-12-01

Python 中的 AWS Lambda 部署套件

部署套件是含有函式程式碼及相依性的 ZIP 存檔。如果您使用 Lambda API 來管理函式,或者需要包含 AWS 開發套件以外的程式庫和相依項目,您就需要建立部署套件。您可以將套件直接上傳至

Lambda,也可以先使用 Amazon S3 儲存貯體再將其上傳至 Lambda。如果部署套件大於 50 MB,您必須使用 Amazon S3。

如果您使用 Lambda 主控台編輯器來撰寫函式,則主控台會管理部署套件。只要您不需要新增任何程式庫,就可以使用這個方法。您也可以使用該編輯器來更新已在部署套件中擁有程式庫的函式,只要大小總計未超過 3

MB 就好。

注意

您可以使用 AWS SAM CLI build 命令,為 Python 函式程式碼和相依性建立部署套件。AWS SAM CLI 還提供一個選項,可在與 Lambda 執行環境相容的 Docker 映像內部建置部署套件。請參閱

AWS SAM 開發人員指南中的建置包含相依性的應用程式以取得說明。

先決條件

這些指示假設您已經有一個函式。如果您尚未建立函式,請參閱 使用 Python 建立 Lambda 函數。

為了遵循本指南的程序,您需要命令列終端機或 shell 來執行命令。命令清單前會出現提示字元 ($) 及目前的目錄名稱 (如有):

~/lambda-project$ this is a command

this is output

長命令會使用逸出字元 (\) 將命令分割成多行。

在 Linux 和 macOS 上,使用您偏好的 shell 和套件軟體管理工具。在 Windows 10 上,您可以安裝適用於 Linux 的 Windows 子系統,以取得 Ubuntu 和 Bash 的 Windows 整合版本。

更新不含任何依存項目的函數

若要使用 Lambda API 建立或更新函式,請建立一個包含您函式的封存檔,然後使用 AWS CLI 來上傳它。

更新沒有相依性的 Python 函式

建立 ZIP 封存檔。

~/my-function$ zip function.zip lambda_function.py

adding: lambda_function.py (deflated 17%)

使用 fileb:// 字首將二進位 ZIP 部署套件上傳至 Lambda,並更新函數程式碼。

~/my-function$ aws lambda update-function-code --function-name my-function --zip-file fileb://function.zip

{

"FunctionName": "my-function",

"FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function",

"Runtime": "python3.8",

"Role": "arn:aws:iam::123456789012:role/lambda-role",

"Handler": "lambda_function.lambda_handler",

"CodeSize": 815,

"CodeSha256": "GcZ05oeHoJi61VpQj7vCLPs8DwCXmX5sE/fE2IHsizc=",

"Version": "$LATEST",

"RevisionId": "d1e983e3-ca8e-434b-8dc1-7add83d72ebd",

...

}

更新具有額外依存項目的函數

如果您的函式取決於 適用於 Python 的開發套件 (Boto3) 以外的程式庫,請使用 pip 將它們安裝至本機目錄,並將其納入部署套件中。

注意

針對使用以 C 或 C++ 所撰寫延伸模組的程式庫,請在 Amazon Linux 環境中建置您的部署套件。您可以使用會使用 Docker 的 SAM CLI 建置命令,或是在 Amazon EC2 或 CodeBuild 上建置您的部署套件。

下列範例顯示如何建立部署套件,其中包含名為 Pillow 的通用圖庫。

更新具有相依性的 Python 函式

使用 pip 的 --target 選項,在新的、專案本機 package 目錄中安裝程式庫。

~/my-function$ pip install --target ./package Pillow

Collecting Pillow

Using cached https://files.pythonhosted.org/packages/62/8c/230204b8e968f6db00c765624f51cfd1ecb6aea57b25ba00b240ee3fb0bd/Pillow-5.3.0-cp37-cp37m-manylinux1_x86_64.whl

Installing collected packages: Pillow

Successfully installed Pillow-5.3.0

注意

若要讓 --target 能在 Debian 型系統 (如 Ubuntu) 上運作,您還必須傳遞 --system 旗標來防止 distutils 錯誤。

建立相依項目的 ZIP 封存檔。

~/my-function$ cd package

~/my-function/package$ zip -r9 ${OLDPWD}/function.zip .

adding: PIL/ (stored 0%)

adding: PIL/.libs/ (stored 0%)

adding: PIL/.libs/libfreetype-7ce95de6.so.6.16.1 (deflated 65%)

adding: PIL/.libs/libjpeg-3fe7dfc0.so.9.3.0 (deflated 72%)

adding: PIL/.libs/liblcms2-a6801db4.so.2.0.8 (deflated 67%)

...

將您的函式程式碼新增至封存檔。

~/my-function/package$ cd $OLDPWD

~/my-function$ zip -g function.zip lambda_function.py

adding: lambda_function.py (deflated 56%)

使用 fileb:// 字首將二進位 ZIP 部署套件上傳至 Lambda,並更新函數程式碼。

~/my-function$ aws lambda update-function-code --function-name my-function --zip-file fileb://function.zip

{

"FunctionName": "my-function",

"FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function",

"Runtime": "python3.8",

"Role": "arn:aws:iam::123456789012:role/lambda-role",

"Handler": "lambda_function.lambda_handler",

"CodeSize": 2269409,

"CodeSha256": "GcZ05oeHoJi61VpQj7vCLPs8DwCXmX5sE/fE2IHsizc=",

"Version": "$LATEST",

"RevisionId": "a9c05ffd-8ad6-4d22-b6cd-d34a00c1702c",

...

}

具有虛擬環境

在某些情況下,您可能需要使用虛擬環境,為您的函式安裝相依性。如果您的函式或其相依性對原生程式庫具有相依性,或者,如果您使用 Homebrew 來安裝 Python,則可能會發生這種情況。

使用虛擬環境更新 Python 函式

建立虛擬環境。

~/my-function$ virtualenv v-env

Using base prefix '~/.local/python-3.7.0'

New python executable in v-env/bin/python3.8

Also creating executable in v-env/bin/python

Installing setuptools, pip, wheel...

done.

注意

對於 Python 3.3 和更新版本,您可以使用內建的 venv 模組來建立虛擬環境,而不用安裝 virtualenv。~/my-function$ python3 -m venv v-env

啟動環境。

~/my-function$ source v-env/bin/activate

(v-env) ~/my-function$

使用 pip 安裝程式庫。

(v-env) ~/my-function$ pip install Pillow

Collecting Pillow

Using cached https://files.pythonhosted.org/packages/62/8c/230204b8e968f6db00c765624f51cfd1ecb6aea57b25ba00b240ee3fb0bd/Pillow-5.3.0-cp37-cp37m-manylinux1_x86_64.whl

Installing collected packages: Pillow

Successfully installed Pillow-5.3.0

停用虛擬環境。

(v-env) ~/my-function$ deactivate

使用資料庫的內容建立 ZIP 封存檔。

~/my-function$ cd v-env/lib/python3.8/site-packages

~/my-function/v-env/lib/python3.8/site-packages$ zip -r9 ${OLDPWD}/function.zip .

adding: easy_install.py (deflated 17%)

adding: PIL/ (stored 0%)

adding: PIL/.libs/ (stored 0%)

adding: PIL/.libs/libfreetype-7ce95de6.so.6.16.1 (deflated 65%)

adding: PIL/.libs/libjpeg-3fe7dfc0.so.9.3.0 (deflated 72%)

...

根據程式庫而定,相依項目可能會出現在 site-packages 或 dist-packages,且虛擬環境中的第一個資料夾可能是 lib 或 lib64。您可以使用 pip show命令來尋找特定套件。

將您的函式程式碼新增至封存檔。

~/my-function/v-env/lib/python3.8/site-packages$ cd $OLDPWD

~/my-function$ zip -g function.zip lambda_function.py

adding: lambda_function.py (deflated 56%)

使用 fileb:// 字首將二進位 ZIP 部署套件上傳至 Lambda,並更新函數程式碼。

~/my-function$ aws lambda update-function-code --function-name my-function --zip-file fileb://function.zip

{

"FunctionName": "my-function",

"FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function",

"Runtime": "python3.8",

"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",

...

}

 类似资料: