AWS Lambda执行shell npm安装错误

pftdvrlh  于 2023-02-04  发布在  Shell
关注(0)|答案(2)|浏览(148)

我尝试在AWS lambda中构建一个Web应用程序,并将其上传到S3 bucket,为此,我使用了子进程,它在本地运行良好。

exec('cd /tmp/ && npm ci && ng build --prod="true"', (error, stderr, stdout) => {
      if (error) {
        console.log(error);
        return reject(error);
        }
      });

我还尝试使用npm install而不是npm ci,在所有情况下,它都失败,并显示以下错误:
"npm错误!错误编号-30","npm错误!错误编号:只读文件系统,mkdir '/home/sbx_user1051'","npm ERR! rofs通常为虚拟化文件系统或其他文件系统","npm ERR!不支持符号链接的rofs,会出现此错误。","npm ERR! code EROFS","npm ERR! syscall mkdir",
命令失败:cd/tmp/& & npm创建--产品="真"\nnpm错误!代码错误\nnpm错误!系统调用mkdir\nnpm错误!路径/home/sbx_user1051\nnpm错误!错误号-30\nnpm错误! rofs错误:只读文件系统,mkdir '/home/sbx_user1051'\ nnpm ERR! rofs通常是虚拟化文件系统,或其他文件系统\nnpm ERR!不支持符号链接的rofs,给出此错误。\nnpm ERR!
我知道在AWS Lambda中只有/tmp/目录是可写的,但我不知道如何告诉npm在/tmp中运行。
有什么想法吗?

ttygqcqt

ttygqcqt1#

通常,人们在构建阶段安装所有的东西,然后将其压缩并部署为lambda函数。AWS提供了一些示例项目来执行此操作https://docs.aws.amazon.com/lambda/latest/dg/lambda-nodejs.html
或使用放大器https://aws.amazon.com/amplify/
对于节点,还可以选择使用无服务器https://stackify.com/aws-lambda-with-node-js-a-complete-getting-started-guide/
或者,现在您也可以考虑使用docker https://aws.amazon.com/blogs/aws/new-for-aws-lambda-container-image-support/
任何这些都可以在CI/CD管道(https://www.weave.works/blog/what-cicd-tool-should-i-use)中制备。
一般来说,我会避免自我修改lambda,因为这几乎是不可重复的。有一天,一个npm包会在一分钟内不可用,AWS会扩展你的lambda,它会开始失败,你的整个应用程序会崩溃。
如果你的目标是在lambda中重复构建节点应用程序,那么可以走Docker路径,这是最灵活的。

nr7wwzry

nr7wwzry2#

嗨,我已经通过将NPM_CONFIG_CACHE环境变量设置为/tmp/.npm成功地使npm工作。
就像这样:

const dir = '/tmp/your_project_dir';
  process.env.NPM_CONFIG_CACHE = '/tmp/.npm';
  
  execSync(`npm ci && npm run build`, {cwd: dir});

Lambda函数的示例为here
注意,据我测试,我们似乎不能在节点16运行时使用npm,在节点14或节点18运行时,我们可以使用它没有问题。
我还发现有人创建了一个包含npm cli的Lambda层,可以在非节点Lambda环境中使用。https://github.com/sambaiz/npm-lambda-layer

相关问题