본문 바로가기

기록/Web

[AWS] lambda와 DynamoDB 연결하여 쿼리 실행

SMALL

https://sillutt.tistory.com/entry/Android%EC%97%90%EC%84%9C-Amazon-Dynamo-DB-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

 

Android에서 Amazon Dynamo DB 사용하기

1. 테이블 만들기 테이블 이름과 기본 키 컬럼을 설정하고 생성 2. 항목 생성 테이블의 [항목] 탭에서 레코드를 추가할 수 있다. 추가한 내용을 확인할 수 있다. 스캔 기능을 활용하여 쿼리를 실행

sillutt.tistory.com

aws lambda, API gateway, Dynamo DB를 연결하는 작업은 위에서 진행했다.

lambda에서 쿼리를 실행하는 테스트를 작성하는데 시간도 오래걸리고 많이 헤매서 관련 기록을 작성한다.

 

GET

DB의 CRUD 중에서 가장 기본적인 Read를 하기 위해 REST 개념에 매칭되는 GET을 활용한다.

 

먼저, index.js 코드는 다음과 같다.

 

const AWS = require('aws-sdk');

//create DynamoDB Object
const dynamo = new AWS.DynamoDB();


/**
 * Provide an event that contains the following keys:
 *
 *   - operation: one of the operations in the switch statement below
 *   - tableName: required for operations that interact with DynamoDB
 *   - payload: a parameter to pass to the operation being performed
 */
exports.handler = async (event) => {
    //console.log('Received event:', JSON.stringify(event, null, 2));

    const operation = event.operation;
    
    switch (operation) {
        case 'GET':
            return await dynamo.scan (event.body).promise();
        default:
            throw new Error(`Unrecognized operation "${operation}"`);
    }
};

 

 

 

해야 할 일

- DynamoDB 객체를 생성

- 들어오는 operation에 해당하는 함수 작성 (dynamo.scan)

* scan은 DB내의 모든 내용을 탐색하기 때문에 query를 권장한다.

이 예시에서는 DB데이터양이 적기때문에 scan을 사용했다.

 

테스트 이벤트 작성

{
  "operation": "GET",
  "body": {
    "TableName": "Confusion",
    "FilterExpression": "contains (#names, :atValue)",
    "ExpressionAttributeNames": {
      "#names": "confusion_name"
    },
    "ExpressionAttributeValues": {
      ":atValue": { "S": "s"}
    }
  }
}

 

테스트 이벤트 코드이다. 이 코드 내용은 SQL에서 

SELECT *

FROM CONFUSION 

WHERE CONFUSION_NAME LIKE '%s%';

와 동일한 결과를 반환환다.

 

operation : index 의 switch의 결정 기준이다.

body - TableName : scan할 테이블 명

body - FilterExpression : 조건문을 작성한다. 속성명 앞에는 #, 속성값 앞에는 :을 붙여 구분한다.

body - ExpressionAttributeNames : 전달인자의 속성명을 정의한다.

body - ExpressionAttributeValues : 전달인자의 속성값을 정의한다. 이때 {타입 : 속성값} 형태로 정의한다.

형태를 작성하지 않고 :atValue : "s" 형태로도 실행이 가능하다고 하는데, 어떻게 해야 할 지 모르겠다.. 이건 시도중.

(사실 이 부분에서 오래걸렸다) 

 

자세한건 다음 링크를 참고.

 

https://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/Expressions.ExpressionAttributeValues.html

 

식 속성 값 - Amazon DynamoDB

Scan 작업은 테이블에서 모든 항목을 읽어옵니다. 따라서 라지 테이블에서 Scan를 사용하는 것을 피해야 합니다. 필터 표현식은 Scan 결과에 적용되며 필터 표현식과 일치하지 않는 항목은 무시됩

docs.aws.amazon.com

 

이벤트를 생성하고 테스트를 진행하면 

다음과 같은 성공 로그를 볼 수 있다.

위 코드에서 전달 값 (s)위치에 아무것도 작성하지 않으면 모든 items를 반환한다.

SMALL