无服务器AWS上的Google凭证json文件

时间:2018-02-07 12:09:15

标签: node.js amazon-web-services google-cloud-platform serverless-framework dialogflow

我尝试在我的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'
  }
};

1 个答案:

答案 0 :(得分:1)

这个问题的答案由两部分组成:

  1. 在无服务器.zip软件包中复制Google凭据.json文件
  2. 为amazon-linux编译gRPC c ++本机节点模块或使用REST JSON API
  3. 1)可以使用serverless-webpack pluginwebpack-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 clientc++ 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之外没有任何承诺的迹象。