AWS Lambda 提供了一个强大的无服务器计算环境,让开发人员无需配置或管理服务器即可运行代码。在许多情况下,还有一个限制 – FFmpeg(处理多媒体的常用工具之一)不受原生支持。在 Lambda 环境中处理需要视频或音频处理的应用程序时,这可能会成为一个障碍。
如果在网上搜索解决方案,只能找到一些资源,而且这些指南可能已经过时。在本文中,我将向您介绍一种实用的解决方案,用于将 AWS Lambda 函数 Docker 化并支持 FFmpeg。按照本指南并使用下面的 Dockerfile,您将轻松克服这一障碍,并在短时间内让您的 Lambda 函数为 FFmpeg 做好准备。
为什么 AWS Lambda 原生不支持 FFmpeg?
AWS Lambda 的执行环境非常优化和精简;它没有预装很多工具,FFmpeg 就是其中之一。这使得它很难完成任何涉及视频编码、转码或音频处理的工作。一般来说,AWS Lambda Layers 带来了一种很好的自定义方式,但在使用依赖于系统级二进制文件的库时(如 FFmpeg),它们并不能完全解决这个问题。
解决方案: 对 AWS Lambda 函数进行 Docker 化
使用自定义容器镜像也许是将 FFmpeg 添加到您的 Lambda 函数的最佳方法。Docker 可以帮助您将应用程序及其所有依赖项(包括 FFmpeg)捆绑到一个包中。在此,我将概述如何设置您的 Docker 环境,使 FFmpeg 与 AWS Lambda 无缝协作。
支持 FFmpeg 的 AWS Lambda Docker 化分步指南
步骤 1:创建 Dockerfile
下面的 Dockerfile 概述了创建支持 FFmpeg 的自定义 AWS Lambda 镜像所需的步骤。该映像基于与 AWS Lambda 兼容的 Amazon Linux 2023。它安装了必要的软件包、FFmpeg 和 AWS Lambda 运行时接口客户端。
# 使用 Amazon Linux 2023 基础镜像
FROM public.ecr.aws/lambda/provided:al2023
# 安装必要的系统包
RUN dnf update -y && \
dnf install -y \
python3 \
python3-pip \
gcc \
git \
unzip \
xz \
wget \
tar \
dnf clean all
# 安装 ffmpeg
RUN wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz && \
tar -xf ffmpeg-release-amd64-static.tar.xz --strip-components=1 -C /usr/local/bin && \
ln -sf /usr/local/bin/ffmpeg /usr/bin/ffmpeg && \
rm -f ffmpeg-release-amd64-static.tar.xz
# 安装 AWS Lambda 运行时接口客户端 (RIC)
RUN pip3 install awslambdaric
# 设置工作目录
WORKDIR ${LAMBDA_TASK_ROOT}
# 将函数代码和需求文件复制到容器中
COPY . ${LAMBDA_TASK_ROOT}
# 安装 Python 依赖项
RUN pip3 install --trusted-host pypi.python.org -r requirements.txt
# 将入口点设置为 Lambda 运行时接口客户端
ENTRYPOINT ["python3", "-m", "awslambdaric"]
# 将 CMD 设置为 Lambda 函数处理程序
CMD ["lambda_function.lambda_handler"]
步骤 2:分解 Dockerfile
- 基础镜像:
我们使用亚马逊 Linux 2023 的基础镜像 FROM public.ecr.aws/lambda/provided:al2023
,使其与 AWS Lambda 兼容。
- 系统软件包安装:
使用 dnf install
命令在系统中安装必要的软件包,包括 Python、GCC 和其他有用的实用程序。
- 安装 FFmpeg:
我们使用来自可信来源的 FFmpeg 静态构建,并将其解压缩到 /usr/local/bin
目录中。我们会创建一个符号链接,使 FFmpeg 在整个系统中可用。
- AWS Lambda 运行时接口客户端(RIC):
安装 awslambdaric
软件包是为了启用 AWS Lambda 的自定义运行时。
- 工作目录和文件复制:
Lambda 函数及其依赖项的代码会复制到容器的工作目录中。(lambda_task_root`)。
- Python 依赖项:
使用 pip
安装 requirements.txt
中列出的依赖项。
- 入口点和命令
ENTRYPOINT
表示启动 Lambda 运行时接口客户端,而CMD则提供了运行 Lambda 函数处理程序(位于lambda_function.lambda_handler)的默认命令。
步骤 3:构建并推送 Docker 镜像
接下来,使用以下命令构建 Docker 镜像:
docker build -t my-lambda-image .
构建镜像后,您需要将其推送到 Amazon Elastic Container Registry (ECR) 或 AWS Lambda 支持的任何其他容器注册表:
# 标记镜像
docker tag my-lambda-image:latest <account-id>.dkr.ecr.<region>.amazonaws.com/my-lambda-image:latest
# 标记镜像
aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <account-id>.dkr.ecr.<region>.amazonaws.com
# 推送镜像
docker push <account-id>.dkr.ecr.<region>.amazonaws.com/my-lambda-image:latest
步骤 4:使用自定义镜像创建 Lambda 函数
- 打开 AWS Lambda 控制台。
- 点击创建函数并选择容器镜像。
- 使用 ECR 中选定的镜像部署您的功能。
使用自定义 Docker 镜像的好处
- 完全控制:您将完全控制环境;因此,您可以包含所有必需的库和二进制文件。
- 可扩展性:通过 AWS Lambda 实现无服务器扩展,且不会造成功能损失。
- 更好的调试:Docker 环境中的开发反映了生产设置,这使得调试变得更加容易。
FFmpeg 在 AWS Lambda 中的常见用例
- 视频/音频编码:将视频/音频文件转码为不同的格式
- 缩略图生成:用于 Web 应用程序的即时视频缩略图
- 音频提取:从视频中提取音频流以供进一步处理或分析
将 FFmpeg 集成到 AWS Lambda 中为其在无服务器应用程序中的多媒体处理打开了一个全新的维度。对您的 Lambda 函数进行 Docker 化,可以非常容易地包含 FFmpeg 和其他复杂的依赖项,而这些依赖项在其他情况下是不支持的。这种方法还能解决兼容性问题,进一步增强您构建强大、可扩展的无服务器应用程序的能力。
作者:Gurpreet Singh
来源:gary-badwal.medium.com
本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/52055.html