serverless-offline не может одновременно запускать среду выполнения Node и Python - PullRequest
0 голосов
/ 27 мая 2020

Когда я запускаю serverless offline с обоими средами выполнения Node и Python, я получаю следующую ошибку при достижении конечной точки Python:

Traceback (most recent call last):
  File "/foo/node_modules/serverless-offline/dist/lambda/handler-runner/python-runner/invoke.py", line 76, in <module>
    module = import_module(args.handler_path.replace(os.sep, '.'))
  File "/foo/venv/lib/python3.6/importlib/__init__.py", line 121, in import_module
    raise TypeError(msg.format(name))
TypeError: the 'package' argument is required to perform a relative import for '.webpack.service.src.utilsPy'

Я могу успешно перейти в среду выполнения Node.

Если я вместо этого запустил serverless offline --location ., я смогу успешно go перейти на конечную точку Python, но конечная точка узла выдает мне эту ошибку

Failure: Cannot find module '/foo/src/utils'

Require stack: <removed stack trace>

Есть ли способ запустить оба офлайн? Я могу развернуть обе среды выполнения, и это работает, просто бессерверный автономный режим не работает. Исходные файлы ниже.

PS: Я создал проблему в бессерверном автономном репозитории.

Пример кода

  • файл: serverless.yml
service  :
  name: ${self:custom.serviceName}
custom   :
  packageJson       : ${file(./package.json)}
  serviceName       : ${self:custom.packageJson.name}
  webpack           :
    webpackConfig : ./webpack.config.js
    includeModules: true
  serverless-offline:
    httpPort: 4000
  pythonRequirements:
    dockerizePip: true
plugins:
  - serverless-webpack
  - serverless-offline
  - serverless-pseudo-parameters
  - serverless-python-requirements
provider :
  name              : aws
  runtime           : nodejs12.x
  <removed a bunch of parameters not relevant to this>
functions:
 - ${file(some-other-file-not-relevant.yml)}
  - health:
      name       : ${self:service}-${self:provider.stage}-health
      description: Health check endpoint
      handler    : src/utils.handler
      memorySize : 128
      timeout    : 10
      events     :
        - http:
            path  : /health
            method: GET
            cors  : true
  - health-py:
      name       : ${self:service}-${self:provider.stage}-health-py
      runtime    : python3.6
      description: Health check endpoint for python
      handler    : src/utilsPy.handler
      memorySize : 128
      timeout    : 10
      events     :
        - http:
            path  : /health-py
            method: GET
            cors  : true
  • файл: webpack.config. js
const path = require('path');
const slsw = require('serverless-webpack');
const nodeExternals = require('webpack-node-externals');
const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');

// CUSTOM CODE: Remove Python files as entry points
const entries = {};
Object.keys(slsw.lib.entries).forEach(
    key => {
      if (!slsw.lib.entries[key].match(/\.py$/)) {
        entries[key] = [slsw.lib.entries[key]]
      }
    }
);

module.exports = {
  context: __dirname,
  mode: slsw.lib.webpack.isLocal ? 'development' : 'production',
  entry: entries, // CUSTOM CODE: Uses custom entry above
  devtool: slsw.lib.webpack.isLocal ? 'cheap-module-eval-source-map' : 'source-map',
  resolve: {
    extensions: ['.mjs', '.json', '.ts'],
    symlinks: false,
    cacheWithContext: false,
  },
  output: {
    libraryTarget: 'commonjs',
    path: path.join(__dirname, '.webpack'),
    filename: '[name].js',
  },
  target: 'node',
  externals: [nodeExternals()],
  module: {
    rules: [
      // all files with a `.ts` or `.tsx` extension will be handled by `ts-loader`
      {
        test: /\.(tsx?)$/,
        loader: 'ts-loader',
        exclude: [
          [
            path.resolve(__dirname, 'node_modules'),
            path.resolve(__dirname, '.serverless'),
            path.resolve(__dirname, '.webpack'),
          ],
        ],
        options: {
          transpileOnly: true,
          experimentalWatchApi: true,
        },
      },
    ],
  },
  plugins: [
    // new ForkTsCheckerWebpackPlugin({
    //   eslint: true,
    //   eslintOptions: {
    //     cache: true
    //   }
    // })
  ],
};
  • файл: utils. ts
import { APIGatewayProxyHandler } from 'aws-lambda';
import 'source-map-support/register';
/**
 * A simle health check endpoint...
 * @param event
 * @param _context
 */
export const handler: APIGatewayProxyHandler = async (event, _context) => {
    return {
        statusCode: 200,
        body: JSON.stringify({
            message: 'Healthy!',
            input: event,
        }, null, 2),
    };
};
  • файл: utilsPy.py
"""
    A simple health checkpoint for python
"""
import json
def handler(event, context):
    return {
            'statusCode': 200,
            'body':
            json.dumps({
              'message':'Healthy Python!',
              'input': event
              })
            }
...