Skip to main content

DynamoDB


λ―Έκ΅­ μ„œλΆ€(였레곀) κΈ°μ€€μž…λ‹ˆλ‹€.

Price#

  • 데이터 μ €μž₯: 25 GB 무료, $ 0.25 / GB / μ›”
  • μ“°κΈ°: $ 1.25 / 1,000,000 WCU
  • 볡제된 μ“°κΈ°: $ 1.875 / 1,000,000 rWCU (GSI)
  • 읽기: $ 0.25 / 1,000,000 RCU
  • 데이터 μˆ˜μ‹ : 무료
  • 데이터 솑신: 1 GB / μ›” 무료, λ‹€μŒ 40 TB / μ›” $ 0.085 / GB

Capacity#

Capacity Unit#

계산 μ‹œ λ°œμƒν•˜λŠ” μ†Œμˆ˜μ  μ΄ν•˜ 뢀뢄은 μ˜¬λ¦Όν•©λ‹ˆλ‹€.

  • Read Capacity Units: RCU
    • Strongly Consistent Read: 4 KB λ‹Ή 1 RCU
    • Eventually Consistent Read: 8 KB λ‹Ή 1 RCU
    • Transaction Read: 2 KB λ‹Ή 1 RCU
  • Write Capacity Units: WCU
    • Write: 1 KB λ‹Ή 1 WCU
    • Transaction Write: 0.5 KB λ‹Ή 2 WCU

Provisioned Capacity#

μ΄ˆλ‹Ή Provisioned read capacity λ˜λŠ” Provisioned write capacityλ₯Ό λ„˜λŠ” μž‘μ—…μ΄ μš”μ²­λ˜λ©΄ ν•΄λ‹Ή μž‘μ—…μ€ ProvisionedThroughputExceededExceptionκ³Ό ν•¨κ»˜ throttle μƒνƒœκ°€ λ©λ‹ˆλ‹€.

Key-Value#

Key#

  • Partition key
    • λ‚΄λΆ€ ν•΄μ‹œ ν•¨μˆ˜μ— λŒ€ν•œ μž…λ ₯으둜 partition key 값을 μ‚¬μš©ν•©λ‹ˆλ‹€. ν•΄μ‹œ ν•¨μˆ˜ 좜λ ₯에 따라 item을 μ €μž₯ν•  νŒŒν‹°μ…˜ (DynamoDB λ‚΄λΆ€μ˜ 물리적 μŠ€ν† λ¦¬μ§€) 이 κ²°μ •λ©λ‹ˆλ‹€.
    • ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”μ—μ„œ partition keyλŠ” κ³ μœ ν•©λ‹ˆλ‹€.
  • Partition key+Sort key
    • λ‚΄λΆ€ ν•΄μ‹œ ν•¨μˆ˜μ— λŒ€ν•œ μž…λ ₯으둜 partition key 값을 μ‚¬μš©ν•©λ‹ˆλ‹€. 같은 partition keyλ₯Ό κ°™λŠ” itemλ“€μ˜ 경우 partition key에 μ˜ν•΄ κ²°μ •λœ νŒŒν‹°μ…˜μ— sort key 값을 κΈ°μ€€μœΌλ‘œ μ •λ ¬λ˜μ–΄ ν•¨κ»˜ μ €μž₯λ©λ‹ˆλ‹€.
    • ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”μ—μ„œ partition key, sort key 쑰합은 κ³ μœ ν•©λ‹ˆλ‹€.

Index#

  • LSI(Local Secondary Index)
    • κΈ°λ³Έ ν…Œμ΄λΈ”μ˜ Partition Key와 μƒˆλ‘œμš΄ Sort Keyλ₯Ό μ‚¬μš©ν•˜μ—¬ μƒˆλ‘œμš΄ ν…Œμ΄λΈ”μ„ μƒμ„±ν•©λ‹ˆλ‹€.
    • LSI의 sort key 값은 κ³ μœ ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
    • κΈ°λ³Έ ν…Œμ΄λΈ”μ˜ sort keyκ°€ 기본으둜 Projection λ©λ‹ˆλ‹€.
    • κΈ°λ³Έ ν…Œμ΄λΈ”μ˜ Attirbute 쀑 μ›ν•˜λŠ” 것을 인덱슀 ν…Œμ΄λΈ”μ— 포함 μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
    • ν…Œμ΄λΈ”λ‹Ή μ΅œλŒ€ 5개의 LSIλ₯Ό 생성할 수 있고, ν…Œμ΄λΈ”μ„ λ§Œλ“€ λ•Œ 미리 섀정해두어야 ν•©λ‹ˆλ‹€.
    • LSIκ°€ μžˆλŠ” ν…Œμ΄λΈ”μ˜ 경우 νŒŒν‹°μ…˜ ν‚€ κ°’λ‹Ή 10GB의 item collection ν•œλ„κ°€ μ μš©λ©λ‹ˆλ‹€.
  • GSI(Global Secondary Index)
    • μƒˆλ‘œμš΄ Partition Key와 Sort Keyλ₯Ό μ‚¬μš©ν•˜μ—¬ μƒˆλ‘œμš΄ ν…Œμ΄λΈ”μ„ μƒμ„±ν•©λ‹ˆλ‹€.
    • GSI의 ν‚€ 값은 κ³ μœ ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
    • κΈ°λ³Έ ν…Œμ΄λΈ”μ˜ partition key와 sort keyκ°€ 기본으둜 Projection λ©λ‹ˆλ‹€.
    • κΈ°λ³Έ ν…Œμ΄λΈ”μ˜ Attirbute 쀑 μ›ν•˜λŠ” 것을 인덱슀 ν…Œμ΄λΈ”μ— 포함 μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
    • ν…Œμ΄λΈ”λ‹Ή μ΅œλŒ€ 20개의 GSIλ₯Ό 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.
    • κΈ°λ³Έ ν…Œμ΄λΈ”κ³Ό GSI ν…Œμ΄λΈ”μ€ μžλ™μœΌλ‘œ λ™κΈ°ν™”λ©λ‹ˆλ‹€.

Item#

  • Key-Value(Attirbute)둜 κ΅¬μ„±λ˜μ–΄ μžˆλŠ” ν•˜λ‚˜μ˜ ν•­λͺ©μž…λ‹ˆλ‹€.
  • μ΅œλŒ€ 400 KB의 크기λ₯Ό κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 크기
    • λ¬Έμžμ—΄: (Attribute 이름 길이) + (UTF-8 μΈμ½”λ”©λœ λ¬Έμžμ—΄ λ°”μ΄νŠΈ 수)
    • 숫자: (Attribute 이름 길이) + (유효 숫자 2 μžλ¦¬λ‹Ή 1) + 1, μ–‘ 끝의 0은 μ œμ™Έ
    • λ°”μ΄λ„ˆλ¦¬: (Attribute 이름 길이) + (λ°”μ΄λ„ˆλ¦¬ λ°”μ΄νŠΈ 수)
    • null or λΆˆλ¦¬μ–Έ: (Attribute 이름 길이) + 1
    • List or Map: (Attribute 이름 길이) + (μ€‘μ²©λœ μš”μ†Œ 크기) + (μ˜€λ²„ν—€λ“œ 3)

Table#

Create#

import boto3from boto3.dynamodb.types import BOOLEAN, NUMBER, STRING
dynamodb = boto3.resource("dynamodb", region_name="us-west-2")
create_table_kwargs = {    "TableName": "Test",    "KeySchema": [        {"AttributeName": "PK", "KeyType": "HASH"},        {"AttributeName": "SK", "KeyType": "RANGE"},    ],    "AttributeDefinitions": [        {"AttributeName": "PK", "AttributeType": STRING},        {"AttributeName": "SK", "AttributeType": NUMBER},        {"AttributeName": "attr1", "AttributeType": STRING},        {"AttributeName": "attr2", "AttributeType": BOOLEAN},    ],    "BillingMode": "PAY_PER_REQUEST",}
table = dynamodb.create_table(**create_table_kwargs)

Get#

Read#

GetItem#

  • RCUλŠ” κ°€μ Έμ˜¨ item 크기둜 κ³„μ‚°λ©λ‹ˆλ‹€.

BatchGetItem#

  • DynamoDB 둜의 λ„€νŠΈμ›Œν¬ 왕볡 μˆ˜κ°€ κ°μ†Œλ  수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ DynamoDB λŠ” κ°œλ³„ 읽기 μž‘μ—…μ„ λ³‘λ ¬λ‘œ μˆ˜ν–‰ν•©λ‹ˆλ‹€.
  • μ΅œλŒ€ 100개의 κ°œλ³„ μž‘μ—…μ„ 포함할 수 μžˆμŠ΅λ‹ˆλ‹€. μ΅œλŒ€ 16MB의 데이터λ₯Ό 검색할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • RCUλŠ” 각 item λ³„λ‘œ κ³„μ‚°λ©λ‹ˆλ‹€.

Query and Scan#

Query#

  • μ΅œλŒ€ 1 MB의 데이터λ₯Ό κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • RCUλŠ” λ°˜ν™˜λ˜λŠ” λͺ¨λ“  item 크기의 ν•©μœΌλ‘œ κ³„μ‚°λ©λ‹ˆλ‹€.

KeyConditionExpression FilterExpression ProjectionExpression

Scan#

  • μ΅œλŒ€ 1 MB의 데이터λ₯Ό κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • RCUλŠ” scan을 μœ„ν•΄ ν™•μΈν•œ λͺ¨λ“  item 크기의 ν•©μœΌλ‘œ κ³„μ‚°λ©λ‹ˆλ‹€.

Write#

  • ConditionExpression 식에 λ§žμ§€ μ•Šμ•„ μ“°κΈ°λ₯Ό μ‹€νŒ¨ν•˜λ”λΌλ„ ν•΄λ‹Ή WCUκ°€ μ‚¬μš©λ©λ‹ˆλ‹€.

PutItem#

  • WCUλŠ” 동일 ν‚€κ°€ μ‘΄μž¬ν•˜μ§€ μ•Šμ€ 경우 μƒˆλ‘œ μƒμ„±λ˜λŠ” item 크기둜 κ³„μ‚°λ˜κ³ , μ‘΄μž¬ν•˜λŠ” 경우 더 큰 크기둜 κ³„μ‚°λ©λ‹ˆλ‹€.

UpdateItem#

  • WCUλŠ” μ—…λ°μ΄νŠΈ μ „ ν›„μ˜ item 크기 쀑 더 큰 크기둜 κ³„μ‚°λ©λ‹ˆλ‹€.

DeleteItem#

  • WCUλŠ” μ‚­μ œλœ item 크기둜 κ³„μ‚°λ©λ‹ˆλ‹€.

BatchWriteItem#

  • DynamoDB 둜의 λ„€νŠΈμ›Œν¬ 왕볡 μˆ˜κ°€ κ°μ†Œλ  수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ DynamoDB λŠ” κ°œλ³„ μ“°κΈ° μž‘μ—…μ„ λ³‘λ ¬λ‘œ μˆ˜ν–‰ν•©λ‹ˆλ‹€.
  • μ΅œλŒ€ 25개의 κ°œλ³„ μž‘μ—…μ„ 포함할 수 μžˆμŠ΅λ‹ˆλ‹€. μ΅œλŒ€ 16MB의 데이터λ₯Ό μ“Έ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • WCUλŠ” 각 item λ³„λ‘œ κ³„μ‚°λ©λ‹ˆλ‹€.

Reference#