Lambda Layer
AWS Lambda 是能幫你執行程式,但不用在意 server 或 cluster 的 AWS 服務。
做為 serverless 服務,當你嘗試在上面執行一些比較複雜的 Python 程式時,會面臨到 library 該如何匯入的問題,
其一匯入方式就是用 Lambda Layer,它能讓你上傳含有 library 的 .zip
檔,然後在 Lambda 程中加入 Lambda Layer 後,你就能在 python 程式中這些 library,
因為 AWS Lambda 最終是執行在 Amazon Linux 上,所以代表了你的 Lambda layer 要跟 Amazon Linux 兼容,所以這篇文章主要會來講講如何在 MacOS 上打包出能在 Amazon Linux 上兼容的 .zip
library 檔案。
而每一個 Lambda runtime layer 用的 .zip
都必須包含以下目錄,
layer_content.zip
└ python
└ lib
└ python3.11
└ site-packages
└ requests
└ <other_dependencies> (i.e. dependencies of the requests package)
└ ...
如何打包
首先隨便寫一個需要 import pandas 的 lambda 主程式,python 版本選擇 3.11,
import pandas as pd
def lambda_handler(event, context):
data = [["Orange", "fruit", 500],
["PS5", "console", 300],
["Grape", "fruit", 200]]
df = pd.DataFrame(data, columns=['name', 'category', 'price'])
print(df)
若參考 AWS 文件 直接在 macOS 上打包 pandas 的話,Lambda 在執行時會出現這種錯誤,
{
"errorMessage": "Unable to import module 'lambda_function': Unable to import required dependencies:\nnumpy: Error importing numpy: you should not try to import numpy from\n its source directory; please exit the numpy source tree, and relaunch\n your python interpreter from there.",
"errorType": "Runtime.ImportModuleError",
"requestId": "",
"stackTrace": []
}
此時我們有 2 個選擇。
1. 在 macOS 上打包時,pip install 時加入特定指令
mkdir -p pandas/python/lib/python3.11/site-packages
pip install --target ./pandas/python/lib/python3.11/site-packages --platform manylinux2014_x86_64 --only-binary=:all: pandas==2.2.3
cd pandas
zip -r ../pandas.zip .
cd ..
2. 用 Docker 執行 Amazon Linux 容器來打包
環境能更乾淨,且比較能避免奇怪問題的選項,
首先來 run 一個 Amazon Linux 容器,然後在裡頭面安裝必要的 package,建立 venv,
docker run -it --name lambda_layer_container amazonlinux /bin/bash
yum install -y python3.11
yum install -y python3-pip
yum install -y zip
cd /opt
python3.11 -m venv layer_env
source layer_env/bin/activate
然後用跟在 macOS 一樣的指令來打包 pandas,
mkdir -p pandas/python/lib/python3.11/site-packages
pip install --target ./pandas/python/lib/python3.11/site-packages --platform manylinux2014_x86_64 --only-binary=:all: pandas==2.2.3
cd pandas
zip -r ../pandas.zip .
cd ..
完成後,開另一個 CLI 把 /opt/pandas.zip
複製到本地端,
docker cp lambda_layer_container:/opt/pandas.zip ./
新增 Lambda layer
最後在 Lambda Layer 中新增 pandas.zip
,
並將該 layer 新增至 Lambda 程式中,
然後點測試就可以看到程式執行通過啦!