大綱
- 1 確定Lambda運行時環境
- 1.1 Lambda系統、鏡像、內核版本
- 1.2 運行時
- 1.2.1 Python
- 1.2.2 Java
- 2 啟動EC2
- 3 編寫調用FFmpeg的代碼
- 4 生成docker鏡像
- 4.1 安裝和啟動Docker服務
- 4.2 編寫Dockerfile腳本
- 4.3 生成鏡像
- 5 推送鏡像
- 5.1 創建存儲庫
- 5.2 給EC2賦予角色
- 5.2.1 創建策略
- 5.2.2 創建角色
- 5.2.3 給EC2綁定角色
- 5.3 修改docker用戶
- 5.4 推送鏡像
- 6 部署Lambda
- 參考文獻
FFmpeg被廣泛應用于音/視頻流處理領域。對于簡單的需求,我們可以直接運行FFmpeg二進制程序命令就可以完成。但是對于定制性的功能,則需要熟悉系統的代碼設計框架,進行二次開發。文本討論的是在AWS無服務架構的Lambda上,如何通過Docker部署FFmpeg二進制程序。
1 確定Lambda運行時環境
Lambda運行時決定了其運行的CPU架構、操作系統和輔助軟件。不同語言的運行時環境不同,相同語言的不同版本的運行時不同,所以這步的確認非常重要,否則會造成FFmpeg與Lambda不兼容的問題。下面是從AWS官方摘錄了運行時信息,僅供參考。
1.1 Lambda系統、鏡像、內核版本
系統 | 鏡像 | Linux 內核 |
---|---|---|
Amazon Linux | 鏡像 – amzn-ami-hvm-2018.03.0.20181129-x86_64-gp2 | 4.14 |
Amazon Linux 2 | 自定義 | 4.14 |
1.2 運行時
1.2.1 Python
Python 運行時 | 標識符 | AWS Python的軟件工具包 | 操作系統 | 架構 |
---|---|---|---|---|
Python 3.9 | python3.9 | boto3-1.20.32 botocore-1.23.32 | Amazon Linux 2 | x86_64,arm64 |
Python 3.8 | python3.8 | boto3-1.20.32 botocore-1.23.32 | Amazon Linux 2 | x86_64,arm64 |
Python 3.7 | python3.7 | boto3-1.20.32 botocore-1.23.32 | Amazon Linux | x86_64 |
Python 3.6 | python3.6 | boto3-1.20.32 botocore-1.23.32 | Amazon Linux | x86_64 |
1.2.2 Java
Java 運行時 | 標識符 | JDK | 作系統 | 架構 |
---|---|---|---|---|
Java 11 | java11 | amazon-corretto-11 | Amazon Linux 2 | x86_64,arm64 |
Java 8 | java8.al2 | amazon-corretto-11 | Amazon Linux 2 | x86_64,arm64 |
Java 8 | java8 | amazon-corretto-11 | Amazon Linux | x86_64 |
本例使用Python3.9版本,其操作系統是Amazon Linux 2,Linux內核是“4.14”,架構是“x86_64,arm64”。在這兩種CPU架構中,我們選擇適用面更廣的x86_64。如果選擇arm64,后續FFmpeg選擇,以及Lambda函數運行時也要做出相應調整。
2 啟動EC2
在EC2的控制面板中啟動最低配置(t2.micro)的實例,同時AMI選擇和Lambda一致的Linux內核版本。CPU架構,我們選擇常見的X86_64。這些配置也決定了后續我們下載使用的FFmpeg的版本。
可以創建一對新的密鑰對,也可以使用老的密鑰對。因為我們使用瀏覽器連接EC2,所以這個環節不重要。
由于Docker需要一定磁盤,我們需要給該虛擬機20G的磁盤空間。
待實例處于running狀態,可以使用瀏覽器連接它。
3 編寫調用FFmpeg的代碼
由于通過Docker部署的Lambda在Web端看不到代碼,也不能在Web端提交代碼,于是只能在Docker中提前把代碼部署好。
在/home/ec2-user下使用vim新建一個文件lambda_handle.py,并填充內容
import subprocess
import shlexdef lambda_handler(event, context):if not event:return {'statusCode': 400,'body': json.dumps('event error')}ffmpeg_cmd = "/usr/bin/ffmpeg -version"command = shlex.split(ffmpeg_cmd)p = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)return {'statusCode': 200,'body': str(p.stdout, encoding='utf-8')}
這兒我們約定FFmpeg的路徑是/usr/bin/ffmpeg,這將在Docker文件中確保該路徑正確。
4 生成docker鏡像
4.1 安裝和啟動Docker服務
sudo yum install -y docker
sudo service docker start
4.2 編寫Dockerfile腳本
在/home/ec2-user目錄下使用vim新建Dockerfile腳本文件,并填入以下內容。其中倒數第三步,是將FFmpeg放到之前約定的/usr/bin目錄下;倒數第二步,是將上步編寫的Python腳本放到指定目錄;最后一步是設置Lambda函數入口。
FROM public.ecr.aws/lambda/python:3.9
RUN export ENVIRONMENT=$ENVIRONMENT:online
RUN /var/lang/bin/python3.9 -m pip install --upgrade pip
RUN yum -y install gcc libjpeg-devel zlib-devel gcc-c++ python3-wheel epel-release wget tar gzip xz
RUN wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz
RUN wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz.md5
RUN md5sum -c ffmpeg-release-amd64-static.tar.xz.md5
RUN tar -xvf ffmpeg-release-amd64-static.tar.xz
RUN mv ffmpeg-5.0.1-amd64-static/ffmpeg /usr/bin
COPY ./lambda_handle.py ./
CMD ["lambda_handle.lambda_handler"]
4.3 生成鏡像
sudo docker build -t lambda_ffmpeg:latest -f Dockerfile .
5 推送鏡像
5.1 創建存儲庫
在AWS Elastic Container Registry中創建一個名為lambda_ffmpeg的存儲庫。
5.2 給EC2賦予角色
5.2.1 創建策略
選擇Elastic Container Registry服務,并限制資源為上述創建的ECR庫。為了方便測試,暫時先賦予全部權限。(生產環境中要嚴格遵從最小權限原則。)
最后創建了名為“ElasticContainerRegistryLmbdaFfmpegFullAccess”的策略。
5.2.2 創建角色
在IAM中創建一個名為ffmpeg_ecr_builder的角色。
給這個角色暫時賦予上步創建的策略。
5.2.3 給EC2綁定角色
5.3 修改docker用戶
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
5.4 推送鏡像
執行1、3和4指令。我們就可以在ECR中看到相應鏡像。
6 部署Lambda
創建一個名為ffmpeg_from_ecr,從容器映像中選擇映像的Lambda。
運行一次測試,可以看到部署成功了。
參考文獻
- https://blog.csdn.net/wujiesunlirong/article/details/126492908