AWS Lambda,添加 firebase 模块及其依赖项以与 Angular Universal 一起使用
AWS Lambda, adding firebase module and its dependencies to function for use with Angular Universal
我有一个 Angular 使用 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 使用通用的,我不能用 serverless-webpack 插件的不同配置覆盖它。
方法#5:手动 Lambda 层
我尝试用 package.json 制作一个层,它有 firebase 作为依赖项,运行 npm install,制作了 nodejs
文件夹的存档,其中有 node_modules
文件夹并将其作为图层上传+手动添加到我的功能中。
与 #1 相同的错误,找不到 firebase 模块,这也会在我下次部署时被无服务器框架覆盖。
方法#6:通过无服务器的 Lambda 层
我试图将这些文章拼凑在一起以得到一些有用的东西Article 1, Article 2, Article 3 and used the example from this github但是我用 firebase 切换了时刻。
但其中 none 有效,无服务器配置:
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');
。
整整两天我都在努力让它工作,但结果令人沮丧。感谢您的帮助。
两种可能的解决方案:
- 使用具有以下配置的
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
仍会将它们添加到 node_modules
下的 zip 中
- 使用 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
查看包装尺寸的差异:
我有一个 Angular 使用 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 使用通用的,我不能用 serverless-webpack 插件的不同配置覆盖它。
方法#5:手动 Lambda 层
我尝试用 package.json 制作一个层,它有 firebase 作为依赖项,运行 npm install,制作了 nodejs
文件夹的存档,其中有 node_modules
文件夹并将其作为图层上传+手动添加到我的功能中。
与 #1 相同的错误,找不到 firebase 模块,这也会在我下次部署时被无服务器框架覆盖。
方法#6:通过无服务器的 Lambda 层
我试图将这些文章拼凑在一起以得到一些有用的东西Article 1, Article 2, Article 3 and used the example from this github但是我用 firebase 切换了时刻。
但其中 none 有效,无服务器配置:
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');
。
整整两天我都在努力让它工作,但结果令人沮丧。感谢您的帮助。
两种可能的解决方案:
- 使用具有以下配置的
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
仍会将它们添加到 node_modules
- 使用 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
查看包装尺寸的差异: