Tech Blog
Python에서 AWS dynamoDB 사용하기 본문
AWS dynamoDB
Amazon DynamoDB는 Amazon Web Services (AWS)의 완전 관리형 NoSQL 데이터베이스 서비스로, DynamoDB는 키-값 쌍의 데이터 모델을 사용하여 데이터를 저장하며, 스키마가 없는 데이터베이스입니다. DynamoDB는 초당 수백만 개의 요청을 처리할 수 있는 빠른 성능과 높은 확장성을 제공하며, 애플리케이션의 데이터 관리를 간편하게 해줍니다.
DynamoDB는 데이터의 저장과 검색을 위해 테이블을 사용합니다. 테이블은 여러 개의 항목(item)으로 구성되며, 각 항목은 고유한 기본 키(primary key)로 식별됩니다. 기본 키는 단일 속성(primary key) 또는 복합 키(composite key)로 구성될 수 있습니다.
패키지 설치
pip install boto3
파이썬에서 dynamoDB를 사용하기 위해서는 위와 같이 boto3라는 패키지를 설치해야합니다.
dynamoDB 설정하기
dynamoDB 전용 IAM 계정을 만들고, access key와 secret key를 발급 받았다면, 파이썬에서 설정을 해주어야 합니다. 유출되어서는 안 될 중요한 정보이므로 본 글에서는 dotenv를 사용합니다 .
pip install python-dotenv
먼저, python-dotenv 패키지를 설치합니다.
.env
AWS_ACCESS_KEY_ID=[AWS_ACCESS_KEY_ID]
AWS_SECRET_ACCESS_KEY=[AWS_SECRET_ACCESS_KEY]
REGION=[REGION]
그 다음 .env 파일을 하나 생성하고, 위와 같은 형식으로 작성해줍니다.
import boto3
import pandas as pd
import os
from dotenv import load_dotenv
load_dotenv()
AWS_ACCESS_KEY_ID=os.getenv("AWS_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY=os.getenv("AWS_SECRET_ACCESS_KEY")
REGION=os.getenv("REGION")
코드로 불러올 땐 상단에 load_dotenv() 를 호출해주고, os.getenv() 함수를 사용하여 저장해놓은 값을 불러올 수 있습니다.
dynamoDB 테이블 생성 및 연결
우선, dynamoDB 페이지에서 테이블 하나를 생성합니다.
본 글에서는 주식의 시장 별로 종목코드를 저장할 예정입니다. 테이블 이름은 적절히 MARKET_CODE로 적어주었고, 파티션키는 key_market으로 이름을 지어주었습니다. 테이블 안에 항목이 있고, 그 항목을 구분지어주는 것이 파티션 키입니다. 따라서 파티션 키에 시장(market) 정보를 넣어 시장 별 종목코드로 구분해주겠습니다.
테이블을 생성하고 나면 위와 같은 정보로 활성화된 것을 확인할 수 있습니다.
dynamodb = boto3.resource('dynamodb', region_name=REGION,aws_access_key_id=AWS_ACCESS_KEY_ID,aws_secret_access_key=AWS_SECRET_ACCESS_KEY)
table = dynamodb.Table("MARKET_CODE")
boto3를 사용하여 앞서 설정해놓은 값들을 사용하여 dynamoDB에 연결하여 dynamodb 변수에 넣어주고, 해당 객체에서 Table 함수를 사용하여 생성한 MARKET_CODE 테이블을 불러왔습니다.
데이터 업로드
table.put_item(Item=dic_data)
데이터 업로드는 위와 같이 table 객체의 put_item 함수를 사용하여 수행할 수 있으며, 데이터를 dictionary 형태로 생성하여 저장할 수 있습니다.
아래의 예시는 데이터 프레임으로 된 데이터를 시장 별 종목코드의 형태가 되도록 업로드하는 예시입니다.
from tqdm import tqdm
data['Code'] = data['Code'].apply(lambda x: x.zfill(6))
for market in tqdm(data['Market'].unique()):
dic_data = {}
lst_code = data[data['Market'] == market].Code.unique().tolist()
dic_data['Code'] = lst_code
dic_data['key_market'] = market
print("아이템 넣기 시작")
table.put_item(Item=dic_data)
dic_data 딕셔너리에서 key가 'Code'에 market에 해당하는 종목코드 리스트를 넣어주고, 파티션키로 지정했던 'key_market'에 시장 문자열을 넣어줍니다. 그 다음, 그 데이터를 put_item 함수의 Item 파라미터에 넣어주면 됩니다.
항목 탐색 탬에서 테이블을 클릭하면 key_market 별로 종목코드가 잘 들어간 것을 확인할 수 있습니다.
데이터 불러오기
lst_code = table.get_item(Key={"key_market": "KONEX"})["Item"]['Code'] ## 코넥스의 데이터만 불러온다면
print(len(lst_code))
print(lst_code[:5])
데이터는 table 객체의 get_item 함수로 불러올 수 있습니다. 만약 시장이 KONEX인 종목코드들만 불러오고 싶다면, 위의 예시처럼 Key 인자에 {파티션키: 값} 의 형태로 넣어주면 되고, 그 데이터는 Item안에 Code 안에 리스트로 담겨져 있습니다.
RDBMS로 이 형식의 데이터를 어떻게 저장해야할지 고민을 했었는데, 키-값 형태로 저장할 수 있으면서 형식에 따로 구애받지 않는 NoSQL로 선택하여, 더 효율적으로 데이터를 불러올 수 있게 된 것 같습니다.
'etc. > 경험' 카테고리의 다른 글
Oracle Cloud 인스턴스에서 Docker MySQL 사용 (0) | 2023.03.22 |
---|---|
github action 컴파일 (JOSS 논문) (0) | 2023.03.21 |
git lfs 사용하여 대용량 데이터 업로드하기 (0) | 2023.03.18 |