利用Lambda當作影音轉換器的研究筆記(檔案超過512MB時)


Lambda 適合用來做些簡單的工作 , 但要轉檔的file超過512MB時怎辦 !?


什麼是Lambda ? 

/*  
引用: AWS官網 https://aws.amazon.com/tw/lambda/features/
AWS Lambda 是一種無伺服器運算服務,可執行程式碼以回應事件,並且自動為您管理基礎運算資源。您可以使用 AWS Lambda 透過自訂邏輯來擴展其他 AWS 服務,或者自己建立以 AWS 的擴展性、效能和安全性執行的後端服務.
*/

研究動機 :
央喜早期用Cloud Server開發了一套 "客戶簡報(pdf)+法說會錄音檔(mp3)的自動合併成影音(mp4)"的程式 , 並可隨簡報切換時間與聲音檔同步撥放 , 主要是客戶為了配合證交所新規定 , 要提供給證交所影音平台"交差"用 ( 合併成果展示 ) ; 由於一直想利用 serverless 來改善這套流程 , 並希望可以利用serverless 達到多工與平行處理 , 於是趁最近有空檔加緊再研究了一下Amazon Lambda ... 才發現Lambda 近年有許多改版與方便的地方 , 包括Timeout最大已可延長至15分鐘 , 還多了好像2018年才新增的 "Layer層級" !  (玩一玩發現Layer真不錯用)

Lambda優點就是便宜 , 需要時才執行 , 不需要像EC2般一直開機 ($$一直流走) , 缺點就是它有較多的限制 (參考 : AWS Lambda 限制 ) , 它只提供了 512MB 的/tmp 暫存 , 對於較大點的檔案若要當轉檔暫存可真是個麻煩的地方 , 於是開始著手來研究 ... (當然對於較大影音檔案也可以用 Elastic Transcoder 來達成 , 啊就是習慣幫公司省$$嘛  XD )

參考 :
RUNNING FFMPEG ON AWS LAMBDA FOR 1.9% THE COST OF AWS ELASTIC TRANSCODER


第一步 : 先研究如何突破 512MB空間上的限制

網路上看到很多案例都是將video小檔案輸出成縮圖之類 , 或是resize後再丟回S3 , 似乎都是在Lambda 中繼處理 (原本直接測人家的code , 還想說怎麼每次 ffmpeg 轉檔到一半就conversion fail = =  才想到應該是空間爆了 XD ) , 於是想出底下解法  , 這就來野人獻曝一下 :

利用Lambda當作"流轉換器" (Read from HTTP stream then PIPE stream to S3)

這邊假設上述code已經寫好的情況 , 分別有主檔案 index.js 與目錄 bin/  node_modules/ 
(其實code沒幾行也很簡單 , 只是 bucket 設定有個坑要注意 , 不要像央喜掉到坑裡 XD)

ffmpeg binary source放bin目錄下 , 並包成 layer.zip  (因為ffmpeg壓縮後還是很大 分開)


AWS Lambda左方"層級"   點選"新建層級"


輸入並自訂層級名稱(Ex: ffmpegLayer) , 將layer.zip 傳上去這裡
(相容執行時間  選跟執行語言一樣的  到時才能選)

到主函式畫面 點選圖示 "Layers"  然後 "新增層級"
"從清單中選擇相容執行時間的層級" , 相容Layer 選擇剛自訂的Layer名稱與版本
(如果有傳很多版的話)


主函式畫面就可以看到 ffmpegLayer 出現在Layer資訊這裡
( Layer目錄在/opt 下 , 央喜這邊就可以使用 /opt/bin/ffmpeg  囉)


個人覺得用Layer最大好處在這兒 !! 仍然可以編輯與直接修改測試!
(不然上傳zip超過5mb就不給線上編輯 XD 小修改要一直打包上傳  超麻煩)


底下有幾個較需注意的地方 :

1.轉檔效能與Memory設定有關  (參考)
/*
The CPU share dedicated to a function is based off of the fraction of its allocated memory, per each of the two cores. For example, an instance with ~ 3 GB memory available for lambda functions where each function can have up to 1 GB memory means at most you can utilize ~ 1/3 * 2 cores = 2/3 of the CPU. The details may be revisited in the future, but that is the fractional nature of our usage model.
*/
轉檔速度火力全開 ( Lambda CPU cores 與設定的 Memory 有關) 就先開最大吧 3008MB



2. Bucket要去設定Allow Lambda的 policy
這就是央喜一開始一直踩到的坑 XD  記得要去bucket設定allow lambda角色

3. 注意 : 此方式利用PIPE stream 寫入S3 , 但MP4特性關係 , 需要在開頭寫"moov atom"才能直接用來做HTTP streaming  (參考 ), 所以若是要直接拿來做線上撥放的VOD可能不適合(還得加工又多一道工) , 因為主要是Partner都是將MP4下載提供客戶 , 證交所影音平台那邊上傳都還會做一次轉檔 ( 讓他們自己去解決吧 XD )

4. 注意 : Lambda 目前 timeout 最大可至15分鐘 , 所以若source Video太大就直接放棄此方式吧!
(希望Lambda日後 timeout 時間再加大些 ...)

[Test Result] 
目前測試Source video 800MB左右沒問題 (約耗時10分鐘) , 後續再來找1G左右的測測看 ...

解決了一個小問題而已 , 後續還有PDF與MP3合併要把它搞到Lambda來 ~ 累了  XD



Ref:

AWS官網 :  https://aws.amazon.com/tw/lambda/features/

AWS Lambda 限制
https://docs.aws.amazon.com/zh_cn/lambda/latest/dg/limits.html

Serverless Watermark using AWS Lambda Layers & FFmpeg
https://devopstar.com/2019/01/28/serverless-watermark-using-aws-lambda-layers-ffmpeg/

證交所影音平台PDF+MP3合併後的影音檔DEMO

Elastic Transcoder
https://aws.amazon.com/tw/elastictranscoder/

RUNNING FFMPEG ON AWS LAMBDA FOR 1.9% THE COST OF AWS ELASTIC TRANSCODER

留言

這個網誌中的熱門文章

舊公寓對講機變身為手機遙控門鎖研究筆記

舊大門換裝小米電子鎖筆記

解決愛奇藝APP在SONY電視上花屏問題筆記