Використання AWS DynamoDB у програмі Node.js

Основні моменти

  • DynamoDB – це потужна NoSQL база даних від AWS, здатна обробляти значні обсяги різноманітних даних без втрати продуктивності, надійності та стійкості.
  • Для початку роботи з DynamoDB у Node.js необхідно інсталювати пакет client-dynamodb з aws-sdk та налаштувати власні облікові дані.
  • DynamoDB надає прості інструменти для створення таблиць, запису та читання даних, оновлення записів і видалення їх, використовуючи методи та параметри клієнта. Це забезпечує гнучкість і масштабованість для ефективної розробки додатків.

Створення сучасних застосунків значною мірою залежить від комбінації надійних мов програмування та потужних систем баз даних.

Одним з рішень, запропонованих Amazon Web Services (AWS), є DynamoDB – інструмент, здатний кардинально змінити спосіб керування даними. Завдяки йому можна швидко розгорнути базу даних для обробки великих обсягів неоднорідної інформації.

Що таке DynamoDB?

AWS пропонує різноманітні сервіси для потреб баз даних, наприклад, Amazon RDS для реляційних баз даних і DocumentDB для баз даних документів, таких як MongoDB. DynamoDB – це база даних NoSQL, яка зберігає дані у форматі “ключ-значення”.

DynamoDB здатна опрацьовувати величезні обсяги даних у розподіленій інфраструктурі без шкоди для швидкодії, довговічності та надійності. Вона має гнучку структуру, яка дозволяє без зусиль зберігати та запитувати як структуровані, так і неструктуровані дані.

DynamoDB можна використовувати як основу для різних типів програм. Доступ до неї можна отримати безпосередньо з веб-консолі AWS, програмно через AWS-CLI або з веб-застосунків за допомогою AWS-SDK.

Початок роботи з DynamoDB у Node.js

У Node.js існує безліч інструментів для розробки внутрішніх API, і при роботі з будь-яким з них можна обрати базу даних для свого API. Node.js пропонує широку підтримку зовнішніх сервісів, зокрема баз даних, таких як AWS DynamoDB.

Все, що потрібно для доступу до сервісів AWS з програми Node, це клієнтський пакет aws-sdk для цього сервісу. Наприклад, для доступу до DynamoDB потрібно встановити пакет client-dynamodb з aws-sdk.

Щоб інсталювати пакет, виконайте наступну команду у каталозі вашого проєкту:

 npm install @aws-sdk/client-dynamodb

Після встановлення aws-sdk/client-dynamodb у ваш проєкт Node.js, необхідно додати область таблиці DynamoDB до конфігурації перед тим, як взаємодіяти з нею. Це робиться під час ініціалізації клієнта DynamoDB.

Якщо ви вже встановлювали та користувалися AWS-CLI на своєму комп’ютері, то ваші облікові дані AWS, скоріш за все, вже налаштовані у вашому середовищі, і SDK автоматично їх отримає.

В іншому випадку, перейдіть до AWS Identity Access Management (IAM) у вашій консолі та створіть нового користувача. Після створення користувача ви отримаєте ідентифікатор ключа доступу та секретний ключ, які є вашими особистими обліковими даними.

Додайте ці облікові дані до вашого середовища, виконавши наступні команди терміналу для вашої платформи:

Для Unix, Linux або macOS:

 export AWS_ACCESS_KEY_ID='ваш ключ доступу'
export AWS_SECRET_ACCESS_KEY='ваш секретний ключ'

Для Windows (CMD):

 set AWS_ACCESS_KEY_ID='ваш ключ доступу'
set AWS_SECRET_ACCESS_KEY='ваш секретний ключ'

Для Windows (PowerShell):

 $env:AWS_ACCESS_KEY_ID='ваш ключ доступу'
$env:AWS_SECRET_ACCESS_KEY='ваш секретний ключ'

Далі, у своєму проєкті Node.js створіть новий файл, наприклад, dynamodb.js. У цьому файлі створіть новий клієнт AWS DynamoDB, використовуючи такий код:

 const { DynamoDB } = require('@aws-sdk/client-dynamodb')

const region = "us-east-1"

const client = new DynamoDB({ region })

Це досить просто! AWS гарантує, що ваші облікові дані не будуть розкриті у коді, тому при створенні клієнта спочатку відбувається зчитування ключа доступу та секретного ключа з вашого середовища.

Створений клієнт дозволяє виконувати різноманітні операції, наприклад створення таблиць, читання та запис даних.

DynamoDB, як і інші NoSQL бази даних, не має схем, тому ви завжди можете додавати нові атрибути (поля) до таблиці в будь-який момент. Саме тому при створенні таблиці DynamoDB необхідно додати лише атрибути, які використовуватимуться як первинні ключі.

Розгляньте наступний код, який створює нову таблицю (Customer) у DynamoDB:

 const createCustomerTable = async () => {
    const params = {
        TableName: "Customer",
        AttributeDefinitions: [
            {
                AttributeName: "Email",
                AttributeType: "S"
            },
        ],
        KeySchema: [
            {
                AttributeName: "Email",
                KeyType: "HASH"
            }
        ],
        ProvisionedThroughput: {
            ReadCapacityUnits: 5,
            WriteCapacityUnits: 5
        }
    };

    client.createTable(params, (err, data) => {
        if (err) {
           console.log(err);
        } else {
            console.log(data);
        }
    });
}

createCustomerTable();

У полі AttributeDefinitions вказуються ключові атрибути таблиці та їх типи. Атрибут Email має тип “S”, що означає, що значення поля є рядком. Доступні три типи атрибутів: “S”, “N” і “B” (рядок, число та двійковий).

KeySchema потрібна для визначення первинних ключів, які допомагають швидко знаходити та сортувати елементи. DynamoDB очікує, що атрибути, додані під час створення таблиці, будуть ключовими, тому основним ключем тут є Email. Його потрібно додати до KeySchema та вказати його KeyType (HASH).

Іншим можливим значенням KeyType є “RANGE”, який використовується для сортування ключів. Ключі сортування корисні у випадках, коли дані можуть мати однакові HASH ключі, і їх потрібно згрупувати за додатковими критеріями, такими як дата або колір. У цьому випадку додаткові дані можуть бути ключем RANGE.

Третім важливим параметром у коді вище є ProvisionedThroughput. Тут вказується кількість операцій читання та запису, які DynamoDB має дозволити для таблиці за секунду.

Після запуску вищенаведеного коду, результат повинен виглядати приблизно так:

У розділі панелі інструментів DynamoDB в веб-консолі ви побачите, що таблиця ще створюється або вже має статус “активна”.

Завжди враховуйте потреби вашого застосунку при вказанні ReadCapacityUnits та WriteCapacityUnits, оскільки неправильні значення можуть призвести до проблем з продуктивністю або високих витрат на рахунку.

Переконавшись, що таблиця є активною, можна виконувати CRUD-операції.

Нижче наведено кілька прикладів коду, що показують, як записувати та зчитувати дані з таблиці “Customer”.

  • Додавання даних у таблицю. Для запису даних в таблицю потрібен метод putItem клієнта. Наступний код додає нового клієнта в таблицю “Customer” у DynamoDB.
     const createCustomer = async (customer) => {
        const params = {
            TableName: "Customer",
            Item: customer
        }

        client.putItem(params, (err, data) => {
            if (err) {
               console.error(err)
            } else {
                console.log(data)
            }
        })
    }

    const customerData = {
        Name: { "S": "Timilehin O." },
        Email: { "S": "[email protected]" },
        Age: { "N": "18"},
        Country: { "S": "Nigeria" }
    }

    createCustomer(customerData)

    Об’єкт params містить TableName, яка є таблицею, куди ви записуєте, та поле Item, яке містить дані, що додаються, з їхніми конкретними типами. Зверніть увагу на нові поля, яких спочатку не було в таблиці. Саме так працює гнучкість DynamoDB. Ви можете переглянути дані в базі даних на консолі наступним чином:

  • Зчитування даних з таблиці. DynamoDB дозволяє зчитувати дані різними способами. Функція scan SDK зчитує всю таблицю, а getItem – лише певні дані. Наприклад, наступний код отримує всіх клієнтів:
     const getAllCustomers = async () => {
        const params = {
            TableName: "Customer"
        }

        const customers = await client.scan(params)
        console.log(customers)
    }

    А наступний код отримує користувача за значенням Email:

     const getCustomerByEmail = async (email) => {
        const params = {
            TableName: "Customer",
            Key: {
                Email: { "S": email }
            }
        }

        const customer = await client.getItem(params)
        console.log(customer)
    }

    getCustomerByEmail("[email protected]")

  • Оновлення даних в таблиці. Для оновлення існуючих даних в таблиці використовується функція updateItem SDK. Наступний код демонструє, як оновити певний запис:
      const updateCustomerLocation = async (email, age) => {
         const params = {
             TableName: "Customer",
             Key: {
                 Email: { "S": email }
             },
             UpdateExpression: "SET Age = :newAge",
             ExpressionAttributeValues: {
                 ':newAge': { "N": age }
             },
             ReturnValues: "ALL_NEW"
         }

         const updatedCustomer = await client.updateItem(params)
         console.log(updatedCustomer.Attributes)
     }

    Також можна зробити функцію динамічною, створюючи вирази оновлення на основі даних оновлення. Гнучкість DynamoDB дозволяє виконувати кожну операцію відповідно до ваших потреб.

  • Видалення даних з таблиці. Для видалення запису з DynamoDB потрібна функція deleteItem та ключ цього запису. Ось приклад реалізації:
     const deleteCustomer = async (email) => {
        const params = {
            TableName: "Customer",
            Key: {
                Email: { "S": email }
            }
        }

        client.deleteItem(params, (err, data) => {
            if (err) {
               console.error(err)
            } else {
                console.log("Customer deleted successfully")
            }
        })
    }

    deleteCustomer("[email protected]")

Створення ефективних застосунків за допомогою DynamoDB

Amazon Web Services продовжує розвиватися, надаючи доступну платформу, яку можна використовувати для розробки ефективних та безпечних цифрових рішень. DynamoDB – це ідеальний вибір, якщо вам потрібна база даних, яку можна використовувати, не турбуючись про інфраструктуру або безпеку.

Тепер у вас є всі необхідні знання для початку роботи з DynamoDB у Node.js, і ви можете впевнено обрати DynamoDB для вашого наступного застосунку Node.js.