烟台做网站电话,河北省建设厅网站电话,类似建E网模型网站建设,个人网站开发的背景大纲 1 确定Lambda运行时环境1.1 Lambda系统、镜像、内核版本1.2 运行时1.2.1 Python1.2.2 Java 2 启动EC23 编写调用FFmpeg的代码4 生成docker镜像4.1 安装和启动Docker服务4.2 编写Dockerfile脚本4.3 生成镜像 5 推送镜像5.1 创建存储库5.2 给EC2赋予角色5.2.1 创建策略5.2.2… 大纲 1 确定Lambda运行时环境1.1 Lambda系统、镜像、内核版本1.2 运行时1.2.1 Python1.2.2 Java 2 启动EC23 编写调用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-gp24.14Amazon Linux 2自定义4.14
1.2 运行时
1.2.1 Python
Python 运行时标识符AWS Python的软件工具包操作系统架构Python 3.9python3.9boto3-1.20.32 botocore-1.23.32Amazon Linux 2x86_64arm64Python 3.8python3.8boto3-1.20.32 botocore-1.23.32Amazon Linux 2x86_64arm64Python 3.7python3.7boto3-1.20.32 botocore-1.23.32Amazon Linuxx86_64Python 3.6python3.6boto3-1.20.32 botocore-1.23.32Amazon Linuxx86_64
1.2.2 Java
Java 运行时标识符JDK作系统架构Java 11java11amazon-corretto-11Amazon Linux 2x86_64arm64Java 8java8.al2amazon-corretto-11Amazon Linux 2x86_64arm64Java 8java8amazon-corretto-11Amazon Linuxx86_64
本例使用Python3.9版本其操作系统是Amazon Linux 2Linux内核是“4.14”架构是“x86_64arm64”。在这两种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 -versioncommand shlex.split(ffmpeg_cmd)p subprocess.run(command, stdoutsubprocess.PIPE, stderrsubprocess.PIPE)return {statusCode: 200,body: str(p.stdout, encodingutf-8)}这儿我们约定FFmpeg的路径是/usr/bin/ffmpeg这将在Docker文件中确保该路径正确。
4 生成docker镜像
4.1 安装和启动Docker服务
sudo yum install -y docker
sudo service docker start4.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 docker5.4 推送镜像 执行1、3和4指令。我们就可以在ECR中看到相应镜像。 6 部署Lambda
创建一个名为ffmpeg_from_ecr从容器映像中选择映像的Lambda。 运行一次测试可以看到部署成功了。
参考文献
https://blog.csdn.net/wujiesunlirong/article/details/126492908