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


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。
在这里插入图片描述
运行一次测试,可以看到部署成功了。
在这里插入图片描述

参考文献

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将Spring Cloud Function部署AWS Lambda可以分为以下几个步骤: 1. 创建一个Java项目,并添加Spring Cloud Function和AWS Lambda的依赖。 2. 编写一个Lambda函数处理器类,实现AWS Lambda的RequestHandler接口。这个处理器类负责接收和处理来自AWS Lambda的事件请求,并将请求转发给Spring Cloud Function的函数接口。 3. 将项目打包成一个Jar文件,并上传到AWS Lambda。 4. 配置AWS Lambda的触发器,让它在某个事件发生时执行。 下面是一个简单的示例,演示如何将Spring Cloud Function部署AWS Lambda: 1. 创建一个Maven项目,并添加以下依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-function-adapter-aws</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-aws-autoconfigure</artifactId> <version>2.3.2.RELEASE</version> </dependency> ``` 2. 编写一个Lambda函数处理器类: ```java import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import org.springframework.cloud.function.adapter.aws.SpringBootRequestHandler; public class MyLambdaFunctionHandler implements RequestHandler<String, String> { private final SpringBootRequestHandler<String, String> handler; public MyLambdaFunctionHandler() { handler = new SpringBootRequestHandler<>(MyFunction.class); } @Override public String handleRequest(String input, Context context) { return handler.handleRequest(input, context); } } ``` 这个类实现了AWS Lambda的RequestHandler接口,并将请求转发给Spring Boot Request Handler。MyFunction是你自己编写的函数接口实现类。 3. 将项目打包成一个Jar文件,并上传到AWS Lambda。 你可以使用Maven命令打包项目: ``` mvn package ``` 然后,将生成的Jar文件上传到AWS Lambda。 4. 配置AWS Lambda的触发器,让它在某个事件发生时执行。 你可以在AWS Lambda控制台上配置触发器,例如API Gateway、S3事件等。 以上就是将Spring Cloud Function部署AWS Lambda的基本步骤。你可以根据自己的需求对Lambda函数进行配置和优化,以获得更好的性能和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值