hgk0404
hgk0404.tistory
hgk0404

공지사항

전체 방문자
오늘
어제
  • 전체 카테고리
    • [컴퓨터비전]
    • [Computer Science]
      • [컴퓨터네트워크]
      • [알고리즘]
      • [자료구조 in C]
      • [C & C++]
      • [이산수학]
      • [Math]
    • [머신러닝]
      • [Numpy, Pandas]
    • [Cloud]
      • [AWS]
      • [NCP]
      • [Kubernetes]
      • [Terraform]
    • [Dev]
      • [가상환경]
      • [Linux]
      • [Docker]
    • [Python]
    • [Coding Test]
      • [백준]
      • [프로그래머스]
      • [SQL]
    • [WEB]
    • [자격증, 일상]
    • [엑셀]
    • [금융]

인기 글

최근 글

최근 댓글

250x250
hELLO · Designed By 정상우.
hgk0404

hgk0404.tistory

[Cloud]/[Terraform]

[Terraform] 테라폼으로 AWS DynamoDB 생성, 업로드(GSI)

2024. 8. 8. 13:32
728x90

 

 

1. dynamodb 생성

 

resource "aws_dynamodb_table" "cars" {
  name = "cars"
  hash_key = "VIN"
  billing_mode = "PAY_PER_REQUEST"
  attribute {
    name = "VIN"
    type = "S"
  }
}

 

 

dynamoDB 생성하는 리소스는 위와 같이 생겼습니다. 

 

 

리소스 유형은 "aws_dynamodb_table"이 되고, 리소스 이름은 "cars"입니다. name은 실제로 dynamoDB의 이름이고 hash_key는 기본키(primary key)로서 반드시 있어야 합니다.

 

 

그리고 hash_key는 속성(attribute)값이 반드시 있어야 합니다. 여기서는 name = "VIN"으로 하고 type = "S"인데 String(문자열)이라는 뜻입니다.(type = "N"인 경우 정수(number)라는 뜻입니다)

 

 

billing_mode는 PAY_PER_REQUEST인데 요청 당 청구로 지정했습니다.

 

 

2. dynamodb에 업로드(GSI: global secondary index)

 

 

dynamodb에 업로드하는 리소스는 다음과 같습니다.

 

resource "aws_dynamodb_table" "project_sapphire_inventory" {
  name           = "inventory"
  billing_mode   = "PAY_PER_REQUEST"
  hash_key       = "AssetID"

  attribute {
    name = "AssetID"
    type = "N"
  }
  attribute {
    name = "AssetName"
    type = "S"
  }
  attribute {
    name = "age"
    type = "N"
  }
  attribute {
    name = "Hardware"
    type = "B"
  }
  global_secondary_index {
    name             = "AssetName"
    hash_key         = "AssetName"
    projection_type  = "ALL"
  }
  global_secondary_index {
    name             = "age"
    hash_key         = "age"
    projection_type  = "ALL"
  }
  global_secondary_index {
    name             = "Hardware"
    hash_key         = "Hardware"
    projection_type  = "ALL"
  }
}

resource "aws_dynamodb_table_item" "upload" {
  table_name = aws_dynamodb_table.project_sapphire_inventory.name
  hash_key   = aws_dynamodb_table.project_sapphire_inventory.hash_key
  item = <<EOF
 {
  "AssetID": {"N": "1"},
  "AssetName": {"S": "printer"},
  "age": {"N": "5"},
  "Hardware": {"B": "true" }
}
EOF
}

 

 

GSI(global secondary index)는 테이블의 기본 키와는 다른 키를 사용하여 데이터에 빠르게 접근할 수 있게 해주는 추가적인 데이터 구조입니다. 

 

 

Hash key인 AssetID를 제외한 나머지 3개(AssetName, age, Hardware)가 "aws_dynamodb_table"에서 속성이 정의 되어 있는 이유는 글로벌 보조 인덱스의 키로 존재하기 때문입니다.

 

 

단순하게 속성으로 추가해서 "aws_dynamodb_table_item"을 이용해 업로드를 하는 방법도 물론 가능합니다. 하지만 제한사항이 있습니다. 

 

dynamoDB에서 기본적으로 가장 효율적인 쿼리는 해시 키(AssetID)를 사용한 쿼리가 됩니다. GSI 없이 다른 속성으로 쿼리하려면, AssetID로만 효율적인 검색이 가능해지기 때문에 전체 테이블 스캔이 필요할 수 있어 상당히 비효율적이게 됩니다. 

 

 

GSI를 사용하면 해시키(AssetID)를 제외한 다른 속성(AssetName, age, Hardware)으로도 직접적으로 검색이 가능해 매우 효율적이게 됩니다.

 

 

728x90
저작자표시 동일조건 (새창열림)

'[Cloud] > [Terraform]' 카테고리의 다른 글

[Terraform] 프로비저너와 사용자 데이터  (0) 2024.08.09
[Terraform] S3에서 상태 파일 업로드, 상태 파일 관리 명령어  (0) 2024.08.09
[Terraform] 테라폼 라이프 사이클(create_before_destroy, prevent_destroy)  (1) 2024.08.06
[Terraform] 리소스 참조(암묵적 참조, 명시적 참조)  (0) 2024.08.05
[Terraform] 테라폼 변수 타입 종류  (0) 2024.08.05
'[Cloud]/[Terraform]' 카테고리의 다른 글
  • [Terraform] 프로비저너와 사용자 데이터
  • [Terraform] S3에서 상태 파일 업로드, 상태 파일 관리 명령어
  • [Terraform] 테라폼 라이프 사이클(create_before_destroy, prevent_destroy)
  • [Terraform] 리소스 참조(암묵적 참조, 명시적 참조)
hgk0404
hgk0404
공부기록

티스토리툴바