在 AWS Lambda 上使用 Python 第三方套件教學

本文紀錄如何在 AWS Lambda 上安裝並使用 Python 第三方套件,步驟包含在本機先建立套件的 zip 檔,以及新增 Layer 到 Lambda 函式上

Lambda 函式預設無法使用 Python 第三方套件

我在 AWS Lambda 撰寫好函式(或是使用 $ zip <dest_filename>.zip <py_file>.py 製作 python zip 檔後上傳函式),函式中有使用到 requests 這個套件,執行 Test 時會顯示 No module named 'requests',原因就是 AWS Lambda 預設是沒有 requests 這個套件的,需要另外上傳套件檔,以下是解決方法。

  1. 安裝所需套件至 python 資料夾
  2. 打包 python 套件資料夾為 zip 檔
  3. 建立新 Layer
  4. 將 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 上囉!

參考資料


歡迎追蹤我的 Facebook 粉專:https://www.facebook.com/jumpingcoder

廣告

對「在 AWS Lambda 上使用 Python 第三方套件教學」的想法

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s