我尝试在我的serverless项目中使用DialogFlow(API.AI或Google Cloud Dialogflow API)但问题是我无法找到将google凭据json文件推送到无服务器端的任何解决方案。我跟着this tutorial(它在谷歌云网站上)并且它在我的本地正常工作但不在lambda上工作。我甚至试图从webpack复制文件,但它仍然无法正常工作。对于DialogFlow,我使用的是dialogflow v2 nodejs library。
---编辑
我在lambda上遇到这个错误,这与我找不到json文件有关,因为我没有使用这个模块(dialogFlow正在使用)
(rejection id:2):错误:找不到模块'/var/task/node_modules/grpc/src/node/extension_binary/node-v48-linux-x64-glibc/grpc_node.node'
---编辑结束
node.js:6.x
无服务器:1.26
====
serverless.yml
service: test-dialogflow-svc
plugins:
- serverless-webpack
- serverless-plugin-common-excludes
- serverless-offline
- serverless-offline-scheduler
package:
individually: true
include:
- googleCredentials.json
custom:
webpackIncludeModules: true
serverless-offline:
port: 3000
provider:
name: aws
runtime: nodejs6.10
stage: dev
region: eu-west-2
memorySize: 128
timeout: 5
environment:
GOOGLE_APPLICATION_CREDENTIALS: './googleCredentials.json'
functions:
hello:
handler: src/handlers/helloworld.handler
events:
- http:
path: hello
method: get
package:
include:
- googleCredentials.json
webpack.config.js
const path = require('path');
const slsw = require('serverless-webpack');
const nodeExternals = require('webpack-node-externals');
const WebpackPluginCopy = require('webpack-plugin-copy');
module.exports = {
entry: slsw.lib.entries,
target: 'node',
resolve: {
extensions: ['.js', '.json', '.ts', '.tsx']
},
externals: [nodeExternals()],
module: {
rules: [
{
test: /\.ts(x?)$/,
use: [
{
loader: 'awesome-typescript-loader'
}
]
}
]
},
plugins: [ // I tried to copy file with webpack as well
new WebpackPluginCopy([{
copyPermissions: true,
from: './googleCredentials.json'
}])
],
output: {
libraryTarget: 'commonjs',
path: path.join(__dirname, '.webpack'),
filename: '[name].js'
}
};
答案 0 :(得分:1)
这个问题的答案由两部分组成:
1)可以使用serverless-webpack plugin和webpack-plugin-copy将Google凭据.json文件复制到.zip包中。
serverless.yml 的
...
plugins:
- serverless-webpack
...
webpack.config.js 的
...
const WebpackPluginCopy = require('webpack-plugin-copy');
module.exports = {
...
plugins: [
new WebpackPluginCopy([{
copyPermissions: true,
from: `./googleCredentials.json`,
}])
],
};
2)DialogFlow节点客户端使用具有gRPC client的c++ native module dependency。对于像Datastore这样的Google Cloud Platform产品,所有其他节点客户端也是如此。
您需要通过Docker或EC2在计算机上的amazon-linux实例上构建本机c ++模块。
C++ Addons as AWS Lambda functions
Using Packages and Native nodejs Modules in AWS Lambda
REST JSON API而不是gRPC
由于原生c ++模块很难构建,并且所有Google Cloud Platform节点客户端也向您的无服务器.zip包添加~30mb,您可能希望避免使用gRPC客户端并查找/编写调用{{3相反。 HTTP上的JSON具有比gRPC更高的延迟,但除非您有多层微服务相互调用,否则这并不重要。
将来,节点gRPC客户端可以在没有使用javascript的c ++模块的情况下工作,并且权重远低于30mb但是在撰写本文时除了REST JSON API之外没有任何承诺的迹象。