AWS DynamoDB 로컬 환경에서 사용 (1)

givepro·2022년 3월 24일
2

aws

목록 보기
1/2

1. 목적

Spring Boot에서 AWS DynamoDB를 사용하고자 하기위해 R&D를 진행하는 과정이 있었다.
가장 먼저 로컬환경에서 구축을 해봐야 한다고 생각했기에 실제 운영중인 AWS의 DynamoDB를 사용하는것은 비용적인 측면에서 비효율적이니 어떻게 하면 로컬 환경에서 사용 할 수 있을지 리서치를 진행했다.

2. 로컬 환경

AWS DynamoDB 공식문서를 참고하면 3가지 유형이 나온다. 하지만 보편적으로 사용하는 docker를 활용하기로 결정하였다. 단순히 많이 써서 그러는건 아니고 추후 docker를 활용해야하는 부분이 많다고 판단.

3. Docker Image & Run

도커에서 제공하는 공식 이미지가 있다. 그전에 docker가 활성화 되어있는지 체크하고 아래와 같이 진행한다.

$ docker pull amazon/dynamodb-local

// -jar DynamoDBLocal.jar -inMemory -sharedDb (옵션 사용 시)
$ docker run -d -p 8000:8000 amazon/dynamodb-local

-inMemory DB 종료 시 모든 데이터 삭제
-sharedDb request의 region이 다르더라도 같은 공간을 사용

4. aws cli로 DynamoDB 조작하기

먼저 awscli를 설치해야 한다.

$ brew install awscli

aws configure 설정 (IAM으로 사용할 계정을 별도로 만든 후 진행하는 것이 좋아보임)

$ aws configure
AWS Access Key ID [None]: ******************
AWS Secret Access Key [None]: ******************
Default region name [None]: local
Default output format [None]: json

5. aws cli로 DynamoDB 연결 확인

// --endpoint-url http://localhost:8000 는 반드시 사용, 입력하지 않으면 local이 아님
aws dynamodb list-tables --endpoint-url http://localhost:8000

연결이 정상적이라면 아래와 같이 json이 리턴된다.

6. create-table

터미널에서 아래 테이블 생성 명령어를 작성하는데 오류가 발생 할 수 있어서 쉘 스크립트로 작성하였다. 진행하면서 자꾸 몇몇 오류가 발생했다. 아무래도 참조했던 블로그의 내용이 생략된 부분이 있어서 그런지는 모르겠지만 결국 공홈 문서를 참고하여 작성했다. 일단 여기서 핵심은 --global-secondary-indexs 옵션을 사용하려면 JSON 형태로 입력하다보니 조금 까다로웠고, Projection을 사용 안하고 싶었지만 필수적으로 값을 넘겨야 하는 형태로 오류가 반환되었다. (그래서 결국 타입만 ALL로 전달)

#!/bin/bash

aws dynamodb create-table \
    --endpoint-url http://localhost:8000 \
    --table-name Comment \
    --attribute-definitions \
        AttributeName=id,AttributeType=S \
        AttributeName=mentionId,AttributeType=N \
        AttributeName=createdAt,AttributeType=S \
    --key-schema AttributeName=id,KeyType=HASH \
    --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 \
    --global-secondary-indexes \
	"[
	    {
			\"IndexName\": \"byMentionId\",
			\"KeySchema\":[{\"AttributeName\":\"mentionId\", \"KeyType\":\"HASH\"},
					{\"AttributeName\":\"createdAt\", \"KeyType\":\"RANGE\"}],
			\"Projection\": {
				\"ProjectionType\": \"ALL\"
			},
			\"ProvisionedThroughput\": { 
				\"ReadCapacityUnits\": 1,
				\"WriteCapacityUnits\": 1
			}
	    }
	]"  
profile
server developer

0개의 댓글