본문 바로가기

AWS

[AWS] boto3로 DynamoDB에 데이터 넣기

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html

 

What is Amazon DynamoDB? - Amazon DynamoDB

Thanks for letting us know this page needs work. We're sorry we let you down. If you've got a moment, please tell us how we can make the documentation better.

docs.aws.amazon.com

DynamoDB 생성하는 법과 개념은 위 링크에 잘 정리되어 있으니 참고하면 된다.

 

resource example

import boto3
from botocore.exceptions import ClientError
import json

dynamodb = boto3.resource(
    "dynamodb",
    aws_access_key_id="",
    aws_secret_access_key=""
)


def insert_dynamodb(tablename):
    table = dynamodb.Table(tablename)

    # 여러 데이터 삽입 예제
    items = [
        {"pk": "1", "age": "30", "name": "박나무"},
        {"pk": "2", "age": "25", "name": "김나무"},
        {"pk": "3", "age": "29", "name": "이나무"},
    ]

    for item in items:
        try:
            res = table.put_item(Item=item)
            print(f"{item} inserted into dynamodb successfully")
        except Exception as e:
            print(f"Insert Error : {e}")


if __name__ == "__main__":
    insert_dynamodb("hb_dynamo")

 

매우 간단한 코드로 데이터를 넣어주는 프로그램을 구현할 수 있다.

 

 

Table - Boto3 1.35.0 documentation

Previous tables

boto3.amazonaws.com

해당 링크에 가보면 여러가지 기능을가진 모듈이 있으니 필요한걸 찾아 사용하면 된다. 

 

참고로 boto3는 크게 resource, client로 나뉘는데 resource는 좀 더 사용하고 간편하며 client는 low 레벨이기 때문에 실제 api와 거의 일대일 매핑이라고 한다. 본인은 개인적으로 client를 선호하지만 resource에 비해 고려할게 더 많다.

 

이번엔 client를 사용해서 dynamodb에 데이터를 넣어보자

 

 

 

client example

먼저 정리하면, 아래 코드는 s3에 있는 csv 파일을 읽어 dynamodb에 넣어주는 코드이다.

import boto3
import csv
from io import StringIO

dynamodb = boto3.client("dynamodb")

s3 = boto3.client("s3")
res = s3.get_object(Bucket="ke-ivr-data", Key="deparv.csv")  # 버킷명과 파일명 지정


def insert_dynamodb(tablename):
    data = res["Body"].read().decode("utf-8")
    reader = csv.DictReader(StringIO(data))

    for idx, row in enumerate(reader):
        try:
            dynamodb.put_item(
                TableName="deparv",  # dynamodb 테이블명 지정
                Item={k: {"S": v} for k, v in row.items()},
            )
        except Exception as e:
            print(e)


if __name__ == "__main__":
    insert_dynamodb("hb_dynamo")

 

 

위 코드에서 res를 출력해보면 아래와 같다.

 

실제 파일의 내용은 'Body'에 있으며, decoding 해주어야 파일 내용을 확인할 수 있다. csv 모듈을 이용해서 딕셔너리 형태로 가공한 후 읽어보면 실제 파일의 내용을 딕셔너리 형태로 출력해준다.

이후 각 row에 있는 key, value를 Item에 넣어 dynamodb에 넣어주면 된다.

 

추가로 여기서 살펴볼건 client에서의 Item 형태가 resource와는 다르다는 점이다. 

  • resource = {"key": "value"}
  • client = {"key": {"S" : "value"}  //  value에 'S'라는 키가 있고 해당 키에 대한 value가 실제 넣을 value임

DynamoDB는 마찬가지로 각 칼럼마다 문자열인지, 숫자인지, bool인지, null 인지 등을 지정해줄 수 있는데, resource에선 이러한 칼럼의 데이터타입을 명시해주지 않아도 되지만, client에선 명시해주어야 한다. 

 

따라서 client를 사용하면 데이터가 많거나, 특정한 경우에만 insert하는 경우 프로그램을 짤 때 약간 헷갈린다.