Создайте простой стартовый шаблон бессерверного приложения TypeScript и настройте учетные данные, необходимые для развертывания в AWS.

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

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

Итак, я пишу простое пошаговое руководство по созданию шаблона проекта Serverless Typescript, готового к развертыванию в AWS, на основе этого небольшого полезного опыта.

Вот некоторые вещи, которыми мы займемся:

  • Бессерверный фреймворк
  • Машинопись
  • ESLint, красивее
  • Учетные данные AWS (пользователь IAM, группа, политика)
  • Развертывание в AWS без сервера (создание конечной точки шлюза Lambda, API и т. Д.)

Вы можете найти окончательный результат на моем GitHub, готовый к использованию с Docker.

Требования

npm install -g serverless

Инициализация проекта

Давайте начнем инициализировать наш проект с помощью бессерверного шаблона aws-nodejs-typescript.

serverless create --template aws-nodejs-typescript

Теперь у нас есть простой шаблон с некоторыми исходными файлами: пример функции (handler.ts), бессерверная конфигурация (serverless.yml), конфигурация TypeScript (tsconfig.json) и webpack.config.js.

Давайте добавим еще несколько конфигураций для включения нашего приложения.

Добавить ESLint с поддержкой TypeScript

TypeScript ESLint

npm install --save-dev eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin
  • Создать .eslintrc.js

Этот файл предназначен для настройки нашего процесса линтинга, чтобы легко поддерживать качество нашего кода.

  • Создайте .eslintignore (файлы, которые мы не хотим пачкать):
node_modules
.serverless
.vscode
*.config.js
.webpack
**/*.js

Добавить красивее

С линтером красивее

Просто чтобы быть уверенным, что мы сохраняем чистый код в формате.

npm install --save-dev prettier eslint-config-prettier eslint-plugin-prettier
  • Создайте .prettierrc.js (просто простую стартовую конфигурацию Prettier):
module.exports = {
  printWidth: 120,
  singleQuote: true,
  trailingComma: 'all',
};
  • Создайте .prettierignore (файлы, для которых не нужно запускать Prettier):
node_modules
.serverless
.webpack
  • Обновление .eslintrc.js расширяет правила (просто добавьте два правила, чтобы правильно интегрировать Prettier в наш рабочий процесс линтинга и предотвратить конфликт):
extends: [
  'eslint:recommended',
  'plugin:@typescript-eslint/eslint-recommended',
  'plugin:@typescript-eslint/recommended',
  'prettier/@typescript-eslint',
  'plugin:prettier/recommended',
],

Webpack

Включите плагин Webpack, который запускает проверку типов TypeScript в отдельном процессе.

Обновить webpack.config.js:

plugins: [
  new ForkTsCheckerWebpackPlugin({
    eslint: true,
    eslintOptions: {
      cache: true,
    },
  }),
],

Обновить обработчик правильных типов

Давайте возьмем updatehandler.ts, установив правильные типы, чтобы проверка типов могла быть успешной.

Скрипты NPM

Давайте добавим несколько скриптов для запуска нашего приложения в package.json:

"scripts": {
  "lint": "eslint . --ext js,ts --cache --fix",
  "prettier": "prettier --list-different './**/*.{js,ts}'",
  "typecheck": "tsc --noEmit",
  "test": "echo \"Error: no test specified\" && exit 1"
},

Попробуй это:

# linter
npm run lint
# prettier
npm run prettier
# type checking
npm run typecheck

Теперь мы готовы развернуть наше приложение в AWS. Не совсем так. Нам нужно настроить некоторые учетные данные AWS, и особенно нам нужен пользователь AWS для Serverless для развертывания нашего приложения.

Если у вас еще нет учетной записи AWS, я предлагаю вам быстро создать ее.

Настроить учетные данные AWS

Здесь мы хотим создать новую политику IAM и присоединить ее к новой группе IAM, к которой мы присоединим нашего нового пользователя.

Создать пользователя IAM

Войдите в консоль AWS и перейдите в службу управления идентификацией и доступом (IAM). Создайте нового пользователя serverless-deploy с программным доступом. Не давайте ему никаких разрешений.

После этого вы сможете сохранить свои учетные данные (не теряйте их, иначе вам нужно будет получить новые).

Давайте посмотрим ниже, как использовать ваши учетные данные. (Вы можете найти различные способы использования ваших учетных данных с Serverless в официальной документации.)

Настройте свои учетные данные с помощью Serverless

Объявите свой профиль AWS в ~/.aws/credentials (не забудьте указать свои собственные значения):

[serverless-deploy]
aws_access_key_id = XXX
aws_secret_access_key = XXX
region = XXX

Установите этот профиль в своем serverless.yml, чтобы Serverless мог использовать его для развертывания.

provider:
  profile: serverless-deploy

Или вы можете передать его с аргументом --profile команде serverless deploycommand.

Теперь попробуйте развернуть бессерверное приложение.

serverless deploy -v
# -v enables verbose output so you can see what happens

Вы должны получить такую ​​ошибку:

serverless-deploy is not authorized to perform: cloudformation:DescribeStacks

Это достаточно ясно :) Итак, теперь нам нужно предоставить этому пользователю IAM разрешение нашему пользователю.

Группа IAM и политика IAM

Вернемся к консоли AWS и создадим новую группу IAM serverless-deploy-group без какой-либо политики.

Теперь создадим новую политику IAM:

  • Создайте новую политику IAM.
  • Добавьте политику для службы CloudFormation, разрешите List:DescribeStacks действие.
  • Укажите, что нужно применить это разрешение ко всем ресурсам, и нажмите кнопку «Обзор политики». (При необходимости вы можете указать определенные ресурсы для применения разрешений.)
  • Назовите эту политику serverless-deploy-policy (просто для единообразия) и завершите ее создание.

Теперь вернитесь к группе serverless-deploy-group, которую мы создали, и присоедините ее к этой политике.

Затем вернитесь к пользователю serverless-deploy и присоедините его к группе serverless-deploy-group.

А теперь попробуем развернуть еще раз:

serverless deploy -v

Теперь у вас должна появиться следующая новая ошибка:

serverless-deploy is not authorized to perform: cloudformation:CreateStack on resource

Теперь нам нужно отредактировать нашу политику и добавить несколько новых разрешений.

Расширьте свою политику IAM

Вернитесь к serverless-deploy-policy политике, которую мы создали, отредактируйте ее и добавьте разрешение CreateStack для службы CloudFormation.

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

Пример базовой политики

Для этого примера проекта требуются минимальные разрешения:

После того, как вы установили окончательную политику, вы можете выполнить полное развертывание.

Развертывать

serverless deploy -v

По умолчанию предполагается стадия разработки.

Что делает Serverless?

  • Пакеты нашего приложения (с webpack)
  • Создает стек CloudFormation
  • Создает сегмент S3
  • Загружает шаблон CloudFormation в S3
  • Загружает наш пакет приложений в S3
  • Предоставляет роли IAM
  • Предоставляет группы журналов
  • Подготавливает конечные точки ApiGateway
  • Предоставляет функцию лямбда для нашего сервиса

Теперь вы можете вызвать свою службу:

serverless invoke -f hello -l
# -f specifies the function name, -l specifies to output the logs to the console

Вы также можете протестировать его с помощью конечной точки шлюза API, напечатанной в вашем терминале после завершения развертывания. Это должно выглядеть так (замените [xxxxxx] и [регион]):

https://[xxxxxx].execute-api.[region].amazonaws.com/dev

Удалить вашу службу

Вы можете просто удалить весь ранее созданный стек.

serverless remove

Заключение

Спасибо за прочтение! Надеюсь, вам понравилась эта статья, и вы вынесли из нее что-то полезное. Теперь вы должны быть готовы начать свой собственный проект с использованием Serverless, TypeScript и ESLint и развернуть его на AWS.

Вы можете найти окончательный результат этой статьи на моем GitHub, готовом к использованию с Docker.

Теперь твое время! Обновите свою функцию, обновите конфигурацию бессерверного провайдера, создайте новые функции и разверните свои собственные службы по своему усмотрению!