AWS определяет DynamoDB как «Amazon DynamoDB-это база данных ключей и документов, которая в любом масштабе обеспечивает однозначную миллисекундную производительность. Это полностью управляемая, многорегионная, многомастерная база данных со встроенной безопасностью, резервным копированием и восстановлением и кэшированием в памяти для приложений интернет-масштаба ». Таким образом, по определению, ясно, что DynamoDB-это без сервера, полностью управляемой миллисекундной производительности и очень масштабируемая база данных NOSQL, которая была объявлена в начале 2012 года.
В этой статье мы выполним основные операции CRUD с использованием AWS Lambda и Nodejs. Чтобы начать, мы сначала должны определить следующую структуру файла:
Мы назовуте наш корень динамический, однако не стесняемся называть это всем, что вам нравится. В нашей корневой папке мы создадим папку с именем ресурсов, в котором будет содержаться файл с именем Dynamo-table.yml, содержащий наш код для создания таблицы DynamoDB. Кроме того, поскольку мы будем использовать Framework без сервера для развертывания нашего стека CloudFormation, я предполагаю, что вы уже установили и настроили программный доступ к вашей учетной записи AWS без сервера. Если нет, вы можете обратиться к Без сервера документация Анкет После создания папки, называемой ресурсами, мы сгенерируем шаблон, используя Framework без сервера с помощью команды:
sls create -t aws-nodejs
Это генерирует файл Serverless.yml, файл handler.js и .gitignore, и, наконец, наша структура файла будет завершена.
Теперь давайте начнем с нашего файла Serverless.yml. Наш файл serversless.yml будет выглядеть следующим образом:
service: DynamoCRUD provider: name: aws runtime: nodejs12.x profile: default timeout: 30 iamRoleStatements: - Effect: "Allow" Action: - "dynamodb:*" Resource: "*" functions: addItem: handler: handler.addItem getAllItem: handler: handler.getAllItem updateItem: handler: handler.updateItem deleteItem: handler: handler.deleteItem resources: - ${file(resources/dynamo-table.yml)}
Таким образом, в основном мы делаем то, что мы создаем таблицу DynamoDB, используя раздел «Ресурсы» и создаем 4 основные функции для выполнения операции CRUD и предоставления разрешения DynamoDB на наши функции Lambda.
Теперь мы создадим таблицу DynamoDB, то есть нашу папку Dynamo-table.yml в разделе «Ресурсы». Это будет выглядеть как:
Resources: myDynamoDBTable: # Logical Id of the resource Type: AWS::DynamoDB::Table Properties: AttributeDefinitions: - AttributeName: "year" AttributeType: "N" - AttributeName: "title" AttributeType: "S" KeySchema: - AttributeName: "year" # Partition Key KeyType: "HASH" - AttributeName: "title" # Sort Key KeyType: "RANGE" TableName: "Movies" ProvisionedThroughput: # Optional, can be skipped ReadCapacityUnits: 10 WriteCapacityUnits: 10
Таким образом, в основном мы создаем таблицу с вышеуказанными определениями атрибутов.
Теперь давайте напишем наш файл handler.js. Это будет иметь код для всей операции CRUD, определенной в файле Serverless.yml.
"use strict"; const AWS = require('aws-sdk'); const docClient = new AWS.DynamoDB.DocumentClient(); // Function to Create an Item to DB module.exports.addItem = async (event) => { try { let table = "Movies"; let year = 2015; let title = "The Big New Movie"; let params = { TableName: table, Item: { "year": year, "title": title, "info": { "plot": "Nothing happens at all", "rating": 0 } } } let result = await docClient.put(params).promise(); if (result) { console.log(">>>>>>>>>", result); } console.log("hello world") return { statusCode: 200, body: JSON.stringify({ message: "Go Serverless v1.0! Your function executed successfully!", data: result }), }; } catch (error) { console.log(error); return error; } }; // Function to getAllItems from DB module.exports.getAllItem = async () => { let table = "Movies"; let year = 2015; let title = "The Big New Movie"; let params = { TableName: table, Key: { "year": year, "title": title } } try { let result = await docClient.get(params).promise(); console.log(result); return { body: JSON.stringify({ message: "Executed succesfully", data: result }) } } catch (error) { console.log(error); } } // Function to update an Item in DB module.exports.updateItem = async () => { let table = "Movies"; let year = 2015; let title = "The Big New Movie"; let params = { TableName: table, Key: { "year": year, "title": title }, UpdateExpression: "set info.rating = info.rating + :val", ExpressionAttributeValues: { ":val": 1 }, ReturnValues: "UPDATED_NEW" }; try { let result = await docClient.update(params).promise(); return { body: JSON.stringify({ message: "updated succesfully", data: result }) } } catch (error) { console.log(error); } } // Function to Delete an item module.exports.deleteItem = async () => { let table = "Movies"; let year = 2015; let title = "The Big New Movie"; let params = { TableName: table, Key: { "year": year, "title": title } } let result = await docClient.delete(params).promise(); return { body: JSON.stringify({ message: "deleted succesfully", data: result }) } }
Здесь следует отметить, что я жестко кодирую данные, которые будут созданы в ББ ради простоты. Не стесняйтесь менять метод Additem в Post и проанализировать тело из события. Тела, вы можете полностью это сделать. То же самое касается обновления и удаления метода. Я просто стараюсь держать вещи максимально простыми.
Теперь последнее, что нужно сделать, это развернуть наш стек для AWS, и мы будем готовы проверить наши функции, работающие или нет. Чтобы развернуть стек, просто введите следующую команду:
sls deploy -v
Это вернет все функции конечной точки. Вы можете использовать почтальона, чтобы нажать на конечные точки и проверить ответы.
Спасибо за чтение
Оригинал: «https://dev.to/rajandmr/dynamodb-crud-with-nodejs-and-lambda-inn»