如何在 macOS 上建立 Lambda python layer

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 程式中,

然後點測試就可以看到程式執行通過啦!

tshine73
tshine73
文章: 53

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *