iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0
Cloud Native

AWS AI交易室實戰系列 第 8

Day 8 - Lambda Best Practices

  • 分享至 

  • xImage
  •  

~ 戲法 λ λ 會變 各有巧妙不同 ~
lambda-guy-entry
Figure. λ 開啟了我 AWS 人生的入口

今天我們來討論一下 AWS Lambda 上的限制以及最佳實務吧

AWS Lambda 上的限制(Limitations)

軟性限制(可以透過 AWS support 提高限制)

  1. Concurrent Executions 1000
    一個 execution 等於一個 python runtime 在執行,一個 runtime 的存活時間差不多是 15 分鐘,最大同時的執行數上限為 1000,而 Lambda 在一個 Handler function 內是 thread safe
  2. Function and Layer Storage(Total)˙75GB
    我們所上傳程式代碼檔案大小總和最大值為 75GB
  3. Elastic network interface per VPC 250

硬性限制(無法改變的限制)

Resource Limit
Function memory allocation(記憶體分配限制) 128 MB ~ 3,008 MB in 64 MB increments
Function timeout(執行時間限制) 900 seconds (15 min)
Invocation frequency per region(requests per second) 10 x concurrent executions limit (synchronous - all sources)10 x concurrent executions limit (asynchronous - all non-sources)Unlimited (asynchronous - AWS service sources)
Invocation Payload(叫用 payload 大小限制) 6 MB (synchronous)256 KB (asynchronous)
Deployment package size(部署檔案大小限制) 50 MB (zipped, for direct upload)250 MB (unzipped, including layers)3 MB (console editor)
/tmp directory storage(暫存檔案大小限制) 512 MB
File descriptors(最大可開啟檔案數量限制) 1,024
Execution processes / threads(最大可開執行緒數量限制) 1,024

有幾點需要注意:

  1. 記憶體分配與執行效能有關,如果工作來不及在 15 分鐘內完成,可以嘗試加大記憶體來縮短執行時間,或是採用非同步叫用。
  2. 輸入的 payload 大小不能超過 6 MB,一般在透過 lambda 上傳圖片到 S3 時會遇到,無法傳太大的檔案上去
  3. 當我們部署的檔案 zip 後仍然太大,則需要考慮先上傳 S3 的方式部署
  4. lambda 執行環境有個 /tmp 資料夾可以放處理的暫存檔案,但是不能超過 512 MB
  5. 可同時開啟 1024 個檔案,1024 個執行緒,lambda 被 AWS 定位為計算資源不是叫假的,另外 lambda handler 本身是執行緒安全的,很適合用來部署平行化處理的程式

AWS Lambda上的最佳實務

  • 關於程式碼
    • 儘量把核心功能封裝,在 handler 裡面的程式碼相依性越少越好,這樣會有利於測試

      舉個例,我們可以把一般的功能流程會大致分成三項工作:輸入驗證、執行業務邏輯、產生回傳值

response handler (event, context){
    boolean validate(input);
    result = doWork();
    response = buildResponse(result);
    return response;
}
  • 關於部署
    • 對於 python 的相依套件,請使用 AWS Lambda Layer 部署
      → 明日主題
    • 善用 AWS Serverless Application Model(SAM),之後會介紹使用 SAM 開發 Lambda 的流程。
    • 部署檔案請使用 zip 或是 Container Image
  • 關於測試
    • 使用 moto 套件模仿 AWS 服務的行為
    • 使用 credential 直接在本機端存取 AWS 服務,如何在 AWS 上管理測試&開發環境又是另一個重要的課題
    • 善用 SAM 進行本地端測試,也可以用 SAM 產生測試用 input
  • 關於套件管理
    • 使用 pip,Python 語言有其他好用的套件管理器,因為 pip 簡單而相容性高,同時也是其他開發者的首選
    • 若內建函式庫有相同的功能,則避免使用第三方的 library,這會增加程式碼安全的風險,太多的外部依賴套件可能會造成最後的 package過大而超過限制(< 50MB)
    • 程式碼部分儘量模組化,且使用 relative imports (ex. from .module import function)

參考資料

https://aws.plainenglish.io/best-practices-for-python-with-aws-lambda-an-essential-guide-a22b708f8006
https://medium.com/@TechTim42/aws-lambda-limit-and-features-everyone-should-know-d115f933608e
https://lumigo.io/aws-lambda-performance-optimization/aws-lambda-limits/


上一篇
Day 7 - AWS Lambda in Python
下一篇
Day 9 - 一天搞定 Docker
系列文
AWS AI交易室實戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言