dynamoDB은 NoSQL이라서 SQL 쿼리처럼 컬럼명을 이용해 빠르게 원하는 데이터를 찾을 수 없다.

하지만 indexing을 사용해서 쿼리를 사용할 수 있도록 한다.

1. Hash, Range

dynamoDB는 테이블을 만들 때 Hash key, Range key를 설정할 수 있다. 내부적으로 이 두 개를 이용해 indexing을 한다.

{
    key1 : val
    key2 : val
    key3 : val
    key4 : val
}

위와 같은 스키마가 있을 때 Hash : key1, Range : key2 로 설정할 수 있다.

Range key는 optional이다.

이렇게 설정하면 이제 key1 * key2 로 인덱싱을 하게된다.

Hash*Range는 고유해야한다.

2. Scan, Query

기존 SQL처럼 WHERE key1=A AND key2=B 식으로 데이터를 찾고싶다고 할 때

dynamoDB에서 제공하는 Scan, Query를 사용할 수 있다.

  • Scan
    Filter Expression을 입력해서 원하는 데이터를 찾아올 수 있다.
    원하는 데이터들만 리턴되기 때문에 네트워크상에서 전달되는 패킷은 적어보이나
    DB 내부적으로 봤을 땐 전체를 갖고 온 뒤 key, value를 하나하나 비교해서
    맞지 않는 데이터를 삭제하는 방식이라 그만큼의 비용이 발생하게 된다. 
    문서 : https://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/bp-query-scan.html

  • Query
    Hash, Range key로 설정한 애들로 indexing 처리가 되어있기 때문에 전체 데이터를 살펴보지않고도
    두 key를 이용해서 데이터를 찾을 수 있다.
    Range key는 이름답게 ==이 아닌 대교비교도 가능하다.
    (내부적으로 Hash + Btree 로 indexing을 하고있을 것 같다)

3. GSI, LSI

테이블을 위와같이 만들면 WHERE key1=A AND key2=B 같은 쿼리는 가능하겠지만 WHERE key3=A 같은 쿼리는 불가능하다. 그럼 또 맨땅에 헤딩식인 Scan을 써야하는데 그게 싫다면 Secondary Index을 쓰면 된다. 종류는 두 가지가 있다.

  • Local Secondary Index
    기본 Hash Key에 *Range Key 조합을 더 두는 방식이다. 테이블을 생성할 때만 세팅이 가능하기 때문에 처음부터 잘 설계해야한다. 나중에 LSI를 추가하고싶어지면 기존 테이블을 삭제하면서 마이그레이션 하는 방법 밖에 없다. 

    key1 * key2 이외에도
    key1 * key3 혹은 key1 * key4 로 인덱싱을 하나 더 하겠다는 뜻이다.
    테이블 자체의 기본 Hash Key(key1)에 공생하는 range key를 하나 더 파서 인덱싱한다 해서 Local이라는 이름이 붙은것 같다.
    보조 인덱스를 추가할때
    (테이블 Hash key== 보조인덱스 Hash key) && Range key 선택
    이여야만 LSI로 만들기 checkbox가 활성화 된다.

  • Global Secondary Index
    테이블 자체의 기본 Hash Key에 공생하지 않고 새로운 Hash Key (+Range Key)를 둬서 인덱싱을 하겠다는 뜻이다. GSI는 테이블 생성 후에도 설정가능하고 추후 변경, 삭제가 가능하다.
    key3 
    key3*key4
    key4*key3
    위처럼 인덱싱이 가능하다. LSI에서처럼 key1*key2를 해도 상관없다. 어차피 새로운 Hash Key를 둬서 인덱싱하는 것이기 때문에 같던 말던 dynamoDB는 상관 안한다.

    어? Hash key이름이 key1인데 LSI로 하고 싶으면 체크해라 아니면 그냥 GSI로 한다 ~~ 라고 체크박스를 표시해준다.

    GSI를 추가하고 난 뒤 해당 key를 이용해 쿼리를 날릴 수 있게 되었다.

Secondary Index 의 Hash*Range는 고유할 필요 없다.
기본 테이블의 Hash*Range만 고유하면 된다.

 

 

4. 복합 정렬키

Secondary Index의 경우 데이터의 Write, Update시 인덱싱 작업이 추가되기 때문에 인덱싱 비용이 따로 더 들게 된다.
key1+key2의 값을 Hash key로 쓴다던지 하는 약간의 꼼수를 발휘해서 해결할 수도 있다.

참조 : https://velog.io/@dankim/DynamoDB-%EC%A0%95%EB%A0%AC-%ED%82%A4%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%EC%A0%95%EB%A6%AC%ED%95%98%EB%8A%94-%EB%AA%A8%EB%B2%94-%EC%82%AC%EB%A1%80

 

DynamoDB 정렬 키를 사용하여 데이터를 정리하는 모범 사례

DynamoDB 정렬 키를 사용하여 데이터를 정리하는 모범 사례

velog.io


참조한 형님들

https://velog.io/@hanseul/AWS-DynamoDB-%EC%82%AC%EC%9A%A9%EA%B8%B0#2-%EB%A1%9C%EC%BB%AC-%EB%B3%B4%EC%A1%B0-%EC%9D%B8%EB%8D%B1%EC%8A%A4-vs-%EA%B8%80%EB%A1%9C%EB%B2%8C-%EB%B3%B4%EC%A1%B0-%EC%9D%B8%EB%8D%B1%EC%8A%A4-%EC%B0%A8%EC%9D%B4

 

AWS DynamoDB 사용기_보조 인덱스 사용 위주로

AWS DynamoDB의 보조 인덱스 사용법

velog.io

 

https://www.slideshare.net/awskorea/amazon-dynamodb-for-developers

 

2017 AWS DB Day | 개발자가 알아야 할 Amazon DynamoDB 활용법

이 강연에서는 NoSQL 데이터베이스인 DynamoDB를 활용하기 위해 개발 실무자가 알아야 할 실용적 지식을 소개해 드립니다. 테이블을 설계하고 모범사례를 도입해 최적화된 성능과 비용으로 고가용

www.slideshare.net

 

'Amazon AWS' 카테고리의 다른 글

[AWS 개발환경]  (1) 2021.08.25
[CloudFront]  (0) 2021.07.13
[IAM]  (0) 2021.07.07

개발 가이드

  1. front-end
    nuxt 프로젝트 빌드 -> html+script로 전부 변환 -> 정적 리소스가 되어 S3버킷에 올라감
    웹브라우저에서 정적리소스 (웹페이지) 요청 
    https://dev.myapp.cloud -> Route53 -> CloudFront -> S3

    -Route53 : DNS기능, 가비아같은놈
    -S3 : 저장소, 실제 nuxt 빌드된 프로젝트가 저장되어있음
    -CloudFront : CDN, S3 캐싱기능
    ex) 브라우저 : 한국, S3버킷 : 미국 - 멀리있을때
    a) CloudFront에 리소스 있는지 조회 
    b) 없으면 S3가서 갖고옴. 처음엔 오래걸림. 
    c) CloudFront에 캐싱
    d) 다음요청때부턴 CloudFront에서 빠르게 가져올수있음
  2. backeend
    1에서는 껍데기만있는 페이지를 받음. 내용은 없는상태
    axios로 api호출해서 비동기로 내용채워넣음
    ex)
    GET : dev-api.myapp.cloud/users/1259012 -> Route53 -> API Gateway -> lambda
    -API Gateway : HTTP Request 라우팅기능, 람다 함수에 매핑하는기능
    -lamba : 직접 작성한 함수
  3. lambda
    요청을 받았으면 db에 연결해서 리턴해주던 저장하던 처리를 해야함
    controller(핸들러, 라우팅), service(비즈니스 로직), repository(DB CRUD)로 분류
    dynamoDB와 연결 : aws-sdk 이용, 이때 credential 필요
    AWS 리소스(S3, dynamoDB, lambda 등)을 sdk로 이용하려면 credential 있어야함. IAM에서 발급가능
  4. offline <-> AWS
    serverless framework : offline에서 개발하고 실행해서 테스트하고 deploy해서 AWS에 동기화 가능
    resource.yml : dynamoDB 관련 설정파일
    functions.yml : API Gateway 관련 설정파일
    functions/*.ts: lambda 코드 작성
    serverless.yml : 프로젝트 전체 설정파일 (lambda가 갖는 권한, S3 권한 등)
    ex) lambda에서 cloudwatch에 로그를 찍을수있는 권한이 있어야 로그출력 가능
    ex) S3버킷 getObject를 하기위해선 sdk로 S3 connection을 open하는 credential도 있어야하지만, 
    S3 CRUD를 실행하는 lambda가 실행권한도 있어야함



  5. Cloud Watch
    lambda -> 모니터링 -> cloud watch에서 보기 : 람다함수내에 console.log 해논애들이 여기 전부 찍힘
    한줄한줄이 다 돈임
  6. Cloud Formation
    serverless framework -> deploy -> Cloud Formation -> 역할, lambda, dynamoDB, API Gateway

    serverless로 deploy할때 AWS와 동기화해주는놈
    역할, 람다, dynamoDB, API Gateway 설정들을 모두 리소스로 따져서 정리해줌

    api 서버 프로젝트를 deploy 해놓고 바로 Cloud Formation보면 바쁘게 리소스 정리하고 동기화시키고
    중간에 실패하면 롤백하고 로그까지 찍어줌

    serverless.yml : provider : iam : 람다의 역할 -> 배포시 Cloud Formation, 역할에 자동등록됨
    serverless.yml : provider : s3 : S3설정 -> 배포시 Cloud Formation, S3의 설정정보에 자동등록됨 ex) CORS setting

    ex)resource.yml로 테이블 정의하고 deploy하면 Cloud Formation에 기록되며 
    dynamoDB에 테이블이 생성되는데 추후에 dynamoDB에 들어가서 수동으로 테이블 지우면
    Cloud Formation과 꼬일수있음
  7. dynamoDB
    기본 : Hash key, Range key
    Secondary index : Hash key, Range key
    Provisioning : 미리 준비해놓는건데 Thrououtput 5가 기본설정인데 매우비쌈
    개발할때 on-demand로 해놨다가 QE타거나 판매했을때 모자르면 올리면됨
  8. Cloud Front
    아무나 접근하면 안되므로 signedURL을 발급하던 signed cookie를 발급하던해야함

'Amazon AWS' 카테고리의 다른 글

[dynamoDB] Indexing  (1) 2021.08.25
[CloudFront]  (0) 2021.07.13
[IAM]  (0) 2021.07.07

브라우저에서 S3버킷에 있는 파일을 받아오려면 크게 두가지 방법이 있다.

signed url

  • aws-sdk S3 사용
  • s3.getSignedUrl('getObject', params);
  • s3버킷이름, path를 지정해서 download받을수있는 signed url을 제공받는 방식

Cloud Front

  1. AWS console에서 Cloud Front 설정을 해준다.
    route53 cloudfront 목적지
    cloudfront.test a1b2c3d4.cloudfront.net S3-mybuket
    위와 같이 설정하면 cloudfront CDN기능을 사용할수있게 된다.
  2. S3 버킷은 아무 브라우저에서나 접근할 수 없게 해야하기 때문에 쿠키를 만들어 넘겨줘야한다.
    • 비대칭키 한 쌍을 만든다.
      -----BEGIN RSA PRIVATE KEY-----
      1289uQWh9128HQhu912.....
      -----END RSA PRIVATE KEY-----
      
      -----BEGIN RSA PUBLIC KEY-----
      6HA1Z5911289uQWh9122.....
      -----END RSA PUBLIC KEY-----
    • AWS console S3 - keys에 접속한다.
    • public key를 import 한다. 그럼 key-pair-id가 생성된다.
      A2BCH5S0WXGYFE​
  3. aws-sdk CloudFront를 사용해서 signer를 생성한다.
    ex) const signer = new CloudFront.Signer(key_pair_id, private_key);
    private_key는 비대칭키 한쌍을 만들 때 생성된 private key이다.
  4. 정책을 작성한다.
    Statement: [
                {
                    Resource: 'https://cloudfront.test/' + path,
                    Condition: {
                        DateLessThan: {
                            'AWS:EpochTime': expires
                        }
                    }
                }
    ]​
    path는 S3버킷 내의 파일 경로이고
    expires는 유효 시간이다.
  5. signer를 이용해서 쿠키를 발행해서 프론트엔드로 넘겨준다.
    signer.getSignedCookie(정책);
  6. 개발자도구 - Application - Cookie를 확인해보면
    쿠키가 생긴것을 확인할수있다.
  7. 이제 해당 쿠키로 Cloud Front에 접근할 수 있다.

 

'Amazon AWS' 카테고리의 다른 글

[dynamoDB] Indexing  (1) 2021.08.25
[AWS 개발환경]  (1) 2021.08.25
[IAM]  (0) 2021.07.07

개념들

정책

사용자

그룹

역할

 

언제 사용하는가

serverless deploy : 아무나 deploy 해버리면 안된다.

serverless offline - resource 접근시 : ex) offline lambda->online S3, online dynamoDB 접근시

'Amazon AWS' 카테고리의 다른 글

[dynamoDB] Indexing  (1) 2021.08.25
[AWS 개발환경]  (1) 2021.08.25
[CloudFront]  (0) 2021.07.13

+ Recent posts