AWS CLI - DynamoDB

Server

Language :

DynamoDB 테이블은 기본 키 외에 별도로 스키마가 존재하지 않는다.

테이블을 생성할 때 기본 키(고유 식별자)를 설정해야 한다.

기본 키(Primary Key)는 두 가지 존재한다. (링크)

  • 단순 기본키: 테이블에 파티션 키(HASH)만 있는 경우
  • 해시 함수 출력에 따라 항목을 저장할 물리적 파티션이 결정된다.
  • 복합 기본키: 테이블에 파티션 키(HASH)와 정렬 키(RANGE)가 있는 경우
  • 파티션 키가 동일한 모든 항목은 정렬 키를 기준으로 정렬된다.
  • 여러 항목이 동일한 파티션 키를 가질 수 있지만 동일한 파티션 내에서 정렬 키는 중복될 수 없다.

보조 인덱스

  • 테이블마다 여러 보조 인덱스를 생성할 수 있다.
  • 인덱스 생성 시 파티션 키를 반드시 정의해야 한다.
  • 저장 공간을 별도로 사용하여 데이터를 저장하기 때문에 추가적인 데이터 용량이 필요하다.
  • 생성 방식
  • Global Secondary Index(GSI): 기본 테이블과 다른 파티션 키와 정렬 키를 사용할 경우
  • Local Secondary Index(LSI): 기본 테이블의 파티션 키는 동일하지만 정렬 키가 다른 경우. 별도의 저장공간을 생성하지 않기때문에 추가되는 쓰기용량, 읽기 용량이 없음. 테이블을 생성할 때에만 설정가능하며 생성 이후에는 추가, 삭제할 수 없음.

이 글에서는  AWS CLI(Amazon Command Line Interface)를 통해 DynamoDB를 다루는 방법을 기록합니다.

AWS CLI Install

shell

✗ curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
✗ sudo installer -pkg AWSCLIV2.pkg -target /
✗ which aws
/usr/local/bin/aws
✗ rm AWSCLIV2.pkg
✗ aws --version
aws-cli/2.11.3 Python/3.11.2 Darwin/21.6.0 exe/x86_64 prompt/off

테이블 목록 조회

text

 aws dynamodb list-tables

shell

# aws dynamodb list-tables --endpoint-url http://localhost:4566
{
    "TableNames": []
}

endpoint-url을 설정할 경우 http, https와 Port 번호를 포함해서 작성해야 한다.

테이블 생성

text

aws dynamodb create-table \
--table-name {TableName} \
--attribute-definitions AttributeName={TableKeyAttributeName},AttributeType={S/N/B} \
--key-schema AttributeName={TableKeyAttributeName},KeyType={HASH/RANG}

attribute-definitions: 기본 키 속성을 정의한다.

  • AttributeName: 속성명
  • AttributeType: 속성 타입 (S:String, N:Number, B:Binary)

key-schema: 기본 키 역할을 정의한다.

  • AttributeName: 역할 지정할 속성명
  • KeyType: 속성역할
  • HASH: Partition key
  • RANGE: Sort Key

예제

shell

# aws dynamodb create-table \
--endpoint-url http://localhost:4566 \
--table-name myTable \
--attribute-definitions \
 AttributeName=id,AttributeType=N \
 AttributeName=createdAt,AttributeType=S \
--key-schema \
 AttributeName=id,KeyType=HASH \
 AttributeName=createdAt,KeyType=RANGE \
--provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5

json 파일을 사용할 경우

shell

# aws dynamodb create-table \
--endpoint-url http://localhost:4566 \
--cli-input-json file://create_table.json

json

{
  "TableName": "myTable",
  "AttributeDefinitions": [
    {
      "AttributeName": "id",
      "AttributeType": "S"
    }
  ],
  "KeySchema": [
    {
      "AttributeName": "id",
      "KeyType": "HASH"
    }
  ],
  "ProvisionedThroughput": {
    "ReadCapacityUnits": 10,
    "WriteCapacityUnits": 5
  }
}

테이블 삭제

text

aws dynamodb delete-table --table-name {TableName}

shell

# aws dynamodb delete-table \
--endpoint-url http://localhost:4566 \
--table-name myTable

테이블 활성 여부 확인

text

aws dynamodb describe-table --table-name {TableName} | grep TableStatus

shell

# aws dynamodb describe-table \
--endpoint-url http://localhost:4566 \
--table-name myTable | grep TableStatus

item 등록/갱신

text

aws dynamodb put-item --table-name {TableName} --item '{"{AttributeName}":{"{AttributeType}":"{Value}"}}'

shell

# aws dynamodb put-item \
--endpoint-url http://localhost:4566 \
--table-name myTable \
--item \
 '{"id":{"N":"1"},"createdAt":{"S":"2023-03-23 10:23:12"},"sessionKey":{"S":"A12314EHDF"}}'

json 파일을 사용할 경우

shell

# aws dynamodb put-item \
--endpoint-url http://phdkim-dynamodb:8301 \
--table-name myTable \
--item file://myTable_put_item.json

json

{
    "id":{"N":"1"},
    "createdAt":{"S":"2023-03-23 10:23:12"},
    "sessionKey":{"S":"A12314EHDF"}
}

item 삭제

text

aws dynamodb delete-item --table-name {TableName} --key '{PrimaryKey}'

shell

# aws dynamodb delete-item \
--endpoint-url http://localhost:4566 \
--table-name myTable \
--key '{"id":{"N":"1"},"createdAt":{"S":"2023-03-23 10:23:12"}}'

item 조회

복합 기본키라면 파티션 키와 정렬 키를 같이 지정해서 조회한다.

기본적으로 모든 항목 속성을 반환한다.

일치  조회

text

aws dynamodb get-item --table-name {TableName} --key '{PrimaryKey}'

shell

# aws dynamodb get-item \
--endpoint-url http://localhost:4566 \
--table-name myTable \
--key '{"id":{"N":"1"},"createdAt":{"S":"2023-03-23 10:23:12"}}'

일부 항목 속성만 조회할 경우에는 프로젝션 표현식을 사용한다.

shell

# aws dynamodb get-item \
--table-name myTable \
--key file://myTable_search_key.json \
--projection-expression "Description, RelatedItems"

전체 조회

text

aws dynamodb scan --table-name {TableName}

shell

# aws dynamodb scan \
--endpoint-url http://localhost:4566 \
--table-name myTable

조건 조회

사용 가능한 조건 함수는 여기에서 확인하기

text

aws dynamodb query --table-name {TableName}

shell

# aws dynamodb query \
--endpoint-url http://localhost:4566 \
--table-name myTable \
--key-condition-expression "id = :i" \
--expression-attribute-values '{":i":{"N":"1"}}'
  • key-condition-expression: 기본 키 조건을 설정한다.
  • expression-attribute-values: 조건 표현식에서 속성값을 대체할 값을 설정한다.

shell

# aws dynamodb query \
--endpoint-url http://localhost:4566 \
--table-name myTable \
--key-condition-expression "id = :i" \
--filter-expression "#u >= :num" \
--expression-attribute-names '{"#u":"user_id"}' \
--expression-attribute-values '{":i":{"N":"1"},":num":{"S":"2"}}'
  • filter-expression: 기본키 외 조건 설정
  • expression-attribute-names: 조건 표현식에서 속성명을 대체할 값을 설정한다.

shell

# aws dynamodb query \
--endpoint-url http://localhost:4566 \
--table-name myTable \
--key-condition-expression 'id = :a AND createdAt BETWEEN :t1 AND :t2' \
--expression-attribute-values '{
    ":a": {"N": "1"}, 
    ":t1": {"S": "2023-04-07 01:03:12"}, 
    ":t2": {"S": "2023-04-07 10:03:12"}
}'

Reference

공식 문서

민갤

Back-End Developer

백엔드 개발자입니다.