AWS Lambda 无法解析子进程生成中的主机名

问题描述 投票:0回答:1

我正在尝试让 ffmpeg 在 AWS Lambda 中读取和写入 S3。我浏览了数十篇 AWS 文档、stackoverflow 问题和博客文章。所有人的做法都略有不同,但最终没有一个对我有用。所以我希望在这里找到帮助:) 我坚持使用 InPlainEnglish 的教程:https://plainenglish.io/community/automated-video-processing-with-aws-lambda-and-ffmpeg-2834b7

ffprobe 命令确实有效,因此 ffmpeg 是可调用的。但是当在 child_process.spawn 命令中调用 ffmpeg 时,我收到错误

Failed to resolve hostname my-bucket.s3.eu-central-1.amazonaws.com: System error

export const handler = async (event) => {
    const s3 = new S3Client({});
    const bucket = event.Records[0].s3.bucket.name;
    const sourceKey = event.Records[0].s3.object.key;
    const sourceURL = await getSignedUrl(s3, new GetObjectCommand({
        Bucket: bucket,
        Key: sourceKey,
    }), {
        expiresIn: 900,
    });

    const tmpFilePath = 'tmp/video.mp4';
    const { convertOut } = await commander(`/opt/ffmpeg -i "${sourceURL}" -vf scale=1080:-2,format=yuv420p ${tmpFilePath}`);

    return {
        statusCode: 200,
        body: {
            result: JSON.stringify(convertOut),
        },
    };
};

签名的网址没问题。我用 vanilla js

await fetch(sourceURL)
测试了它,它返回了文件。问题是由于某种原因 child_process 无法访问互联网。

如果有人能够指出我正确的方向,我将不胜感激:D

完整错误消息:

{
  "errorType": "Error",
  "errorMessage": "Command failed: /opt/ffmpeg -i \"https://my-bucket.s3.eu-central-1.amazonaws.com/original/Testvideo.MOV?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential={redacted}&X-Amz-Date=20240209T212255Z&X-Amz-Expires=900&X-Amz-Security-Token={redacted}&X-Amz-Signature={redacted}&X-Amz-SignedHeaders=host&x-id=GetObject\" -vf scale=1080:-2,crop=1080:1350,format=yuv420p tmp/video.mp4\nffmpeg version 6.1-static https://johnvansickle.com/ffmpeg/  Copyright (c) 2000-2023 the FFmpeg developers\n  built with gcc 8 (Debian 8.3.0-6)\n  configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gmp --enable-libgme --enable-gray --enable-libaom --enable-libfribidi --enable-libass --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libdav1d --enable-libxvid --enable-libzimg\n  libavutil      58. 29.100 / 58. 29.100\n  libavcodec     60. 31.102 / 60. 31.102\n  libavformat    60. 16.100 / 60. 16.100\n  libavdevice    60.  3.100 / 60.  3.100\n  libavfilter     9. 12.100 /  9. 12.100\n  libswscale      7.  5.100 /  7.  5.100\n  libswresample   4. 12.100 /  4. 12.100\n  libpostproc    57.  3.100 / 57.  3.100\n[tcp @ 0x141950d0] Failed to resolve hostname my-bucket.s3.eu-central-1.amazonaws.com: System error\n[in#0 @ 0x14190900] Error opening input: Input/output error\nError opening input file https://my-bucket.s3.eu-central-1.amazonaws.com/original/Testvideo.MOV?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential={redacted}&X-Amz-Date=20240209T212255Z&X-Amz-Expires=900&X-Amz-Security-Token={redacted}&X-Amz-Signature={redacted}&X-Amz-SignedHeaders=host&x-id=GetObject.\nError opening input files: Input/output error\n",
  "trace": [
    "Error: Command failed: /opt/ffmpeg -i \"https://my-bucket.s3.eu-central-1.amazonaws.com/original/Testvideo.MOV?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential={redacted}&X-Amz-Date=20240209T212255Z&X-Amz-Expires=900&X-Amz-Security-Token={redacted}&X-Amz-Signature={redacted}&X-Amz-SignedHeaders=host&x-id=GetObject\" -vf scale=1080:-2,crop=1080:1350,format=yuv420p tmp/video.mp4",
    "ffmpeg version 6.1-static https://johnvansickle.com/ffmpeg/  Copyright (c) 2000-2023 the FFmpeg developers",
    "  built with gcc 8 (Debian 8.3.0-6)",
    "  configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gmp --enable-libgme --enable-gray --enable-libaom --enable-libfribidi --enable-libass --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libdav1d --enable-libxvid --enable-libzimg",
    "  libavutil      58. 29.100 / 58. 29.100",
    "  libavcodec     60. 31.102 / 60. 31.102",
    "  libavformat    60. 16.100 / 60. 16.100",
    "  libavdevice    60.  3.100 / 60.  3.100",
    "  libavfilter     9. 12.100 /  9. 12.100",
    "  libswscale      7.  5.100 /  7.  5.100",
    "  libswresample   4. 12.100 /  4. 12.100",
    "  libpostproc    57.  3.100 / 57.  3.100",
    "[tcp @ 0x141950d0] Failed to resolve hostname my-bucket.s3.eu-central-1.amazonaws.com: System error",
    "[in#0 @ 0x14190900] Error opening input: Input/output error",
    "Error opening input file https://my-bucket.s3.eu-central-1.amazonaws.com/original/Testvideo.MOV?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential={redacted}&X-Amz-Date=20240209T212255Z&X-Amz-Expires=900&X-Amz-Security-Token={redacted}&X-Amz-Signature={redacted}&X-Amz-SignedHeaders=host&x-id=GetObject.",
    "Error opening input files: Input/output error",
    "",
    "    at ChildProcess.exithandler (node:child_process:422:12)",
    "    at ChildProcess.emit (node:events:518:28)",
    "    at maybeClose (node:internal/child_process:1105:16)",
    "    at ChildProcess._handle.onexit (node:internal/child_process:305:5)"
  ]
}
enter code here

更新:事实证明这不是S3或互联网,而是child_process似乎无法访问互联网。我已经更新了上面的描述。

amazon-web-services amazon-s3 aws-lambda ffmpeg
1个回答
0
投票

我无法对你的问题发表评论,所以我写一个答案。

我遇到了与你描述的完全相同的问题,只是使用Python而不是JS。使用视频 url 调用 ffmpeg 时,

FFmpeg
无法解析主机名。 John Van Sickle 的 FFmpeg 静态链接版本会出现这种情况,请参阅 自述文件

正如自述文件中建议的那样,我尝试安装

nscd
。这解决了在本地测试容器但未在 AWS Lambda 上测试容器时的问题。

以下选项对我有用:从 URL 下载视频并将其保存到临时文件。然后,在临时本地文件上运行 ffmpeg。

如果它对您有帮助或者您以其他方式解决了问题,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.