19

我正在使用 AWS Lambda,这涉及创建我的 node.js 脚本的存档,包括node_modules文件夹并将其上传到他们的基础设施以运行。

这很好用,除非涉及具有本机绑定的节点模块(使用 node-gyp)。因为绑定是在我的本地计算机 (OS X) 上编译和存档的,所以它与 AWS 的 (Amazon Linux) 服务器不兼容。

如何交叉编译/安装节点模块(特别是node-sqlite3),以便当我将其上传到另一个服务器架构时它运行?

4

4 回答 4

9

虽然不能真正解决您的问题,但一个非常简单的解决方法可能是在 Linux 机器上简单地编译本机插件。

对于您的特定情况,我会使用Vagrant。Vagrant 可以在几秒钟内创建并配置虚拟机。

  1. 查找类似于 Amazon 的 Linux 发行版(Fedora、CentOS、其他yum用作包管理器的操作系统 - 参见Wiki)的操作系统映像
  2. 使用一个简单的配置脚本,当 Vagrant 在机器启动时运行时,它将运行npm install(可选地,它也可能在之前删除node_modules文件夹以确保干净安装)
  3. 为了更加舒适,该脚本还可以创建用于部署的 zip 文件
  4. 安装完成后,脚本将关闭虚拟机以避免不必要的系统资源消耗
  5. 部署!

如果链接库不在目标机器上的同一位置,则可能需要进行一些调整,但在我看来,这通常是最好和最快的解决方案。

于 2015-05-25T14:05:25.743 回答
2

虽然在某些情况下使用 Vagrant 安装应用程序可能就足够了,但我发现有必要在尽可能接近 Lambda 的 Amazon Linux AMI 的Linux 上构建应用程序。

您可以在此处阅读原始答案:https ://stackoverflow.com/a/34019739/303184

使其工作的步骤:

  1. 生成新的 EC2 实例。确保它基于与您的 AWS Lambda 运行时完全相同的映像。您可以在此处查看 Lambda 环境详细信息:http: //docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html在我们的例子中,它是名为amzn-ami-hvm-2015.03.0.x86_64-gp2 的Amazon Linux AMI 。

  2. 安装nvm并使用它来安装与 AWS Lambda 相同版本的 Node.js。在撰写本文时,它是v0.10.36。您可以再次参考http://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html进行查找。

  3. 您可能需要在 EC2 上安装 git & g++ 编译器。你可以这样做

    sudo yum install git gcc-c++
  4. 最后,将您的应用克隆到新的 EC2 并安装应用的依赖项:

    nvm use 0.10.36
    npm install --production
    
  5. scp然后,您可以使用等轻松下载 node_modules 。

于 2015-12-01T11:54:00.790 回答
1

与罗伯特的回答相同,当我不得不在不同的操作系统中使用我的 MAC 时,我使用像 Oracle 的免费虚拟器VirtualBox这样的 vm ware在我的 Mac 上安装 linux,我无需支付任何费用。或者注册一个新的 AWS 账户,您可以免费获得一年的 micro。用它来获取你的 linux 机器,在那里做你需要的任何事情。

于 2015-05-25T15:06:07.160 回答
1

AWS 有一个页面描述如何处理原生 NPM 模块:https ://aws.amazon.com/blogs/compute/nodejs-packages-in-lambda/

于 2015-05-29T16:57:32.553 回答