AWS CLI - DynamoDB
ServerDynamoDB 테이블은 기본 키 외에 별도로 스키마가 존재하지 않는다.
테이블을 생성할 때 기본 키(고유 식별자)를 설정해야 한다.
기본 키(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