本文紀錄如何在 AWS Lambda 上安裝並使用 Python 第三方套件,步驟包含在本機先建立套件的 zip 檔,以及新增 Layer 到 Lambda 函式上
Lambda 函式預設無法使用 Python 第三方套件
我在 AWS Lambda 撰寫好函式(或是使用 $ zip <dest_filename>.zip
製作 python zip 檔後上傳函式),函式中有使用到 requests 這個套件,執行 Test 時會顯示 <py_file>
.pyNo module named 'requests'
,原因就是 AWS Lambda 預設是沒有 requests 這個套件的,需要另外上傳套件檔,以下是解決方法。
- 安裝所需套件至 python 資料夾
- 打包 python 套件資料夾為 zip 檔
- 建立新 Layer
- 將 Layer 新增至函式
前兩步驟是在本機完成,後兩步驟是在 AWS 上進行,接下來將詳細解說各步驟。
1. 安裝所需套件至 python 資料夾
AWS 官方文件說額外的套件必須使用 「python」 這個名稱的資料夾打包,所以要在專案資料夾內建立一個 python 資料夾,並將套件安裝到裡面,詳細 Terminal 指令如下:
$ mkdir python
$ cd python
# 安裝單一套件
$ pip install --target . requests
# 一次安裝多個套件
$ pip install --target . -r requirements.txt

2. 打包 python 套件資料夾為 zip 檔
cd 回到原本專案的資料夾,將剛剛的 python 套件資料夾打包成 zip 檔,我這邊取名為 dependencies.zip,指令如下
$ cd ..
$ zip -r dependencies.zip ./python

打包完成後的資料夾階層

3. 建立新 Layer
接下來換 AWS 平台上場!
進入 AWS Lambda 後,在側欄點選「其他資源」的「Layer」,並點選「建立 Layer」,就會進入到下圖的畫面,請依照圖片中的順序進行設定,上傳檔案為剛剛所建立的 dependencies.zip
。
這邊要注意的是第五步的「相容的執行時間」,一定要選擇原本函式的程式碼所設定的 Python 版本,我的程式是使用 Python 3.8 執行,因此選擇執行時間(Runtime)就必須選 Python 3.8,否則後面要新增 Layer 到函式時會沒有相符的可以選。

4. 將 Layer 新增至函式
建立完 Layer 之後從側欄回到「函式」,我的函式名稱是 stock.py
:
import requests
def main(event, context):
resp = requests.get('https://histock.tw/stock/public.aspx')
return resp.ok
(event, context 是 AWS Lambda 必須要有的固定參數)
函式的「處理常式」必須設定為 <pyfile_name>.<function_name>
,所以我就要將原本預設的變更為 stock.main
, 如下圖,設定完成後點選「新增 Layer」

點選後會進入下圖的畫面,「Layer source」選擇「自訂 Layer」,下方會出現下拉式選單,選取剛剛建立的 Layer 與版本號,我的因為測試時也是用同個名稱 requests,所以最新版是版本 5 了。

點擊新增後,就可以回到函式,會發現最底下的 Layer 已經出現剛剛所新增的 requests 了!

最後再次點 Test,就會發現函式程式碼順利執行,沒有再出現 No module named 'requests'
的問題了!
延伸閱讀
學會 AWS Lambda 的操作之後,可以來看看怎麼把 FastAPI 部署到 AWS 的 API Gateway 上囉!
參考資料
- AWS python lambda function:No module named requests
- Getting started with AWS Lambda Layers for Python
歡迎追蹤我的 Facebook 粉專:https://www.facebook.com/jumpingcoder
[…] 在 AWS Lambda 上使用 Python 第三方套件教學 […]
讚Liked by 1 person