在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 shlex

def 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/231554.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Swagger2的使用

手写Api文档的几个痛点: 文档需要更新的时候,需要再次发送一份给前端,也就是文档更新交流不及时。 接口返回结果不明确 不能直接在线测试接口,通常需要使用工具,比如postman 接口文档太多,不好管理 Sw…

kafka学习笔记--生产者消息发送及原理

本文内容来自尚硅谷B站公开教学视频,仅做个人总结、学习、复习使用,任何对此文章的引用,应当说明源出处为尚硅谷,不得用于商业用途。 如有侵权、联系速删 视频教程链接:【尚硅谷】Kafka3.x教程(从入门到调优…

HNU计算机视觉作业二

前言 选修的是蔡mj老师的计算机视觉,上课还是不错的,但是OpenCV可能需要自己学才能完整把作业写出来。由于没有认真学,这门课最后混了80多分,所以下面作业解题过程均为自己写的,并不是标准答案,仅供参考 …

【改进YOLOv8】融合可扩张残差(DWR)注意力模块的小麦病害检测系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义: 随着计算机视觉技术的快速发展,深度学习在图像识别和目标检测领域取得了巨大的突破。其中,YOLO(You Only Look O…

《opencv实用探索·八》图像模糊之均值滤波、高斯滤波的简单理解

1、前言 什么是噪声? 该像素与周围像素的差别非常大,导致从视觉上就能看出该像素无法与周围像素组成可识别的图像信息,降低了整个图像的质量。这种“格格不入”的像素就被称为图像的噪声。如果图像中的噪声都是随机的纯黑像素或者纯白像素&am…

短剧分销平台搭建:短剧变现新模式

短剧作为今年大热的行业,深受大众追捧!短剧剧情紧凑,几乎每一集都有高潮剧情,精准击中了当下网友的碎片化时间。 短剧的形式较为灵活,可以轻松融入各种的元素,比如喜剧、悬疑、爱情等,可以满足…

工业 4.0 | 数字孪生入门指南

工业 4.0 在多年热议后悄然落地,如今,制造、能源和运输企业正在越来越多地从中受益。 仿真未来场景 公司可以使用数字孪生仿真未来场景,以了解天气、车队规模或工况差异等因素对性能的影响。该方法可为维护计划提供决策支撑,并可…

[陇剑杯 2021]简单日志分析

[陇剑杯 2021]简单日志分析 题目做法及思路解析(个人分享) 问一:某应用程序被攻击,请分析日志后作答: 黑客攻击的参数是______。(如有字母请全部使用小写)。 题目思路: 分析…

探索Python中封装的概念与实践

更多资料获取 📚 个人网站:ipengtao.com 封装是面向对象编程中的核心概念,它能够帮助程序员隐藏类的内部细节,并限制对类成员的直接访问。本文将深入探讨Python中封装的机制,介绍封装的类型和优势,并提供详…

重写 AppiumService 类,添加默认启动参数,并实时显示启动日志

一、前置说明 在Appium的1.6.0版本中引入了AppiumService类,可以很方便的通过该类来管理Appium服务器的启动和停止。经过测试,使用该类的实例执行关闭server时,并没有释放端口号,会导致第二次启动时失败。另外,使用该…

什么是MyBatis、什么是MyBatis-Plus、简单详细上手案例

什么是MyBatis MyBatis是一个开源的Java持久层框架,用于简化与关系型数据库的交互。它通过将SQL语句与Java代码进行分离,提供了一种优雅的方式来处理数据库操作。 MyBatis的核心思想是将SQL语句与Java方法进行映射,使得开发人员可以通过配置…

Java LeetCode篇-深入了解二叉树的经典解法(多种方式实现:构造二叉树)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 从前序与中序遍历序列来构造二叉树 1.1 实现从前序与中序遍历序列来构造二叉树思路 1.2 代码实现从前序与中序遍历序列来构造二叉树 2.0 从中序与后序遍历序…

实用篇 | 一文学会人工智能中API的Flask编写(内含模板)

----------------------- 🎈API 相关直达 🎈-------------------------- 🚀Gradio: 实用篇 | 关于Gradio快速构建人工智能模型实现界面,你想知道的都在这里-CSDN博客 🚀Streamlit :实用篇 | 一文快速构建人工智能前端展…

【优选算法系列】【专题二滑动窗口】第三节.904. 水果成篮和438. 找到字符串中所有字母异位词

文章目录 前言一、水果成篮 1.1 题目描述 1.2 题目解析 1.2.1 算法原理 1.2.2 代码编写 1.2.3 题目总结二、找到字符串中所有字母异位词 2.1 题目描述 2.2 题目解析 2.2.1 算法原理 2.2.2 代码编写 …

OpenAI 首席运营官(COO)Brad Lightcap认为商业人工智能被夸大了

美国消费者新闻与商业频道(CNBC)是美国NBC环球集团持有的全球性财经有线电视卫星新闻台,是全球财经媒体中的佼佼者,其深入的分析和实时报导赢得了全球企业界的信任。在1991年前,使用消费者新闻与商业频道(C…

node.js和npm的安装与环境配置(2023最新版)

目录 安装node.js测试是否安装成功测试npm环境配置更改环境变量新建系统变量 安装node.js 1、进入官网下载:node.js官网 我选择的是windows64位的,你可以根据自己的实际情况选择对应的版本。 2、下载完成,安装。 打开安装程序 接受协议 选…

链表OJ—环形链表的约瑟夫问题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前言 世上有两种耀眼的光芒,一种是正在升起的太阳,一种是正在努力学习编程的你!一个爱学编程的人。各位看官,我衷心的希望这篇博客能对你…

操作系统———磁盘调度算法模拟

实验目的 磁盘是可供多个进程共享的设备,当有多个进程都要求访问磁盘是,应采用一种最佳调度算法,以使各进程对磁盘的平均访问时间最小。目前最成用的磁盘调度算法有先来先服务(FCFS),最短寻道时间优先&…

增加网站流量的方法

如果您的网站没有获得足够的流量,您可能会错过在线发展业务的重要机会。搜索引擎优化(SEO)可以帮助提高您网站的知名度,从而吸引更多客户。 SEO的重点是识别高价值的关键词,并将它们整合到网站的内容中,使…

【设计模式-3.2】结构型——适配器模式

说明:本文介绍设计模式中结构型设计模式中的,适配器模式; 插头转换器 适配器模式属于结构型设计模式,设计思想体现在结构上的。以插头转换器为例,当你需要给手机充电,但是眼前只有一个三孔插座&#xff0…