Создайте простой стартовый шаблон бессерверного приложения TypeScript и настройте учетные данные, необходимые для развертывания в AWS.
Работая ведущим разработчиком в отличной команде в Doctissimo, я более трех лет полностью погружаюсь в облако. Пару месяцев назад у меня была возможность инициировать и заложить основы нового полноценного бессерверного проекта, предназначенного для управления нашими различными рабочими процессами индексации, обновления и публикации контента.
Сначала я попытался черпать вдохновение из различных существующих шаблонов проектов, максимально придерживаясь лучших практик, без лишних деталей.
Итак, я пишу простое пошаговое руководство по созданию шаблона проекта Serverless Typescript, готового к развертыванию в AWS, на основе этого небольшого полезного опыта.
Вот некоторые вещи, которыми мы займемся:
- Бессерверный фреймворк
- Машинопись
- ESLint, красивее
- Учетные данные AWS (пользователь IAM, группа, политика)
- Развертывание в AWS без сервера (создание конечной точки шлюза Lambda, API и т. Д.)
Вы можете найти окончательный результат на моем GitHub, готовый к использованию с Docker.
Требования
- Node.js
- Бессерверный
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
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 deploy
command.
Теперь попробуйте развернуть бессерверное приложение.
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.
Теперь твое время! Обновите свою функцию, обновите конфигурацию бессерверного провайдера, создайте новые функции и разверните свои собственные службы по своему усмотрению!