首页 > 解决方案 > AWS Lambda,添加 firebase 模块及其依赖项以与 Angular Universal 一起使用

问题描述

我有一个 Angular Universal 项目使用 SSR 部署到 AWS Lambda,但我还没有设法让 firebase 作为它的依赖项工作。控制台中的所有错误都与 firebase 依赖项及其依赖项有关。

方法 #1:包含 firebase 模块

package:
  exclude:
    - '!node_modules/firebase/**'

这增加了firebase,现在错误转移到无法找到firebase的依赖项等等。

方法#2:只包含所有节点模块

这是一个 Angular 项目,我有 600mb+ 的依赖项来构建应用程序,

方法 #3:在我的 Angular 'dist' 文件夹中安装 firebase。

这将引发运行时错误:

Error: Failed to load gRPC binary module because it was not installed for the current system\nExpected directory: node-v64-linux-x64-glibc\nFound: [node-v64-win32-x64-unknown]\nThis problem can often be fixed by running \"npm rebuild\" on the current system\nOriginal error: Cannot find module '/var/task/node_modules/grpc/src/node/extension_binary/node-v64-linux-x64-glibc/grpc_node.node'",

方法 #4:serverless-webpack

这会在sls deploy说它找不到 webpack 配置时抛出错误,但它就在 serverlesss.yml 旁边的根目录中,并且它已经被 angular Universal 使用,我不能用不同的配置覆盖它 serverless-webpack 插件.

方法 #5:手动 Lambda 层

我尝试使用具有firebase作为依赖项的package.json创建一个层,运行npm install,制作包含该nodejs文件夹的文件夹的存档node_modules并将其作为层上传+手动添加到我的函数中。

与 #1 相同的错误,找不到 firebase 模块,这也将在我下次部署时被无服务器框架覆盖。

方法 #6:通过无服务器的 Lambda 层

我试图将这些文章拼凑在一起,以获得 第 1条、第 2条、第 3条的工作,并使用了这个 github中的示例,但用 firebase 切换了时刻。

但是它们都不起作用,无服务器配置:

layers:
  firebaseLayer:
    path: ../layers/firebase-layer
    compatibleRuntimes:
      - nodejs8.10
      - nodejs10.x
    package:
      include:
        - node_modules/**

会抛出:No file matches include / exclude patterns

const firebase = require('firebase');我的端点处理程序内部也有。

我一直试图让这个工作整整两天,这已经令人沮丧了。任何帮助表示赞赏。

标签: firebaseaws-lambdaangularfire2serverless-frameworkaws-lambda-layers

解决方案


两种可能的解决方案:

  1. serverless-webpack与以下配置一起使用:
# serverless.yaml
service: serverless-webpack-firebase

provider:
  name: aws
  runtime: nodejs10.x
  stage: ${opt:stage, 'dev'}
  region: ${opt:region, 'us-east-1'}

plugins:
  - serverless-webpack

package:
  individually: true

custom:
  webpack:
    webpackConfig: "webpack.config.js"
    includeModules: true
    packager: "yarn"

functions:
  withWebpack:
    handler: handler.hello
// webpack.config.js

const path = require("path");
const slsw = require("serverless-webpack");
const nodeExternals = require("webpack-node-externals");

module.exports = {
  entry: slsw.lib.entries,
  target: "node",
  mode: slsw.lib.webpack.isLocal ? "development" : "production",
  performance: {
    hints: false
  },
  resolve: {
    extensions: [".js", ".json"]
  },
  externals: [nodeExternals()]
};

externals: [nodeExternals()]将从包中删除所有外部依赖项,并且includeModules: true仍将它们添加到 zip 下node_modules

  1. 使用 Lambda 层:
# layer yaml
service: firebase-layer

provider:
  name: aws
  runtime: nodejs8.10
  stage: ${opt:stage, 'dev'}
  region: ${opt:region, 'us-east-1'}

layers:
  firebase:
    path: ./layer
    description: Layer with all the required dependencies to use firebase
    compatibleRuntimes:
      - nodejs8.10
      - nodejs10.x
    licenseInfo: MIT
    retain: true

service: serverless-layer-firebase

provider:
  name: aws
  runtime: nodejs10.x
  stage: ${opt:stage, 'dev'}
  region: ${opt:region, 'us-east-1'}

plugins:
  - serverless-webpack
  - serverless-pseudo-parameters

package:
  individually: true

custom:
  webpack:
    webpackConfig: "webpack.config.js"
    includeModules: false
    packager: "yarn"

functions:
  withLayer:
    handler: handler.hello

    layers:
      - arn:aws:lambda:${self:provider.region}:#{AWS::AccountId}:layer:firebase:1

相同webpack.config.js,但这次includeModules: false我们不需要 zip 文件中的依赖项(它们与图层一起加载)。

层结构:

在此处输入图像描述

存储库在这里可用:https ://github.com/erezrokah/serverless-webpack-firebase

查看包装尺寸的差异:

在此处输入图像描述


推荐阅读