当前位置: 首页 > news >正文

在AWS Lambda上部署标准FFmpeg工具——Docker方案

大纲

  • 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-gp24.14
Amazon 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_64,arm64
Python 3.8python3.8boto3-1.20.32 botocore-1.23.32Amazon Linux 2x86_64,arm64
Python 3.7python3.7boto3-1.20.32 botocore-1.23.32Amazon Linuxx86_64
Python 3.6python3.6boto3-1.20.32 botocore-1.23.32Amazon Linuxx86_64

1.2.2 Java

Java 运行时标识符JDK作系统架构
Java 11java11amazon-corretto-11Amazon Linux 2x86_64,arm64
Java 8java8.al2amazon-corretto-11Amazon Linux 2x86_64,arm64
Java 8java8amazon-corretto-11Amazon Linuxx86_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
http://www.lryc.cn/news/258371.html

相关文章:

  • C#网络应用程序(Web页面浏览器、局域网聊天程序)
  • MacOS 14挂载NTFS 硬盘的最佳方式(免费)
  • SpringAOP专栏二《原理篇》
  • 冒泡排序(函数)
  • Vue3中的defineModel
  • 动态内存管理(C语言)
  • 区块链实验室(32) - 下载arm64的Prysm
  • flutter学习-day3-dart基础
  • gitblit自建git仓库
  • 二百一十一、Flume——Flume实时采集Linux中的Hive日志写入到HDFS中(亲测、附截图)
  • python 实现 AIGC 大模型中的概率论:生日问题的基本推导
  • YOLOv8算法改进【NO.87】引入上下文引导网络(CGNet)的Light-weight Context Guided改进C2_f
  • GPT-4V 在机器人领域的应用
  • Java基础语法之访问修饰限定符
  • 算法通关村第十八关 | 青铜 | 回溯
  • 蓝牙在物联网中的应用,相比WIFI和NFC的优势?
  • Altair推出 Altair RapidMiner 2023 平台,提供生成式 AI 功能
  • 包管理工具npm与yarn
  • 深度学习 Day11——T11优化器对比实验
  • (十六)Flask之蓝图
  • 面试问题--文件IO
  • SpringBoot中实现跨域的几种常用方式
  • MeterSphere实战(一)
  • ESP32-Web-Server编程-在网页中插入图片
  • <软考>软件设计师-4知识产权与标准化(总结)
  • 唯创知音WTVxxx语音芯片在免洗烘干机中的应用:提升用户体验与产品智能化
  • golang游戏服务器 - tgf系列课程06
  • 【Canvas】记录一次从0到1绘制风场空间分布图的过程
  • 如何用gpt改写文章 (1) 神码ai
  • IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Spring依赖注入数值问题