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»