The ultimate Serverless DevX: Serverless Framework, AWS CDK и Typescript

Serverless Framework и AWS CDK — два важных игрока в экосистеме бессерверной разработки. На первый взгляд можно подумать, что они конкуренты, но я уже полгода сочетаю Serverless Framework, AWS CDK и Typescript для разработки облачных нативных приложений. По моему опыту, в основном это было легко — в основном 🥺.

TL;DR

Сочетание Serverless Framework и AWS Cloud Development Kit образует один из лучших стеков для надежного и быстрого создания надежных облачных нативных приложений.

Для достижения этого я рекомендую использовать плагин @swarmion/serverless-cdk-plugin для бесшовной интеграции ресурсов AWS CDK в Serverless Framework.

Самые убедительные плюсы:

  • 🏗 Используйте преимущества no. 1 (Serverless Framework) потрясающее сообщество и опыт разработчиков для создания и развертывания лямбд,

  • 🍭 Легко создавать другие ресурсы AWS благодаря более высокоуровневым абстракциям AWS CDK,

  • 👷 Создайте современное бессерверное приложение, написав логику и конфигурацию вашего приложения в одном репозитории с помощью Typescript (сильно типизированная инфраструктура как код 🧞♂️!).

Как это работает?

  1. Создайте свое облачное нативное приложение с помощью Serverless Framework.

  2. Создавайте не-лямбда ресурсы AWS (таблицы DynamoDB, очереди SQS, шины событий EventBridge и т.д.), используя aws-cdk-lib (aws-cdk v2).

  3. Используйте мощную экосистему плагинов Serverless Framework и установите плагин @swarmion/serverless-cdk-plugin. Ознакомьтесь с нашим открытым репозиторием на github!

  4. Ссылайтесь на конструкцию aws-cdk в конфигурационном файле Serverless Framework.

  5. Вот и все! Serverless Framework без проблем предоставляет эти ресурсы при развертывании.

// code/serverless-config.ts

// serverless.ts

import { AWS } from '@serverless/typescript';

import type { ServerlessCdkPluginConfig } from '@swarmion/serverless-cdk-plugin';

import { MyCdkConstruct } from 'resources/dynamodb';

const serverlessConfiguration: AWS & ServerlessCdkPluginConfig = {
  service: `my-service`,
  frameworkVersion: '*',
  provider: {
    name: 'aws',
    runtime: 'nodejs14.x',
  },

  // Import the plugin in your serverless configuration.
  plugins: ['@swarmion/serverless-cdk-plugin'],

  // Reference your custom aws-cdk construct at the "construct" key. That's it!
  construct: MyCdkConstruct,
  // ...More configuration props
};

module.exports = serverlessConfiguration;
Вход в полноэкранный режим Выход из полноэкранного режима

Создание высококачественных приложений Serverless

Написание логики и инфраструктуры приложения в виде кода в одном репозитории и на одном языке — это очень приятно. Тем не менее, пробовали ли вы когда-нибудь инициализировать таблицу DynamoDB, очередь SQS или шину EventBus с помощью Serverless Framework? Будучи лямбда-ориентированным по своему дизайну, этот фреймворк не предоставляет вам другие ресурсы AWS «из коробки».

Отсюда у вас есть два варианта:

  1. Развертывание других ресурсов отдельно, например, с помощью AWS CDK. Себастьян Билле написал классную статью на эту тему. Основным следствием такого подхода является наличие двух отдельных стеков, которые развертываются независимо друг от друга. Тем не менее, одно из развертываний может оказаться неудачным, например, из-за круговой зависимости между двумя стеками — например, SQS => Lambda => SQS flow.

  2. Поручите Serverless Framework обеспечивать ваши ресурсы в рамках цикла развертывания. В качестве компромисса придется написать ванильную Cloud Formation. Если вы никогда не делали этого раньше, поверьте мне, что это DevX faux-pas 🙅. К счастью, Фред Бартелет написал потрясающую статью о том, как заменить ванильную Cloud Formation конструкциями AWS CDK.

По сути, классы стека aws-cdk имеют метод транспонирования, который позволяет транспонировать написанный вами код Typescript в Cloud formation. Недостатком этого процесса является необходимость написания большого количества шаблонного кода каждый раз, когда вам нужен новый ресурс (очередь SQS и т.д.).

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

Что если бы можно было создать потрясающее Serverless-приложение, использовать AWS CDK для определенных ресурсов и при этом иметь только один процесс развертывания и никакого boilerplate?

Появился @swarmion/serverless-cdk-plugin: мост между Serverless Framework и AWS CDK.

В Kumo мы работали над созданием потрясающего инструмента для достижения именно этого: полного и стабильного стека typescript для создания бессерверных приложений. Знаете ли вы? Наш плагин легко интегрируется с Swarmion, фреймворком для микросервисов Serverless Typescript.

Как работает плагин?

После развертывания (или упаковки) вашего Serverless-приложения (например, sls deploy), @swarmion/serverless-cdk-plugin преобразует код вашей конструкции aws-cdk в Cloud Formation и интегрирует его в цикл развертывания Serverless под капотом. По сути, это своего рода транспиляция (typescript => cloud formation). Затем Serverless Framework обеспечивает его развертывание.

🚨 Предостережения: Использование AWS CDK с Serverless Framework не позволяет развертывать ресурсы, для которых требуется так называемый bootstrap-стек.

Например, использование AWS CDK для создания лямбда-функции. В этом случае стек bootstrap заключается в инициализации ведра S3 с кодом лямбды. Затем на этот S3 bucket можно будет ссылаться и использовать его на более поздней стадии цикла развертывания для инициализации функции лямбда.

Таким образом, попытка создать конструкции, требующие стека boostrap, приведет к странной ошибке во время сборки. Плагин помогает в том, что он выбрасывает очень явную ошибку. Единственный способ развернуть такие конструкции — использовать отдельный процесс развертывания.

Как я могу использовать плагин в своем приложении Serverless Framework?

🎙 Отказ от ответственности: Этот плагин предполагает, что вы используете Typescript в качестве основного языка вашего приложения Serverless. Мост, созданный между AWS CDK и Serverless Framework, предполагает наличие у пользователей конфигурационного файла serverless.ts (простите всех ямщиков 💅).

Импортируйте и используйте @swarmion/serverless-cdk-plugin в конфигурационном файле serverless.ts вашего сервиса (как показано в приведенном выше фрагменте кода).

Напишите конструкции aws-cdk — если вы хотите создать более одной конструкции, используйте композицию AWS CDK для создания конструкции более высокого уровня — ссылайтесь на нее в файле serverless.ts, и та-да 🥳 🤩! При запуске вашего сценария развертывания Serverless Framework распознает, что вы хотите предоставить эти ресурсы и развернуть их.

Например, если вы хотите предоставить таблицу DynamoDB:

// code/serverless-construct-testcase.ts

import { AttributeType, BillingMode, Table } from 'aws-cdk-lib/aws-dynamodb';
import { Construct } from 'constructs';

export class MyCdkConstruct extends Construct {
  public dynamodbArn: string;
  public dynamodbName: string;

  constructor(scope: Construct, id: string) {
    super(scope, id, props);

    const { tableArn, tableName } = new Table(this, 'MyDynamoDBTable', {
      partitionKey: { name: 'PK', type: AttributeType.STRING },
      sortKey: { name: 'SK', type: AttributeType.STRING },
      billingMode: BillingMode.PAY_PER_REQUEST,
    });

    this.dynamodbArn = tableArn;
    this.dynamodbName = tableName;
  }
}
Войдите в полноэкранный режим Выйдите из полноэкранного режима

Что вы получаете:

  • Надежный стек «все-в-одном» для создания бессерверных приложений!

  • Функции-помощники для ссылок на ресурсы внутри ваших лямбд, поставляемые вместе с плагином! Например, ваши лямбда-функции теперь могут обращаться к атрибутам вашей DynamoDB безопасным для типов образом (ARN, имя таблицы и многое другое)!

  • Более того, плагин раскрывает контекст Serverless внутри вашей конструкции! Это позволяет улучшить DevX: больше не нужно жестко кодировать ARN или информацию о ресурсах, поступающую из контекста Serverless, в коде своих конструкций. При использовании плагина serverless <> cdk теперь вы можете использовать конструкцию как ServerlessCdkPlugin.ServerlessConstruct. В результате ваша конструкция получит доступ к контексту и конфигурации Serverless Framework.

// code/serverless-construct-testcase-with-serverless.ts

// MyCdkConstruct.ts

import { AttributeType, BillingMode, Table } from 'aws-cdk-lib/aws-dynamodb';
import { Construct } from 'constructs';

import { ServerlessConstruct, ServerlessProps } from 'types';

export class MyCdkConstruct extends ServerlessConstruct {
  public dynamodbArn: string;
  public dynamodbName: string;
  public testServerlessConfigValue: string | undefined;

  constructor(scope: Construct, id: string, props: ServerlessProps) {
    super(scope, id, props);

    const { tableArn, tableName } = new Table(this, 'MyDynamoDBTable', {
      partitionKey: { name: 'PK', type: AttributeType.STRING },
      sortKey: { name: 'SK', type: AttributeType.STRING },
      billingMode: BillingMode.PAY_PER_REQUEST,
    });

    this.dynamodbArn = tableArn;
    this.dynamodbName = tableName;

    /*
      Serverless context variables is now accessible inside the CDK code!
      There are numerous other use-cases, e.g. accessing your lambda's names.
     */
    this.testServerlessConfigValue = props.serverless.resources.Outputs?.TestOutput.Description;
  }
}
Вход в полноэкранный режим Выход из полноэкранного режима

Привет 👷, большое спасибо, что прочитали эту статью. Всего хорошего!

Оцените статью
devanswers.ru
Добавить комментарий