Javascript AWS lambda无服务器中不存在此类文件错误
嘿,我一直在关注这篇博客文章——它使用ffmpeg从视频文件创建gif 我的文件结构- 礼品制造者Javascript AWS lambda无服务器中不存在此类文件错误,javascript,node.js,amazon-s3,aws-lambda,Javascript,Node.js,Amazon S3,Aws Lambda,嘿,我一直在关注这篇博客文章——它使用ffmpeg从视频文件创建gif 我的文件结构- 礼品制造者 层 ffmpeg库 handler.js serverless.yml 我的handler.js代码- const { spawnSync } = require("child_process"); const { readFileSync, writeFileSync, unlinkSync } = require("fs"); const AW
- 层
- ffmpeg库
- handler.js
- serverless.yml
const { spawnSync } = require("child_process");
const { readFileSync, writeFileSync, unlinkSync } = require("fs");
const AWS = require("aws-sdk");
const s3 = new AWS.S3();
module.exports.mkgif = async (event, context) => {
if (!event.Records) {
console.log("not an s3 invocation!");
return;
}
for (const record of event.Records) {
if (!record.s3) {
console.log("not an s3 invocation!");
continue;
}
if (record.s3.object.key.endsWith(".gif")) {
console.log("already a gif");
continue;
}
// get the file
const s3Object = await s3
.getObject({
Bucket: record.s3.bucket.name,
Key: record.s3.object.key
})
.promise();
// write file to disk
writeFileSync(`/tmp/${record.s3.object.key}`, s3Object.Body);
// convert to gif!
spawnSync(
"/opt/ffmpeg/ffmpeg",
[
"-i",
`/tmp/${record.s3.object.key}`,
"-f",
"gif",
`/tmp/${record.s3.object.key}.gif`
],
{ stdio: "inherit" }
);
// read gif from disk
const gifFile = readFileSync(`/tmp/${record.s3.object.key}.gif`);
// delete the temp files
unlinkSync(`/tmp/${record.s3.object.key}.gif`);
unlinkSync(`/tmp/${record.s3.object.key}`);
// upload gif to s3
await s3
.putObject({
Bucket: record.s3.bucket.name,
Key: `${record.s3.object.key}.gif`,
Body: gifFile
})
.promise();
}
};
我的无服务器.yml-
service: gifmaker
frameworkVersion: "2"
provider:
name: aws
runtime: nodejs12.x
region: ap-south-1
iamRoleStatements:
- Effect: Allow
Action:
- s3:PutObject
- s3:GetObject
Resource: "arn:aws:s3:::${self:custom.bucket}/*"
functions:
mkgif:
handler: handler.mkgif
events:
- s3: ${self:custom.bucket}
layers:
- {Ref: FfmpegLambdaLayer}
layers:
ffmpeg:
path: layer
custom:
bucket: ${env:BUCKET, 'newsgator-company4'}
获取此错误-
2020-10-07T22:32:14.695Z 13d283af-13dd-40e4-ae52-e1fc0d41f547 ERROR Invoke Error
{
"errorType": "Error",
"errorMessage": "ENOENT: no such file or directory, open '/tmp/data_store/0009.mp4'",
"code": "ENOENT",
"errno": -2,
"syscall": "open",
"path": "/tmp/data_store/0009.mp4",
"stack": [
"Error: ENOENT: no such file or directory, open '/tmp/data_store/0009.mp4'",
" at Object.openSync (fs.js:462:3)",
" at writeFileSync (fs.js:1362:35)",
" at Runtime.module.exports.mkgif [as handler] (/var/task/handler.js:29:5)",
" at runMicrotasks (<anonymous>)",
" at processTicksAndRejections (internal/process/task_queues.js:97:5)"
]
}
2020-10-07T22:32:14.695Z 13d283af-13dd-40e4-ae52-e1fc0d41f547错误调用错误
{
“errorType”:“Error”,
“errorMessage”:“enoint:没有这样的文件或目录,请打开“/tmp/data\u store/0009.mp4”,
“代码”:“Enoint”,
“errno”:-2,
“系统调用”:“打开”,
“路径”:“/tmp/data_store/0009.mp4”,
“堆栈”:[
“错误:enoint:没有这样的文件或目录,请打开'/tmp/data_store/0009.mp4'”,
“在Object.openSync(fs.js:462:3)”中,
“在writeFileSync(fs.js:1362:35)”中,
“在Runtime.module.exports.mkgif[作为处理程序](/var/task/handler.js:29:5)”,
“在runMicrotasks()”,
“在处理和拒绝时(内部/process/task_queues.js:97:5)”
]
}
我已经在这件事上纠缠了好几个小时了,搞不懂这个问题。lambda函数还具有管理员角色。正如我看到的,问题是您提供的路径不存在
writeFileSync(`/tmp/${record.s3.object.key}`, s3Object.Body);
this becomes -> /tmp/data_store/0009.mp4
如果record.s3.object.key
正好是0009.mp4
而您的路径将是
/tmp/0009.mp4
->这将起作用,因为writeFileSync
可以创建一个文件,如果该文件不存在,但在您的情况下,这是不可能的,因为您没有目录数据存储
,而且这不起作用。我看到的问题是您提供的路径不存在
writeFileSync(`/tmp/${record.s3.object.key}`, s3Object.Body);
this becomes -> /tmp/data_store/0009.mp4
如果record.s3.object.key
正好是0009.mp4
而您的路径将是
/tmp/0009.mp4
->这将起作用,因为writeFileSync
可以创建一个文件,如果该文件不存在,但在您的情况下,这是不可能的,因为你没有目录数据存储
,而且这不起作用。mp4有多大?@mmason33我上传测试的mp4有8.2MB,我想这可能是内存问题,但它不是/tmp
有500 MB可用空间。啊!不是内存问题,我以为这可能是lambda的权限问题,但现在我给了它管理员的角色。很抱歉,我没有其他任何东西。我对aws-cli不太熟悉。mp4有多大?@mmason33我上传测试的mp4有8.2MB,我认为可能是内存问题,但不是/tmp
有500MB可用空间。啊!不是内存问题,我以为这可能是lambda的权限问题,但现在我给了它管理员的角色。很抱歉,我没有其他任何东西。我对aws cli不太熟悉。很好,Rohan,这些事情发生了,它们很常见,相信我:)很好,Rohan,这些事情发生了,它们很常见,相信我:)