Рубрики
Uncategorized

Изучение AWS CDK — Загрузка Dynamodb с пользовательскими ресурсами

Одна из причин, причинах AWS CDK у меня так заинтригована, это обещание быть способным раскрутить окружающую среду. Помечено с AWS, DEVOPS, Teadercript, Serverless.

Одна из причин AWS CDK Я так заинтригован, это обещание быть способным раскрутить среду за считанные минуты. Если я смогу обеспечить всю свою инфраструктуру, базы данных и приложения с одной структурой, которая является контролируемым источником, я могу сделать все виды, которые большинство вещей, которые большинство инженерных команд только мечтали:

  • Выполните тестовые среды, чтобы избежать конфликтов Logjams/ветвей.
  • Команда или отдельные разрабатывающие песочницы повернуты (и вниз) за считанные минуты.
  • Изолированные среды для CI/CD и стратегии автоматизации тестирования.
  • Постановка/демонстрация/Eva/Eva/Load Exture Edits по запросу и отброшена после использования.
  • Выделение клиентов на отдельные учетные записи или VPC.

Управляющие данные могут быть несколько сложными, когда дело доходит до того, чтобы попытаться снять что-то вроде этого Поэтому я действительно хотел узнать, смогу ли я использовать CDK для загрузки базы данных, которую я только что предоставил. Счета нового разработчика со всей инфраструктурой и предоставленными приложениями, но никаких данных, вероятно, не собирается доставить главный опыт, на который я стремлюсь. Итак, как CDK может помочь мне встретить эту цель?

Оглавление

  • Обзор CDK и Tools
  • TL; доктор
  • Динамодб
  • Создать таблицу
  • AWS Пользовательский ресурс
  • Поддельные друзья через Faker
  • Позвоните в API
  • Заставь его быстрее!
  • И быстрее!
  • Неограниченные данные!
  • Следующие шаги

Обзор CDK и Tools

Я объяснил свои мысли о том, как настроить проекты CDK в моей последней статье. Если вы хотите узнать, почему я изменил некоторые из установчиков проекта или мои идеи о том, как будет сделано львая, это все там.

TL; доктор

Пропустить статью и проверить код , Если вы предпочитаете.

Динамодб

Dynamodb Управляемое решение NoSQL от AWS. Я не собираюсь делать глубокое погружение в динамодб здесь. Я выбрал Dynamodb для этого примера, потому что это безведно и полно удалось. Это сделает его дешевым, чтобы играть с и быстро и быстро играть. Я еще не сделал это, но я уверен, что мы можем применить аналогичные методы RDS.

Создать таблицу

Нет необходимости создавать схемы или определять колонны с dynamodb. Мне нужно только создать Таблица и укажите его Partitingkey атрибут.

Естественно, это просто в CDK.

import { AttributeType, Table } from '@aws-cdk/aws-dynamodb';
import { Construct, RemovalPolicy, Stack, StackProps } from '@aws-cdk/core';

export class CdkDynamoCustomLoaderStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    const tableName = 'friends';

    new Table(this, 'FriendsTable', {
      tableName,
      partitionKey: { name: 'id', type: AttributeType.STRING },
      removalPolicy: RemovalPolicy.DESTROY,
    });
  }
}

Я создаю таблицу под названием Друзья Отказ Поскольку жизнь разработчика одинока, я буду использовать пользовательский ресурс AWS для создания некоторых друзей.

AWS Пользовательский ресурс

Сначала немного пугало, чтобы подумать, что я просто изучаю CDK, и я уже хочу идти вперед и начать создавать пользовательские ресурсы, но на самом деле они довольно просты и просто используют. Существует две стратегии, поддерживаемые CDK, Рамки провайдера и Пользовательские ресурсы для AWS APIS Отказ

Framework Provider позволяет мне написать собственный изготовленный на заказ AUMBDA Handler для событий жизненного цикла ресурсов, в то время как пользовательские ресурсы для APIS AWS позволят мне позвонить AWS API во время моего развертывания. Это будет более простым вариантом Так что это то, что я буду использовать в этой статье.

Поддельные друзья через Faker

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

import { commerce, name, random } from 'faker';

// now inside my stack constructor

    private generateItem = () => {
    return {
      id: { S: random.uuid() },
      firstName: { S: name.firstName() },
      lastName: { S: name.lastName() },
      shoeSize: { N: random.number({ max: 25, min: 1, precision: 0.1 }) },
      favoriteColor: { S: commerce.color() },
    };
  };

Каждый атрибут определяет тип в этом случае S для строки и N для числа. Если бы я использовал mysql вместо dynamodb, это, вероятно, будет строка SQL.

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

interface IFriend {
  id: { S: string };
  firstName: { S: string };
  lastName: { S: string };
  shoeSize: { N: number };
  favoriteColor: { S: string };
}

Обратите внимание, что официальный Руководство по типографии говорит не префикс вашего интерфейса, но мой Правило отвлечения ожидает этого. Я просто не собираюсь войти в это прямо сейчас.

Позвоните в API

Я буду использовать Awscustomresource Конструктор, чтобы вызвать API dynamodb. Какой CDK будет делать здесь, создает функцию лямбда и используйте SDK для JavaScript, чтобы сделать вызов.

import { AwsCustomResource } from '@aws-cdk/custom-resources';

// inside constructor

    new AwsCustomResource(this, 'initDBResource', {
      onCreate: {
        service: 'DynamoDB',
        action: 'putItem',
        parameters: {
          TableName: tableName,
          Item: this.generateItem(),
        },
        physicalResourceId: 'initDBData',
      },
    });

Этот код создаст функцию Lambda, которая вызывает AWS JavaScript SDK. Это позвонит Путитем на Dynamodb Импортируйте и пропустите его свои параметры. Я могу исследовать этот API в SDK Docs , но, к сожалению, не в типов CDK, так как они не достаточно узки. Возможно когда-нибудь.

Обратите внимание, что это создает ресурс с данным ID и выполняет этот вызов API, когда он создан. Есть Onupdate и OnDelete Вызывы также доступны.

С вышеуказанным кодом, я могу NPM запустить сборку (или смотреть) и CDK развертывает И я найду свой стол, созданный и имеет один друг в этом.

Так как я использовал Oncreate Вызов API выполнен только на моем первом развертывании — когда создается пользовательский ресурс. Если я изменил это на Onupdate Тогда я бы получил новый каждый раз, когда я развернул.

Сломать это чуть больше, когда я NPM запустить сборку Это транкирует код TymerctStry в JavaScript. Теперь у меня есть код JavaScript, который вызывает некоторые методы уборки и в конечном итоге создает шаблон облака отчета. Если я надену структуры программирования, такие как условные операторы и петли в мой код CDK, действительно важно понимать, когда эти условные и петли будут оцениваться, и то есть когда шаблон генерируется.

Заставь его быстрее!

Добавление всего одна запись на запуск может работать для некоторых случаев использования, но что, если это просто недостаточно данных, чтобы быть полезным? Dynamodb имеет BatchwriteItem метод, который может помочь. Это позволяет мне поставить 25 предметов в мой стол в одном вызове API. Я собираюсь добавить еще один частный метод, который поможет мне генерировать данные в партиях 25.

  private generateBatch = (batchSize = 25): { PutRequest: { Item: IFriend } }[] => {
    return new Array(batchSize).fill(undefined).map(() => {
      return { PutRequest: { Item: this.generateItem() } };
    });
  };

Теперь мне просто нужно поменять Путитем с BatchwriteItem и обновить свой блок параметров, чтобы выглядеть так:

          parameters: {
            RequestItems: {
              [tableName]: this.generateBatch(),
            },
          },

BatchwriteItem позволяет писать на несколько таблиц, поэтому полезная нагрузка просто немного отличается — Я указываю таблицу на предмет, который я хочу вставить.

И быстрее!

Теперь, что если 25 предметов все еще недостаточно? Я мог бы поставить свой ресурс в петлю.

  for (let i = 0; i < 10; i++) {
      new AwsCustomResource(this, `initDBResourceBatch${i}`, {
        onCreate: {
          service: 'DynamoDB',
          action: 'batchWriteItem',
          parameters: {
            RequestItems: {
              [tableName]: this.generateBatch(),
            },
          },
          physicalResourceId: `initDBDataBatch${i}`,
        },
      });
    }

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

Неограниченные данные!

Если мне нужно генерировать более нескольких сотен элементов, я могу использовать структуру провайдера и написать мою собственную функцию лямбда, чтобы сделать именно то, что я хочу. Может быть, я сделаю это выстрел в будущем пост. Для действительно больших объемов данных мне может потребоваться начать смотреть на Трубопровод для данных Отказ

Следующие шаги

Я бы не считал этот пример готов к широкому использованию, но я получил довольно хорошее понимание пользовательских ресурсов и их использование. Я думаю, что обрести ограничения размера шаблона, что я бы действительно хотел сделать, это загружать какую-то полезную нагрузку CSV или JSON на S3 и глотать, что через Lambda, когда я создаю свои ресурсы. Я также хотел бы отделить свои проблемы, публикую это как отдельная конструкция или, по крайней мере, импортируя его в мой основной стек, а не просто добавлять частные участники в класс.

Надеюсь, это было полезно и информативно. Было бы рад видеть, как другие испытывают опыт с загрузкой данных через CDK или CloudFormation (или даже другие средства) в комментариях!

Крышка изображения

Оригинал: «https://dev.to/elthrasher/exploring-aws-cdk-loading-dynamodb-with-custom-resources-jlf»