NodeJS 및 Lambda를 사용한 DynamoDB CRUD

AWS는 DynamoDB를 "Amazon DynamoDB는 모든 규모에서 한 자릿수 밀리초의 성능을 제공하는 키-값 및 문서 데이터베이스입니다. 이는 보안, 백업 및 복원이 내장된 완전 관리형, 다중 지역, 다중 마스터, 내구성 있는 데이터베이스입니다. 인터넷 규모 애플리케이션을 위한 메모리 캐싱". 따라서 정의에서 DynamoDB는 2012년 초에 발표된 서버리스, 완전 관리형 밀리초 성능 및 확장성이 뛰어난 NoSQL 데이터베이스임이 분명합니다.

이 기사에서는 AWS Lambda 및 NodeJS를 사용하여 기본 CRUD 작업을 수행합니다. 시작하려면 먼저 다음 파일 구조를 정의해야 합니다.



우리는 루트 폴더를 DynamoCRUD라고 부를 것이지만 원하는 이름으로 부르셔도 됩니다. 루트 폴더 아래에 리소스라는 폴더를 생성합니다. 이 폴더에는 DynamoDB 테이블 생성을 위한 코드가 포함된 dynamo-table.yml 파일이 포함됩니다. 또한 Serverless Framework를 사용하여 Cloudformation 스택을 배포할 것이므로 Serverless를 사용하여 AWS 계정에 대한 프로그래밍 방식 액세스를 이미 설치하고 설정했다고 가정합니다. 그렇지 않은 경우 Serverless Documentation을 참조할 수 있습니다.
리소스라는 폴더를 만든 후 다음 명령으로 서버리스 프레임워크를 사용하여 템플릿을 생성합니다.

sls create -t aws-nodejs


이렇게 하면 serverless.yml 파일, handler.js 파일 및 .gitignore 파일이 생성되고 최종적으로 파일 구조가 완성됩니다.

이제 serverless.yml 파일을 시작하겠습니다. serverless.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 테이블을 생성하고 CRUD 작업을 수행하기 위한 4개의 기본 함수를 생성하고 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 파일을 작성해 보겠습니다. 여기에는 serverless.yml 파일에 정의된 모든 CRUD 작업에 대한 코드가 있습니다.

"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
    })
  }

}


여기서 한 가지 주의할 점은 단순성을 위해 DB에 생성할 데이터를 하드 코딩하고 있다는 것입니다. AddItem 메서드를 POST로 자유롭게 변경하고 event.body에서 본문을 구문 분석하면 완전히 할 수 있습니다. 업데이트 및 삭제 방법도 마찬가지입니다. 나는 가능한 한 간단하게 유지하려고 노력하고 있습니다.

이제 마지막으로 스택을 AWS에 배포하고 기능이 작동하는지 여부를 테스트할 준비가 되었습니다. 스택을 배포하려면 다음 명령을 입력하기만 하면 됩니다.

sls deploy -v


이것은 모든 함수 끝점을 반환합니다. POSTMAN을 사용하여 끝점에 도달하고 응답을 확인할 수 있습니다.

Thanks for Reading

좋은 웹페이지 즐겨찾기