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)으로도 직접적으로 검색이 가능해 매우 효율적이게 됩니다.
'[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 |