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