Posts DynamoDB 기존 테이블에 Item 업데이트 하기
Post
Cancel

DynamoDB 기존 테이블에 Item 업데이트 하기

DynamoDB

Amazon DynamoDB는 어떤 규모에서도 10밀리초 미만의 성능을 제공하는 키-값 및 문서 데이터베이스입니다. 완전관리형의 내구성이 뛰어난 다중 리전, 다중 마스터 데이터베이스로서, 인터넷 규모 애플리케이션을 위한 보안, 백업 및 복원, 인 메모리 캐싱 기능을 기본적으로 제공합니다. DynamoDB는 하루에 10조 개 이상의 요청을 처리할 수 있고, 초당 2,000만 개 이상의 피크 요청을 지원할 수 있습니다.

Lyft, Airbnb, Redfin 등과 같이 세계에서 가장 빠르게 성장하는 다수의 비즈니스뿐만 아니라 삼성, Toyota, Capital One과 같은 엔터프라이즈에서도 자사의 미션 크리티컬 워크로드를 지원하기 위해 DynamoDB의 규모와 성능을 활용하고 있습니다.

수십만이 넘는 AWS 고객들은 모바일, 웹, 게임, 광고 기술, IoT 및 규모와 상관없이 지연 시간이 짧은 데이터 액세스가 필요한 기타 애플리케이션을 위한 키-값 및 문서 데이터베이스로 DynamoDB를 선택했습니다. 애플리케이션을 위한 새로운 테이블을 생성하면 DynamoDB가 나머지를 처리해 드립니다.

AWS DynamoDB는 NoSQL의 데이터베이스입니다. 스키마가 유연한 것이 장점입니다. 현재 진행하고 사용설명서 크롤링 데이터의 특성상 한 제품에 대해 이미지 유무, 매뉴얼 갯수가 유동적이어서 선택했습니다. AWS DynamoDB를 코드에서 활용하기 위해선 AWS CLI 설치가 필요하고 IAM을 통해 계정생성이 필요합니다. 이 부분은 생략하겠습니다.

boto3

사용설명서 데이터를 파이썬으로 크롤링했고 이 데이터들을 json 파일로 따로 저장해두었다가 DynamoDB에 업로드 하는 방식을 수행했습니다. boto3는 파이썬용 AWS SDK이고 DynamoDB외 다른 리소스들을 제어할 수 있는 인터페이스들을 제공합니다.

Python용 AWS SDK인 boto3를 사용하여 AWS를 빠르게 시작하십시오. Boto3를 사용하면 Python 애플리케이션, 라이브러리 또는 스크립트를 Amazon S3, Amazon EC2, Amazon DynamoDB 등 AWS 서비스와 쉽게 통합할 수 있습니다.

JSON 데이터 읽어서 기존 테이블의 아이템에 새로운 애트리뷰트 추가

1
2
3
{"manual": [{"CLP-415N": {"Quick Guide": ["https://downloadcenter.samsung.com/content/EM/201205/20120517132709133/CLP-41x_68x_English.pdf"], "\uc0ac\uc6a9\uc790 \ub9e4\ub274\uc5bc": ["https://downloadcenter.samsung.com/content/UM/201704/20170406101127510/AR/Arabic/Arabic/start_here.htm", "https://downloadcenter.samsung.com/content/UM/201206/20120626084715649/BG/bulgarian.pdf", "https://downloadcenter.samsung.com/content/UM/201704/20170406101127510/BG/Bulgarian/Bulgarian/start_here.htm", "https://downloadcenter.samsung.com/content/UM/201206/20120626084715649/CS/czech.pdf", "https://downloadcenter.samsung.com/content/UM/201704/20170406101127510/CS/Czech/Czech/start_here.htm", "https://downloadcenter.samsung"]
       ...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import json
import boto3


def load_manuals(manuals, dynamodb=None):
    if not dynamodb:
        dynamodb = boto3.resource('dynamodb')

    table = dynamodb.Table('product_table')
    
    # 데이터 전처리
    for manual in manuals['manual']:
        product_code = ''
        for key in manual.keys():
            product_code = key
        manual_link = ''
        for item in manual[product_code].items():
            manual_link = item[1]
        dict_manual_link = {'manual_link': manual_link}
				
        # Item 업데이트
        response = table.update_item(
            Key={
                'product_code': product_code,
                'category': "프린터"
            },
            AttributeUpdates={
              'manual_link': {
                'Value': dict_manual_link
                'Action': 'PUT'
              }
            }
        )
        print(response)

if __name__ == '__main__':
    with open("manual_lists.json") as json_file:
        manual_list = json.load(json_file, parse_float=Decimal)
    load_manuals(manual_list)

AttributeUpdates 공식 가이드

위의 코드에서 핵심은 해당 테이블에 맞는 Key(Parition Key, Sort Key 또는 Partion Key)와 AttributeUpdates 파라미터입니다. Attribute 파라미터 안에는 Item의 새로 생성하고 싶은 Attribute 이름이나 수정하고 싶은 이름을 적고, Value와 Action 속성을 정의해줍니다.

  • PUT - 지정된 속성을 항목에 추가합니다. 속성이 이미 있는 경우 새 값으로 바뀝니다.

  • DELETE - DELETE에 대해 지정된 값이 없는 경우, 속성과 해당 값을 제거합니다. 지정된 값의 데이터 유형은 기존 값의 데이터 유형과 일치해야 합니다.

    값 세트가 지정된 경우 해당 값이 이전 세트에서 제거됩니다. 예를 들어, 속성 값이 세트 [a,b,c]이고 DELETE 작업이 [a,c]를 지정하면, 최종 속성 값은 [b]가 됩니다. 빈 세트를 지정하면 오류가 발생합니다.

  • ADD - 속성이 아직 없으면 지정된 값을 항목에 추가합니다. 속성이 있으면 ADD의 동작은 속성의 데이터 형식에 따라 달라집니다.

    • 기존 속성이 숫자이고 Value도 숫자이면 Value가 산술적으로 기존 속성에 추가됩니다. Value가 음수이면 기존 속성에서 차감됩니다.

정리

파이썬 코드에서 JSON 데이터를 입력받고 전처리를 하여 DB에 생성돼있던 테이블을 수정하는 방법을 알아봤습니다. 이밖에 put_item, delete_item, get_item (이하 Item CRUD)이 있으니 더 찾아보시면 좋을 것 같습니다.

참고

boto3 Docs

AttributeUpdates 상세 설명

This post is licensed under CC BY 4.0 by the author.

API Gateway에서 람다로 쿼리스트링 넘겨주기

S3 정적호스팅 github actions 사용하여 자동 배포

Comments powered by Disqus.