728x170
해당 글에서는 AWS 서비스 중 Lambda + DynamoDB + Node를 이용한 활용방법에 대해 알아봅니다.
1) DynamoDB
💡 DynamoDB
- Amazon Web Services(AWS)에서 제공하는 완전 관리형 NoSQL 데이터베이스 서비스입니다. 이 데이터베이스는 빠르고 예측 가능한 성능을 제공하며, 자동으로 데이터를 분산하여 확장 가능한 데이터 저장소를 제공합니다.
- 다양한 응용 프로그램에서 사용되며, 특히 대규모의 실시간 데이터를 처리해야 하는 웹, 모바일, IoT 애플리케이션에서 많이 활용됩니다.
[ 더 알아보기 ]
💡 관리형은 무슨 말일까?
- 사용자가 인프라 관리나 유지보수에 신경 쓸 필요 없이, 서비스 제공자가 모든 관리 작업을 대신 수행해 주는 것을 의미합니다.
- 예를 들어, AWS가 제공하는 관리형 서비스인 DynamoDB는 데이터베이스의 설정, 확장, 백업, 복구 등 모든 관리 작업을 AWS가 대신 처리해 줍니다. 사용자는 단지 데이터베이스를 이용하는 데 집중할 수 있습니다.
1. AWS SDK for Javascript 라이브러리 활용
💡 SDK for Javascript 라이브러리 활용
- Node 기반에서는 AWS SDK for Javascript 라이브러리를 활용하여 DynamoDB와 연결을 수행합니다.
- v2와 v3가 존재하는데 최신 버전인 v3를 이용하여서 이를 수행하는 과정입니다.
npm i @aws-sdk/client-dynamodb
npm i @aws-sdk/lib-dynamodb
라이브러리 | 설명 |
@aws-sdk/client-dynamodb | AWS의 JavaScript SDK 중 하나로, 기본 DynamoDB 클라이언트를 제공합니다. |
@aws-sdk/lib-dynamodb | AWS의 JavaScript SDK 중 하나로, DynamoDB Document Client를 제공합니다. |
[더 알아보기]
💡 aws-sdk와 @aws-sdk/client-dynamodb의 차이는 무엇일까?
항목 | aws-sdk | @aws-sdk/client-dynamodb |
설명 | AWS SDK for JavaScript v2에 포함된 모듈로, 다양한 AWS 서비스와 상호작용할 수 있는 클라이언트 라이브러리입니다. | AWS SDK for JavaScript v3의 모듈로, DynamoDB와 상호작용하기 위한 클라이언트 라이브러리를 제공합니다. |
버전 | v2 | v3 |
모듈화 | 모듈화가 덜 되어 있어, 전체 SDK를 포함시키는 경우가 많습니다. | 개별 서비스 모듈로 분리되어 있어 필요한 모듈만 선택적으로 사용할 수 있습니다. |
비동기 프로그래밍 | 콜백 패턴을 주로 사용합니다. | 프라미스 패턴을 주로 사용합니다. |
TypeScript 지원 | 지원은 하지만 제한적입니다. | TypeScript에 대한 완전한 지원을 제공합니다. |
성능 및 보안 | 기존 버전으로, 성능 및 보안이 최신 버전에 비해 떨어질 수 있습니다. | 최신 버전으로, 성능 및 보안이 개선되었습니다. |
2. @aws-sdk/lib-dynamodb 주요 메서드
💡 @aws-sdk/lib-dynamodb 주요 메서드
- DynamoDB에 접근하기 위한 라이브러리인 @aws-sdk/lib-dynamodb의 메서드에 대해 알아봅니다.
메서드 | 분류 | 설명 |
GetCommand | 조회 | DynamoDB 테이블에서 항목을 검색하는 데 사용됩니다.(* 파티션 키 필요) |
QueryCommand | 조회 | DynamoDB 테이블에서 항목을 검색하는 데 사용됩니다. 이 명령은 주로 파티션 키 값에 따라 항목을 검색하는 데 사용됩니다.(* 파티션 키 필요) |
ScanCommand | 조회 | DynamoDB 테이블의 모든 항목을 검색하는 데 사용됩니다.(파티션 키 필요X) |
PutCommand | 생성 | 새 항목을 DynamoDB 테이블에 추가하거나 기존 항목을 대체하는 데 사용됩니다. |
UpdateCommand | 수정 | DynamoDB 테이블의 기존 항목을 수정하는 데 사용됩니다. |
DeleteCommand | 삭제 | DynamoDB 테이블에서 항목을 삭제하는 데 사용됩니다. |
3. 최초 Lambda 구성방법
💡 최초 Lambda 구성 방법
- 처음 Lambda를 접하고 생성 및 연결 방법에 대해 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.
2) DynamoDB 테이블 생성
1. [DynamoDB → 테이블] ‘테이블 생성’ 버튼을 눌러서 테스트 테이블을 구성합니다.
💡 [DynamoDB → 테이블] ‘테이블 생성’ 버튼을 눌러서 테스트 테이블을 구성합니다
- 테이블의 이름을 정하고 기본 키가 되는 ‘파티션 키’, 선택 사항으로 복합 키 혹은 정렬을 위해 사용되는 ‘정렬 키’를 입력합니다.
테이블 | 세부 정보 설명 |
테이블 이름 | 테이블을 식별하는 데 사용됩니다. |
파티션 키 | - 테이블 기본 키의 일부로, 테이블에서 항목을 검색하고 확장성과 가용성을 위해 호스트에 데이터를 할당하는 데 사용되는 해시 값입니다. |
정렬 키 - 선택사항 | - 정렬 키를 테이블 기본 키의 두 번째 부분으로 사용할 수 있습니다. - 정렬 키를 사용하면 동일한 파티션 키를 공유하는 모든 항목을 정렬하거나 검색할 수 있습니다 |
2. [DynamoDB → 테이블] 생성을 확인하였습니다.
3) Lambda 내에서 DynamoDB 접근 권한 부여
1. [Lambda → 함수 → 구성 → 권한 ] 역할 이름을 선택합니다.
2. [IAM → 역할 → 람다 함수] ‘권한 추가 - 정책 연결’ 버튼을 누릅니다.
3. [권한 추가] dynamoDB를 검색하고 우선은 모든 권한인 ‘AmazonDynamoDBFullAccess’를 적용합니다.
4. 정책이 추가됨을 확인하였습니다.
4) DynamoDB 사용예시
1. DynamoDB 항목(데이터) 생성 : PutCommand
💡 DynamoDB 항목(데이터) 생성 : PutCommand
- 해당 예시에서는 DynamoDBClient를 통해 DynamoDB와 연결을 수행하며, 연결된 상태에서 DynamoDBDocumentClient를 이용하여서 ‘PutCommand’ 메서드를 통해서 데이터를 추가합니다.
- PutCommand 메서드 내에는 TableName 속성과 Item 속성이 존재하며, 테이블 이름을 적고 추가하려는 항목들을 정의합니다.
import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
import { PutCommand, DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb";
export const handler = async (event) => {
const TABLE_NAME = "testTable";
const client = new DynamoDBClient({});
const docClient = DynamoDBDocumentClient.from(client);
const command = new PutCommand({
TableName: TABLE_NAME,
Item: {
id : "1",
name: "lee",
etc : "hello",
sortKey: "1"
},
});
const response = await docClient.send(command);
return response;
};
💡 아래와 같은 상태 코드와 성공 값을 받습니다.
결과 키 값 | 설명 |
httpStatusCode | HTTP 상태 코드 |
requestId | 요청 ID |
attempts | 시도 횟수 |
totalRetryDelay | 총 재시도 지연 시간 (밀리초 단위) |
💡 수행 결과
- 지정한 DynamoDB의 테이블내에 항목 데이터가 적재가 되는 것을 확인하였습니다.
2. DynamoDB 항목(데이터) 조회 : GetCommand
💡 DynamoDB 항목(데이터) 조회 : GetCommand
- 해당 예시에서는 DynamoDBClient를 통해 DynamoDB와 연결을 수행하며, 연결된 상태에서 DynamoDBDocumentClient를 이용하여서 ‘GetCommand’ 메서드를 통해서 데이터를 조회합니다.
- 해당 조회를 위해서는 '파티션 키'를 필수로 추가해야 하며, 만약 '정렬 키(복합 키)'를 추가했다면 이 또한 함께 입력해야 조회가 가능합니다.
import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
import { GetCommand, DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb";
export const handler = async (event) => {
const TABLE_NAME = "testTable";
const client = new DynamoDBClient({});
const docClient = DynamoDBDocumentClient.from(client);
const command = new GetCommand({
TableName: "testTable",
Key: {
id: "1",
sortKey : "1"
},
});
const response = await docClient.send(command);
return response;
};
💡 수행 결과
- 지정한 DynamoDB의 테이블에 특정 키(파티션 키, 정렬 키) 값을 기반으로 데이터가 조회됨을 확인하였습니다.
3. DynamoDB 항목(데이터) 조건절 조회 : ScanCommand
💡 DynamoDB 항목(데이터) 조건절 조회 : ScanCommand
- 해당 예시에서는 DynamoDBClient를 통해 DynamoDB와 연결을 수행하며, 연결된 상태에서 DynamoDBDocumentClient를 이용하여서 ‘ScanCommand’ 메서드를 통해서 데이터를 조회합니다.
- 해당 조회에서는 ‘파티션 키’나 '정렬 키'를 필수로 사용하지 않으며, 특정 필터(조건절)에 따라서 데이터를 조회할 수 있습니다.
import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
import { ScanCommand, DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb";
export const handler = async (event) => {
const TABLE_NAME = "testTable";
const client = new DynamoDBClient({});
const docClient = DynamoDBDocumentClient.from(client);
const command = new ScanCommand({
TableName: TABLE_NAME,
FilterExpression: "etc = :etcName",
ExpressionAttributeValues: {
":etcName" : "hello"
},
});
const response = await docClient.send(command);
return response;
};
💡 수행 결과
- 지정한 DynamoDB의 테이블에 특정 필터 값을 기반으로 데이터가 조회됨을 확인하였습니다.
💡 [참고] GetCommand, ScanCommand는 무슨차이가 있을까?
항목 | GetCommand | ScanCommand |
목적 | 특정 항목 조회 | 전체 테이블 또는 많은 항목 조회 |
파티션 키 | 필수 | 필요 없음 |
정렬 키 | 선택 사항 (사용 시 함께 제공) | 필요 없음 |
사용 사례 | 단일 항목을 정확하게 조회할 때 | 많은 항목을 조회하거나 데이터를 대규모로 탐색할 때 |
필터 표현식 사용 | 불가능 | 가능 (조건에 맞는 항목만 조회) |
4. DynamoDB 항목(데이터) 수정 : UpdateCommand
💡 DynamoDB 항목(데이터) 수정 : UpdateCommand
- 해당 예시에서는 DynamoDBClient를 통해 DynamoDB와 연결을 수행하며, 연결된 상태에서 DynamoDBDocumentClient를 이용하여서 ‘UpdateCommand’ 메서드를 통해서 데이터를 수정합니다.
- 해당 조회에서는 ‘파티션 키’를 반드시 추가 된 상태에서 UpdateExpression 속성 내에 수정할 값을 지정합니다.
import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
import { DynamoDBDocumentClient, UpdateCommand } from "@aws-sdk/lib-dynamodb";
export const handler = async () => {
const TABLE_NAME = "testTable";
const client = new DynamoDBClient({});
const docClient = DynamoDBDocumentClient.from(client);
const command = new UpdateCommand({
TableName: TABLE_NAME,
Key: {
id: "1",
sortKey : "1"
},
UpdateExpression: "set etc = :etcName",
ExpressionAttributeValues: {
":etcName": "Lee",
},
});
const response = await docClient.send(command);
return response;
};
💡 수행 결과
- 지정한 DynamoDB의 테이블에 특정 필터 값을 기반으로 데이터가 수정됨을 확인하였습니다.
💡 DynamoDB 내에서도 변경이 됨을 확인하였습니다.
5. DynamoDB 항목(데이터) 삭제 : DeleteCommand
💡 DynamoDB 항목(데이터) 삭제 : DeleteCommand
- 해당 예시에서는 DynamoDBClient를 통해 DynamoDB와 연결을 수행하며, 연결된 상태에서 DynamoDBDocumentClient를 이용하여서 ‘DeleteCommand’ 메서드를 통해서 데이터를 삭제합니다.
- 해당 삭제에서는 Key 값으로 ‘파티션 키’가 반드시 추가되어야 하며, 정렬키(복합키)를 지정한 경우도 함께 포함하여서 command를 구성해야 합니다.
import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
import { DynamoDBDocumentClient, DeleteCommand } from "@aws-sdk/lib-dynamodb";
const client = new DynamoDBClient({});
const docClient = DynamoDBDocumentClient.from(client);
export const handler = async () => {
const TABLE_NAME = "testTable";
const command = new DeleteCommand({
TableName: TABLE_NAME,
Key: {
id: "1",
sortKey : "1"
},
});
const response = await docClient.send(command);
return response;
};
💡 수행 결과
- 지정한 DynamoDB의 테이블에 특정 필터 값을 기반으로 데이터가 삭제됨을 확인하였습니다.
💡 최종테스트 하였던 데이터를 모두 삭제하였습니다.
5) [참고] Lambda Task timed out 문제 발생 시
1. 문제 발생 : Lambda Task timed out
💡 문제 발생 : Lambda Task timed out
- 람다 내의 수행 시간이 3.03초가 지남에 따라서 Time out이 발생한 문제입니다.
2. [람다 → 구성 → 일반 구성] 편집 버튼을 누릅니다.
💡 구성 → 일반 구성 → 편집 버튼을 누릅니다.
- 기본적으로 생성하였을 때 Lambda의 제한 시간은 3초로 지정되어 있기에 해당 시간을 수정합니다. ‘편집’ 버튼을 누릅니다.
3. [기본 설정 편집] 최대 제한 시간을 변경합니다.
💡 [기본 설정 편집] 최대 제한 시간을 변경합니다.
- 최대 제한시간은 15분이기에 이내의 시간을 선택하여 저장합니다.
4. 지정된 시간을 확인합니다
💡 지정된 시간을 확인합니다
- 제한시간이 지정한 시간으로 변경됨을 확인하였습니다.
오늘도 감사합니다😀
그리드형
'AWS > 환경 설정 및 구성' 카테고리의 다른 글
[AWS] AWS Lambda + S3 Bucket 활용하기 -1: Node 기반 Lambda 구성 (0) | 2024.07.06 |
---|---|
[AWS] AWS Lambda 이해하고 구성 및 최초 설정 방법 -1 : Node 기반 Lambda 구성 (0) | 2024.07.05 |