Infra

[AWS] DynamoDB 테이블 생성 및 데이터 조회

yerinpark 2024. 2. 26. 12:05

Amazon DynamoDB란?

Amazon DynamoDB는 완전관리형 NoSQL 데이터베이스 서비스로서 원활한 확장성과 함께 빠르고 예측 가능한 성능을 제공한다. DynamoDB는 분산 데이터베이스를 운영하고 크기 조정하는 데 따른 관리 부담을 줄여서 하드웨어 프로비저닝, 설정 및 구성, 복제, 소프트웨어 패치 또는 클러스터 크기 조정에 대해 걱정할 필요가 없게 한다. 또한 DynamoDB는 유휴 시 암호화를 제공하여 중요한 데이터 보호와 관련된 운영 부담 및 복잡성이 감소한다.

 

 

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

 

What is Amazon DynamoDB? - Amazon DynamoDB

What is Amazon DynamoDB? Amazon DynamoDB is a fully managed NoSQL database service that provides fast and predictable performance with seamless scalability. DynamoDB lets you offload the administrative burdens of operating and scaling a distributed databas

docs.aws.amazon.com

 

Windows 환경에서 다음 과정을 진행했다. 하지만 AWS 공식 문서에서 제공해주는 Windows 명령어가 CMD와 Windows Powershell에서 제대로 인식되지 않는 문제점이 있었다. 따라서 Git Bash를 활용해 Linux 명령어로 진행했다.

 

1. 테이블 생성

테이블이 겹치지 않게 번호를 붙여줬다.

aws dynamodb create-table \
    --table-name Music09 \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema \
        AttributeName=Artist,KeyType=HASH \
        AttributeName=SongTitle,KeyType=RANGE \
    --provisioned-throughput \
        ReadCapacityUnits=10,WriteCapacityUnits=5

2. 데이터 쓰기

Admin@1-28 MINGW64 ~
$ aws dynamodb put-item \
    --table-name Music09  \
    --item \
        '{"Artist": {"S": "No One You Know"}, "SongTitle": {"S": "Call Me Today"}, "AlbumTitle": {"S": "Somewhat Famous"}, "Awards": {"N": "1"}}'

aws dynamodb put-item \
    --table-name Music09  \
    --item \
        '{"Artist": {"S": "No One You Know"}, "SongTitle": {"S": "Howdy"}, "AlbumTitle": {"S": "Somewhat Famous"}, "Awards": {"N": "2"}}'

aws dynamodb put-item \
    --table-name Music09 \
    --item \
        '{"Artist": {"S": "Acme Band"}, "SongTitle": {"S": "Happy Day"}, "AlbumTitle": {"S": "Songs About Life"}, "Awards": {"N": "10"}}'

aws dynamodb put-item \
    --table-name Music09 \
    --item \
        '{"Artist": {"S": "Acme Band"}, "SongTitle": {"S": "PartiQL Rocks"}, "AlbumTitle": {"S": "Another Album Title"}, "Awards": {"N": "8"}}'

 

3. 데이터 검색

Admin@1-28 MINGW64 ~
$ aws dynamodb get-item --consistent-read \
    --table-name Music09 \
    --key '{ "Artist": {"S": "Acme Band"}, "SongTitle": {"S": "Happy Day"}}'
{
    "Item": {
        "AlbumTitle": {
            "S": "Songs About Life"
        },
        "Awards": {S
            "N": "10"
        },
        "Artist": {
            "S": "Acme Band"
        },
        "SongTitle": {
            "S": "Happy Day"
        }
    }
}

4. 데이터 쿼리(검색)

"Music09" DynamoDB 테이블에서 "Artist" 속성이 "Acme Band"와 동일한 항목 조회하기

  • aws dynamodb query: DynamoDB에서 데이터를 조회하는 AWS CLI 명령어
  • -table-name Music09: DynamoDB 테이블의 이름 지정
  • -key-condition-expression "Artist = :name": 쿼리의 조건 정의. "Artist" 속성이 ":name"에 지정된 값과 동일한 항목을 검색하려는 것을 나타낸다.
  • -expression-attribute-values '{":name":{"S":"Acme Band"}}': 키 조건 표현식에서 사용되는 ":name" 자리 표시자에 대한 실제 값 제공. ":name"을 "Acme Band"로 설정하고 "S"는 속성 유형이 문자열이다.
Admin@1-28 MINGW64 ~
$ aws dynamodb query \
    --table-name Music09 \
    --key-condition-expression "Artist = :name" \
    --expression-attribute-values  '{":name":{"S":"Acme Band"}}'
{
    "Items": [
        {
            "AlbumTitle": {
                "S": "Songs About Life"
            },
            "Awards": {
                "N": "10"
            },
            "Artist": {
                "S": "Acme Band"
            },
            "SongTitle": {
                "S": "Happy Day"
            }
        },
        {
            "AlbumTitle": {
                "S": "Another Album Title"
            },
            "Awards": {
                "N": "8"
            },
            "Artist": {
                "S": "Acme Band"
            },
            "SongTitle": {
                "S": "PartiQL Rocks"
            }
        }
    ],
    "Count": 2,
    "ScannedCount": 2,
    "ConsumedCapacity": null
}

5. 글로벌 보조 인덱스 생성

aws dynamodb update-table \
    --table-name Music09 \
    --attribute-definitions AttributeName=AlbumTitle,AttributeType=S \
    --global-secondary-index-updates \
        "[{\"Create\":{\"IndexName\": \"AlbumTitle-index\",\"KeySchema\":[{\"AttributeName\":\"AlbumTitle\",\"KeyType\":\"HASH\"}], \
        \"ProvisionedThroughput\": {\"ReadCapacityUnits\": 10, \"WriteCapacityUnits\": 5      },\"Projection\":{\"ProjectionType\":\"ALL\"}}}]"

결과

Admin@1-28 MINGW64 ~
$ aws dynamodb update-table \
    --table-name Music09 \
    --attribute-definitions AttributeName=AlbumTitle,AttributeType=S \
    --global-secondary-index-updates \
        "[{\"Create\":{\"IndexName\": \"AlbumTitle-index\",\"KeySchema\":[{\"AttributeName\":\"AlbumTitle\",\"KeyType\":\"HASH\"}], \
        \"ProvisionedThroughput\": {\"ReadCapacityUnits\": 10, \"WriteCapacityUnits\": 5      },\"Projection\":{\"ProjectionType\":\"ALL\"}}}]"
{
    "TableDescription": {
        "AttributeDefinitions": [
            {
                "AttributeName": "AlbumTitle",
                "AttributeType": "S"
            },
            {
                "AttributeName": "Artist",
                "AttributeType": "S"
            },
            {
                "AttributeName": "SongTitle",
                "AttributeType": "S"
            }
        ],
        "TableName": "Music09",
        "KeySchema": [
            {
                "AttributeName": "Artist",
                "KeyType": "HASH"
            },
            {
                "AttributeName": "SongTitle",
                "KeyType": "RANGE"
            }
        ],
        "TableStatus": "UPDATING",
        "CreationDateTime": "2024-02-26T09:21:05.849000+09:00",
        "ProvisionedThroughput": {
            "NumberOfDecreasesToday": 0,
            "ReadCapacityUnits": 10,
            "WriteCapacityUnits": 5
        },
        "TableSizeBytes": 0,
        "ItemCount": 0,
        "TableArn": "arn:aws:dynamodb:ap-northeast-2:-------:table/Music09",
        "TableId": "------------------------",
        "GlobalSecondaryIndexes": [
            {
                "IndexName": "AlbumTitle-index",
                "KeySchema": [
                    {
                        "AttributeName": "AlbumTitle",
                        "KeyType": "HASH"
                    }
                ],
                "Projection": {
                    "ProjectionType": "ALL"
                },
                "IndexStatus": "CREATING",
                "Backfilling": false,
                "ProvisionedThroughput": {
                    "NumberOfDecreasesToday": 0,
                    "ReadCapacityUnits": 10,
                    "WriteCapacityUnits": 5
                },
                "IndexSizeBytes": 0,
                "ItemCount": 0,
                "IndexArn": "arn:aws:dynamodb:ap-northeast-2:----------------:table/Music09/index/AlbumTitle-index"
            }
        ],
        "DeletionProtectionEnabled": false
    }
}

Admin@1-28 MINGW64 ~
$

 

6. 글로벌 보조 인덱스 조회

Admin@1-28 MINGW64 ~
$ aws dynamodb query \
    --table-name Music09 \
    --index-name AlbumTitle-index \
    --key-condition-expression "AlbumTitle = :name" \
    --expression-attribute-values  '{":name":{"S":"Somewhat Famous"}}'
{
    "Items": [
        {
            "AlbumTitle": {
                "S": "Somewhat Famous"
            },
            "Awards": {
                "N": "1"
            },
            "Artist": {
                "S": "No One You Know"
            },
            "SongTitle": {
                "S": "Call Me Today"
            }
        },
        {
            "AlbumTitle": {
                "S": "Somewhat Famous"
            },
            "Awards": {
                "N": "2"
            },
            "Artist": {
                "S": "No One You Know"
            },
            "SongTitle": {
                "S": "Howdy"
            }
        }
    ],
    "Count": 2,
    "ScannedCount": 2,
    "ConsumedCapacity": null
}

 

Dynobase

https://dynobase.dev/

Amazon DynamoDB를 위한 GUI 도구.

 

실습

  1. anime table 생성. 데이터 저장, 검색
  2. emp table의 데이터로 emp table 생성. 데이터 저장, 검색

두 가지 방법으로 DynamoDB를 활용해보자.

 

 

참고로 한 디렉터리에 json 파일을 넣어두고 Git Bash를 열어줬다. 

 

anime table

테이블 생성

aws dynamodb create-table

aws dynamodb create-table \
--table-name anime09 \
--attribute-definitions AttributeName=title,AttributeType=S AttributeName=year,AttributeType=N \
--key-schema AttributeName=title,KeyType=HASH AttributeName=year,KeyType=RANGE \
--provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1

데이터 저장 및 조회

add_itmes.json

  • JSON 데이터 저장

aws dynamodb batch-write-item --request-items file://add_items.json

  • 데이터 검색

aws dynamodb scan --table-name anime09

emp table

DynamoDB Converter Tool

https://dynobase.dev/dynamodb-json-converter-tool/

This tool helps you convert plain JSON or JS object into a DynamoDB-compatible JSON format.

테이블 생성

Admin@1-28 MINGW64 /c/cloud/aws_dynamodb
$ aws dynamodb create-table \
--table-name emp09 \
--attribute-definitions AttributeName=empno,AttributeType=N AttributeName=hiredate,AttributeType=S \
--key-schema AttributeName=empno,KeyType=HASH AttributeName=hiredate,KeyType=RANGE \
--provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1
{
    "TableDescription": {
        "AttributeDefinitions": [
            {
                "AttributeName": "empno",
                "AttributeType": "N"
            },
            {
                "AttributeName": "hiredate",
                "AttributeType": "S"
            }
        ],
        "TableName": "emp09",
        "KeySchema": [
            {
                "AttributeName": "empno",
                "KeyType": "HASH"
            },
            {
                "AttributeName": "hiredate",
                "KeyType": "RANGE"
            }
        ],
        "TableStatus": "CREATING",
        "CreationDateTime": "2024-02-26T11:49:38.076000+09:00",
        "ProvisionedThroughput": {
            "NumberOfDecreasesToday": 0,
            "ReadCapacityUnits": 1,
            "WriteCapacityUnits": 1
        },
        "TableSizeBytes": 0,
        "ItemCount": 0,
        "TableArn": "arn:aws:dynamodb:ap-northeast-2:-------------:table/emp09",
        "TableId": "--------------",
        "DeletionProtectionEnabled": false
    }
}

emp_item.json

{
    "emp09": [
      {
        "PutRequest": {
          "Item": {
            "empno": {"N": "7369"},
            "ename": {"S": "SMITH"},
            "job": {"S": "CLERK"},
            "mgr": {"N": "7902"},
            "hiredate": {"S": "1980-12-17"},
            "sal": {"N": "800"},
            "comm": {"NULL": true},
            "deptno": {"N": "20"}
          }
        }
      },
      {
        "PutRequest": {
          "Item": {
            "empno": {"N": "7499"},
            "ename": {"S": "ALLEN"},
            "job": {"S": "SALESMAN"},
            "mgr": {"N": "7698"},
            "hiredate": {"S": "1981-02-20"},
            "sal": {"N": "1600"},
            "comm": {"N": "300"},
            "deptno": {"N": "30"}
          }
        }
      },
      {
        "PutRequest": {
          "Item": {
            "empno": {"N": "7521"},
            "ename": {"S": "WARD"},
            "job": {"S": "SALESMAN"},
            "mgr": {"N": "7698"},
            "hiredate": {"S": "1981-02-22"},
            "sal": {"N": "1250"},
            "comm": {"N": "500"},
            "deptno": {"N": "30"}
          }
        }
      },
      {
        "PutRequest": {
          "Item": {
            "empno": {"N": "7566"},
            "ename": {"S": "JONES"},
            "job": {"S": "MANAGER"},
            "mgr": {"N": "7839"},
            "hiredate": {"S": "1981-04-02"},
            "sal": {"N": "2975"},
            "comm": {"NULL": true},
            "deptno": {"N": "20"}
          }
        }
      },
      {
        "PutRequest": {
          "Item": {
            "empno": {"N": "7654"},
            "ename": {"S": "MARTIN"},
            "job": {"S": "SALESMAN"},
            "mgr": {"N": "7698"},
            "hiredate": {"S": "1981-09-28"},
            "sal": {"N": "1250"},
            "comm": {"N": "1400"},
            "deptno": {"N": "30"}
          }
        }
      },
      {
        "PutRequest": {
          "Item": {
            "empno": {"N": "7698"},
            "ename": {"S": "BLAKE"},
            "job": {"S": "MANAGER"},
            "mgr": {"N": "7839"},
            "hiredate": {"S": "1981-05-01"},
            "sal": {"N": "2850"},
            "comm": {"NULL": true},
            "deptno": {"N": "30"}
          }
        }
      },
      {
        "PutRequest": {
          "Item": {
            "empno": {"N": "7782"},
            "ename": {"S": "CLARK"},
            "job": {"S": "MANAGER"},
            "mgr": {"N": "7839"},
            "hiredate": {"S": "1981-06-09"},
            "sal": {"N": "2450"},
            "comm": {"NULL": true},
            "deptno": {"N": "10"}
          }
        }
      },
      {
        "PutRequest": {
          "Item": {
            "empno": {"N": "7788"},
            "ename": {"S": "SCOTT"},
            "job": {"S": "ANALYST"},
            "mgr": {"N": "7566"},
            "hiredate": {"S": "1987-04-19"},
            "sal": {"N": "3000"},
            "comm": {"NULL": true},
            "deptno": {"N": "20"}
          }
        }
      },
      {
        "PutRequest": {
          "Item": {
            "empno": {"N": "7839"},
            "ename": {"S": "KING"},
            "job": {"S": "PRESIDENT"},
            "mgr": {"NULL": true},
            "hiredate": {"S": "1981-11-17"},
            "sal": {"N": "5000"},
            "comm": {"NULL": true},
            "deptno": {"N": "10"}
          }
        }
      },
      {
        "PutRequest": {
          "Item": {
            "empno": {"N": "7844"},
            "ename": {"S": "TURNER"},
            "job": {"S": "SALESMAN"},
            "mgr": {"N": "7698"},
            "hiredate": {"S": "1981-09-08"},
            "sal": {"N": "1500"},
            "comm": {"N": "0"},
            "deptno": {"N": "30"}
          }
        }
      },
      {
        "PutRequest": {
          "Item": {
            "empno": {"N": "7876"},
            "ename": {"S": "ADAMS"},
            "job": {"S": "CLERK"},
            "mgr": {"N": "7788"},
            "hiredate": {"S": "1987-05-23"},
            "sal": {"N": "1100"},
            "comm": {"NULL": true},
            "deptno": {"N": "20"}
          }
        }
      },
      {
        "PutRequest": {
          "Item": {
            "empno": {"N": "7900"},
            "ename": {"S": "JAMES"},
            "job": {"S": "CLERK"},
            "mgr": {"N": "7698"},
            "hiredate": {"S": "1981-12-03"},
            "sal": {"N": "950"},
            "comm": {"NULL": true},
            "deptno": {"N": "30"}
          }
        }
      },
      {
        "PutRequest": {
          "Item": {
            "empno": {"N": "7902"},
            "ename": {"S": "FORD"},
            "job": {"S": "ANALYST"},
            "mgr": {"N": "7566"},
            "hiredate": {"S": "1981-12-03"},
            "sal": {"N": "3000"},
            "comm": {"NULL": true},
            "deptno": {"N": "20"}
          }
        }
      },
      {
        "PutRequest": {
          "Item": {
            "empno": {"N": "7934"},
            "ename": {"S": "MILLER"},
            "job": {"S": "CLERK"},
            "mgr": {"N": "7782"},
            "hiredate": {"S": "1982-01-23"},
            "sal": {"N": "1300"},
            "comm": {"NULL": true},
            "deptno": {"N": "10"}
          }
        }
      }
    ]
  }

 

데이터 저장 및 조회

Admin@1-28 MINGW64 /c/cloud/aws_dynamodb
$ aws dynamodb batch-write-item --request-items file://emp_item.json
{
    "UnprocessedItems": {}
}

Admin@1-28 MINGW64 /c/cloud/aws_dynamodb
$ aws dynamodb scan --table-name emp09
{
    "Items": [
        {
            "hiredate": {
                "S": "1981-02-20"
            },
            "comm": {
                "N": "300"
            },
            "mgr": {
                "N": "7698"
            },
            "ename": {
                "S": "ALLEN"
            },
            "deptno": {
                "N": "30"
            },
            "job": {
                "S": "SALESMAN"
            },
            "empno": {
                "N": "7499"
            },
            "sal": {
                "N": "1600"
            }
        },
        {
            "hiredate": {
                "S": "1981-12-03"
            },
            "comm": {
                "NULL": true
            },
            "mgr": {
                "N": "7566"
            },
            "ename": {
                "S": "FORD"
            },
            "deptno": {
                "N": "20"
            },
            "job": {
                "S": "ANALYST"
            },
            "empno": {
                "N": "7902"
            },
            "sal": {
                "N": "3000"
            }
        },
        {
            "hiredate": {
                "S": "1981-09-28"
            },
            "comm": {
                "N": "1400"
            },
            "mgr": {
                "N": "7698"
            },
            "ename": {
                "S": "MARTIN"
            },
            "deptno": {
                "N": "30"
            },
            "job": {
                "S": "SALESMAN"
            },
            "empno": {
                "N": "7654"
            },
            "sal": {
                "N": "1250"
            }
        },
        {
            "hiredate": {
                "S": "1987-04-19"
            },
            "comm": {
                "NULL": true
            },
            "mgr": {
                "N": "7566"
            },
            "ename": {
                "S": "SCOTT"
            },
            "deptno": {
                "N": "20"
            },
            "job": {
                "S": "ANALYST"
            },
            "empno": {
                "N": "7788"
            },
            "sal": {
                "N": "3000"
            }
        },
        {
            "hiredate": {
                "S": "1981-04-02"
            },
            "comm": {
                "NULL": true
            },
            "mgr": {
                "N": "7839"
            },
            "ename": {
                "S": "JONES"
            },
            "deptno": {
                "N": "20"
            },
            "job": {
                "S": "MANAGER"
            },
            "empno": {
                "N": "7566"
            },
            "sal": {
                "N": "2975"
            }
        },
        {
            "hiredate": {
                "S": "1982-01-23"
            },
            "comm": {
                "NULL": true
            },
            "mgr": {
                "N": "7782"
            },
            "ename": {
                "S": "MILLER"
            },
            "deptno": {
                "N": "10"
            },
            "job": {
                "S": "CLERK"
            },
            "empno": {
                "N": "7934"
            },
            "sal": {
                "N": "1300"
            }
        },
        {
            "hiredate": {
                "S": "1987-05-23"
            },
            "comm": {
                "NULL": true
            },
            "mgr": {
                "N": "7788"
            },
            "ename": {
                "S": "ADAMS"
            },
            "deptno": {
                "N": "20"
            },
            "job": {
                "S": "CLERK"
            },
            "empno": {
                "N": "7876"
            },
            "sal": {
                "N": "1100"
            }
        },
        {
            "hiredate": {
                "S": "1981-05-01"
            },
            "comm": {
                "NULL": true
            },
            "mgr": {
                "N": "7839"
            },
            "ename": {
                "S": "BLAKE"
            },
            "deptno": {
                "N": "30"
            },
            "job": {
                "S": "MANAGER"
            },
            "empno": {
                "N": "7698"
            },
            "sal": {
                "N": "2850"
            }
        },
        {
            "hiredate": {
                "S": "1981-06-09"
            },
            "comm": {
                "NULL": true
            },
            "mgr": {
                "N": "7839"
            },
            "ename": {
                "S": "CLARK"
            },
            "deptno": {
                "N": "10"
            },
            "job": {
                "S": "MANAGER"
            },
            "empno": {
                "N": "7782"
            },
            "sal": {
                "N": "2450"
            }
        },
        {
            "hiredate": {
                "S": "1980-12-17"
            },
            "comm": {
                "NULL": true
            },
            "mgr": {
                "N": "7902"
            },
            "ename": {
                "S": "SMITH"
            },
            "deptno": {
                "N": "20"
            },
            "job": {
                "S": "CLERK"
            },
            "empno": {
                "N": "7369"
            },
            "sal": {
                "N": "800"
            }
        },
        {
            "hiredate": {
                "S": "1981-11-17"
            },
            "comm": {
                "NULL": true
            },
            "mgr": {
                "NULL": true
            },
            "ename": {
                "S": "KING"
            },
            "deptno": {
                "N": "10"
            },
            "job": {
                "S": "PRESIDENT"
            },
            "empno": {
                "N": "7839"
            },
            "sal": {
                "N": "5000"
            }
        },
        {
            "hiredate": {
                "S": "1981-09-08"
            },
            "comm": {
                "N": "0"
            },
            "mgr": {
                "N": "7698"
            },
            "ename": {
                "S": "TURNER"
            },
            "deptno": {
                "N": "30"
            },
            "job": {
                "S": "SALESMAN"
            },
            "empno": {
                "N": "7844"
            },
            "sal": {
                "N": "1500"
            }
        },
        {
            "hiredate": {
                "S": "1981-02-22"
            },
            "comm": {
                "N": "500"
            },
            "mgr": {
                "N": "7698"
            },
            "ename": {
                "S": "WARD"
            },
            "deptno": {
                "N": "30"
            },
            "job": {
                "S": "SALESMAN"
            },
            "empno": {
                "N": "7521"
            },
            "sal": {
                "N": "1250"
            }
        },
        {
            "hiredate": {
                "S": "1981-12-03"
            },
            "comm": {
                "NULL": true
            },
            "mgr": {
                "N": "7698"
            },
            "ename": {
                "S": "JAMES"
            },
            "deptno": {
                "N": "30"
            },
            "job": {
                "S": "CLERK"
            },
            "empno": {
                "N": "7900"
            },
            "sal": {
                "N": "950"
            }
        }
    ],
    "Count": 14,
    "ScannedCount": 14,
    "ConsumedCapacity": null
}

Admin@1-28 MINGW64 /c/cloud/aws_dynamodb
$

 

배운 점

emp 스키마 구조를 모두 설정하려고 하니 값이 테이블 생성도 안 되고 값이 들어가지 않는 문제점이 발생했다.

 

Admin@1-28 MINGW64 /c/cloud/aws_dynamodb
$ aws dynamodb create-table \
--table-name emp09 \
--attribute-definitions AttributeName=empno,AttributeType=N AttributeName=hiredate,AttributeType=S \
--key-schema AttributeName=empno,KeyType=HASH AttributeName=hiredate,KeyType=RANGE \
--provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1

 

다음과 같이 필수 요소만 지정해준 결과, 정상적으로 값이 들어갔다.