Монорепозиторий можно охарактеризовать как репозиторий, содержащий более одного логического проекта. Эти проекты могут быть несвязанными, слабо связанными или связанными инструментами управления зависимостями, обычно они имеют большой размер, ветки, коммиты и работающие разработчики.

Бессерверные вычисления, такие как AWS Serverless, предлагают ряд преимуществ по сравнению с традиционной облачной или серверно-ориентированной инфраструктурой. Для многих разработчиков бессерверные архитектуры предлагают большую масштабируемость, большую гибкость и более быстрое время выпуска, при меньших затратах. Благодаря бессерверным архитектурам разработчикам не нужно беспокоиться о покупке, настройке и управлении внутренними серверами.

В этой статье рассказывается, как создать бессерверное приложение AWS с помощью Nx Dev Tool Extension и Serverless Framework.

Создание рабочей области и библиотеки с помощью Nx

Выполните эту команду, чтобы создать рабочую область.

npm init nx-workspace myworkspace

В этом примере я использую пустую рабочую область и Angular CLI (если вы используете VSCode, вы можете использовать плагин Angular Console для создания приложений, библиотек и т. Д.).

С пустым рабочим пространством Nx нет приложений, которые нужно создавать, обслуживать и тестировать. Команда добавляет в рабочую область возможности приложения узла.

cd myworkspace && npm install --save-dev @nrwl/node

После добавления возможности я создаю два приложения.

ng g @nrwl/node:application hello-app ng g @nrwl/node:application greeting-app

И библиотека.

ng g @nrwl/workspace:lib common-util

Применение бессерверной инфраструктуры к рабочей области

Для создания бессерверного приложения AWS с помощью Serverless Framework приложению необходим файл serverless.yml.

В каталоге hello-app добавляем файл serverless.yml с содержимым.

service: hello-app
provider:
  name: aws
  runtime: nodejs10.x
  stage: dev
  region: us-east-1
  webpack:
    webpackConfig: 'webpack.config.js'
    includeModules: true
    packager: 'npm'
    packExternalModulesMaxBuffer: 204800 
functions:
  hello: ${file(apps/hello-app/src/functions/hello/hello.yml)}
plugins:
  - serverless-webpack

Точно так же добавьте serverless.yml в каталог welcome-app.

// Update service: greeting-app ... functions: greeting: ${file(apps/greeting-app/src/functions/greeting/greeting.yml)}

Добавьте библиотеки для AWS и Serverless.

npm install --save aws-lambda npm install --save-dev serverless serverless-webpack tsconfig-paths-webpack-plugin

Подробнее о бессерверном плагине вы можете узнать здесь. Затем добавьте файл webpack.config.js в корневой каталог рабочей области.

const path = require('path');
const slsw = require('serverless-webpack');
const nodeExternals = require('webpack-node-externals');
const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin');

module.exports = {
  externals: [nodeExternals()],
  devtool: 'source-map',
  entry: slsw.lib.entries,
  resolve: {
    extensions: ['.js', '.json', '.ts', '.tsx'],
    plugins: [
      new TsconfigPathsPlugin()
    ]
  },
  target: 'node',
  module: {
    rules: [
      {
        test: /\.ts(x?)$/,
        use: [
          {
            loader: 'ts-loader'
          }
        ]
      }
    ]
  },
  plugins: [],
  mode: slsw.lib.webpack.isLocal ? 'development' : 'production',
  stats: 'minimal', // errors-only, minimal, none, normal, verbose
  output: {
    libraryTarget: 'commonjs',
    path: path.resolve(__dirname, '.webpack'),
    filename: '[name].js'
  }
};

См. Подробнее serverless-webpack.

Структура рабочего пространства.

Чтобы проиллюстрировать, насколько полезными могут быть библиотеки. Обновление файла common-util.ts в библиотеке common-util.

export const getMessage = () => { return 'This is a message from workspace library'; };

Добавьте файлы hello.handler.ts, hello.yml и index.ts в каталог functions / hello и также обратитесь к библиотеке common-util, см. фрагмент кода ниже:

//hello.handler.ts
import { Handler, Context } from 'aws-lambda';
import { getMessage } from '@myworkspace/common-util';

export const handler: Handler = async (event: any, context: Context) => {
  return {
    statusCode: 200,
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({ message: getMessage() })
  };
};

//hello.yml
handler: apps/hello-app/src/functions/hello/index.handler
description: A function for Hello Application
events:
  - http:
      path: /hello
      method: get

//index.ts
export * from './hello.handler';

Аналогичным образом добавьте файлы welcome.handler.ts, welcome.yml и index.ts в functions / welcome. каталог с содержимым как hello.handler.ts, hello.yml.

Развертывание

Чтобы развернуть AWS Serverless Application с Serverless Framework, вам необходимо установить AWS CLI и настроить AWS Credential. Поскольку каждое приложение отделено, я могу развернуть каждое приложение отдельно.

sls deploy --config apps/hello-app/serverless.yml 
sls deploy --config apps/greeting-app/serverless.yml

Результат:

Заключение

В этом руководстве бессерверное приложение AWS создано с использованием замечательных инструментов и шаблонов, которые сделают нашу жизнь как разработчиков довольно приятной.

Первоначально опубликовано на https://blog.innomizetech.com.