공부, 기록

[AWS] Aurora, ElastiCache 타입 변경 스크립트 본문

공부/DATABASE

[AWS] Aurora, ElastiCache 타입 변경 스크립트

무는빼주세요 2024. 11. 21. 13:59
#!/bin/bash

# Writer와 Reader 정보를 저장할 전역 배열
declare -a writer_instances
declare -a reader_instances

# 모든 클러스터 정보 요약 출력
summarize_clusters_info() {
    local clusters=("${@}")

    # Writer와 Reader 배열 초기화
    writer_instances=()
    reader_instances=()

    for cluster in "${clusters[@]}"; do
        # 클러스터 내 모든 인스턴스 정보 가져오기
        local instances
        instances=$(aws rds describe-db-clusters \
            --db-cluster-identifier "$cluster" \
            --query "DBClusters[0].DBClusterMembers[]" \
            --output json)

        # JSON 결과 디버깅
        if [[ -z "$instances" || "$instances" == "null" ]]; then
            echo "❌ 클러스터 $cluster에서 인스턴스 정보를 가져오지 못했습니다. AWS CLI 설정 또는 클러스터 이름을 확인하세요."
            continue
        fi

      

        # Writer 인스턴스 분리 저장
        readarray -t writers < <(echo "$instances" | jq -r '.[] | select(.IsClusterWriter == true) | .DBInstanceIdentifier')
        writer_instances+=("${writers[@]}")  # 배열 추가

        # Reader 인스턴스 분리 저장
        readarray -t readers < <(echo "$instances" | jq -r '.[] | select(.IsClusterWriter == false) | .DBInstanceIdentifier')
        reader_instances+=("${readers[@]}")  # 배열 추가
    done

    echo "📋 모든 클러스터 요약 정보:"
    echo "---------------------------------------------------------------"
    echo "| Cluster Name       | Instance Name       | Role   | Type     |"
    echo "---------------------------------------------------------------"
      for cluster in "${clusters[@]}"; do
        # 클러스터 내 모든 인스턴스 정보 가져오기
        local instances
        instances=$(aws rds describe-db-clusters \
            --db-cluster-identifier "$cluster" \
            --query "DBClusters[0].DBClusterMembers[]" \
            --output json)

        # JSON 결과 디버깅
        if [[ -z "$instances" || "$instances" == "null" ]]; then
            echo "❌ 클러스터 $cluster에서 최종 인스턴스 정보를 가져오지 못했습니다."
            continue
        fi

        # 각 인스턴스 정보 가져오기
        echo "$instances" | jq -r --arg cluster_name "$cluster" \
            '.[] | "\($cluster_name),\(.DBInstanceIdentifier),\(.IsClusterWriter)"' |
        while IFS=',' read -r cluster_name instance_name is_writer; do
            # 각 인스턴스의 DBInstanceClass 가져오기
            local db_instance_class
            db_instance_class=$(aws rds describe-db-instances \
                --db-instance-identifier "$instance_name" \
                --query "DBInstances[0].DBInstanceClass" \
                --output text)

            # Role 계산
            local role
            if [[ "$is_writer" == "true" ]]; then
                role="Writer"
            else
                role="Reader"
            fi

            # 출력
            printf "| %-18s | %-18s | %-6s | %-8s |\n" "$cluster_name" "$instance_name" "$role" "${db_instance_class:-N/A}"
        done
    done
     echo "---------------------------------------------------------------" 
}


# 상태 추적 함수 (30초 대기 후 시작)
track_update_status() {
    local cluster="$1"
    local instance="$2"
    local role="$3"

    echo "📡 클러스터 $cluster: $role 인스턴스 $instance 상태 추적을 30초 뒤에 시작합니다..."
    sleep 30  # 첫 추적 전 대기

    while true; do
        local status
        status=$(aws rds describe-db-instances \
            --db-instance-identifier "$instance" \
            --query "DBInstances[0].DBInstanceStatus" \
            --output text)

        if [[ "$status" == "available" ]]; then
            echo "✅ 클러스터 $cluster: $role 인스턴스 $instance 상태 업데이트 완료"
            break
        else
            echo "⏳ 클러스터 $cluster: $role 인스턴스 $instance 상태: $status"
            sleep 30
        fi
    done
}

# Reader 인스턴스 타입 변경 요청
change_reader_instance_type() {
    local instance="$1"

    echo "🔄 Reader 인스턴스 $instance의 유형 변경 요청 중..."
    aws rds modify-db-instance \
        --db-instance-identifier "$instance" \
        --db-instance-class "$instance_type" \
        --apply-immediately > /dev/null 2>&1

    if [[ $? -eq 0 ]]; then
        echo "✅ Reader 인스턴스 $instance의 유형 변경 요청 성공"
    else
        echo "❌ Reader 인스턴스 $instance의 유형 변경 요청 실패"
    fi
}

# Writer 인스턴스 타입 변경 요청
change_writer_instance_type() {
    local instance="$1"

    echo "🔄 Writer 인스턴스 $instance의 유형 변경 요청 중..."
    aws rds modify-db-instance \
        --db-instance-identifier "$instance" \
        --db-instance-class "$instance_type" \
        --apply-immediately > /dev/null 2>&1

    if [[ $? -eq 0 ]]; then
        echo "✅ Writer 인스턴스 $instance의 유형 변경 요청 성공"
    else
        echo "❌ Writer 인스턴스 $instance의 유형 변경 요청 실패"
    fi
}

# Reader 작업
process_readers() {
    echo "🚀 Reader 인스턴스 변경 요청 시작..."
    for reader in "${reader_instances[@]}"; do
        change_reader_instance_type "$reader" &
    done
    wait
    echo "✅ 모든 Reader 인스턴스 변경 요청 완료."

    # Reader 상태 추적
    for reader in "${reader_instances[@]}"; do
        track_update_status "" "$reader" "Reader" &
    done
    wait
    echo "✅ 모든 Reader 인스턴스 상태 추적 완료."
}

# Writer 작업
process_writers() {
    echo "🚀 Writer 인스턴스 변경 요청 시작..."
    for writer in "${writer_instances[@]}"; do
        change_writer_instance_type "$writer" &
    done
    wait
    echo "✅ 모든 Writer 인스턴스 변경 요청 완료."

    # Writer 상태 추적
    for writer in "${writer_instances[@]}"; do
        track_update_status "" "$writer" "Writer" &
    done
    wait
    echo "✅ 모든 Writer 인스턴스 상태 추적 완료."
}

# 최종 요약 정보 출력
print_final_summary() {
    local clusters=("${@}")
    echo "📋 작업 완료 후 모든 클러스터 최종 요약 정보:"
    echo "---------------------------------------------------------------"
    echo "| Cluster Name       | Instance Name       | Role   | Type     |"
    echo "---------------------------------------------------------------"

    for cluster in "${clusters[@]}"; do
        # 클러스터 내 모든 인스턴스 정보 가져오기
        local instances
        instances=$(aws rds describe-db-clusters \
            --db-cluster-identifier "$cluster" \
            --query "DBClusters[0].DBClusterMembers[]" \
            --output json)

        # JSON 결과 디버깅
        if [[ -z "$instances" || "$instances" == "null" ]]; then
            echo "❌ 클러스터 $cluster에서 최종 인스턴스 정보를 가져오지 못했습니다."
            continue
        fi

        # 각 인스턴스 정보 가져오기
        echo "$instances" | jq -r --arg cluster_name "$cluster" \
            '.[] | "\($cluster_name),\(.DBInstanceIdentifier),\(.IsClusterWriter)"' |
        while IFS=',' read -r cluster_name instance_name is_writer; do
            # 각 인스턴스의 DBInstanceClass 가져오기
            local db_instance_class
            db_instance_class=$(aws rds describe-db-instances \
                --db-instance-identifier "$instance_name" \
                --query "DBInstances[0].DBInstanceClass" \
                --output text)

            # Role 계산
            local role
            if [[ "$is_writer" == "true" ]]; then
                role="Writer"
            else
                role="Reader"
            fi

            # 출력
            printf "| %-18s | %-18s | %-6s | %-8s |\n" "$cluster_name" "$instance_name" "$role" "${db_instance_class:-N/A}"
        done
    done

    echo "---------------------------------------------------------------"
}

# 클러스터 처리
process_clusters() {
    if [[ "$operation_order" == "writer-first" ]]; then
        echo "🛠 Writer -> Reader 작업 순서로 진행합니다."
        process_writers
        read -p "Writer 작업이 완료되었습니다. Reader 작업을 시작할까요? (yes/no): " proceed_readers
        [[ "$proceed_readers" == "yes" ]] && process_readers
    else
        echo "🛠 Reader -> Writer 작업 순서로 진행합니다."
        process_readers
        read -p "Reader 작업이 완료되었습니다. Writer 작업을 시작할까요? (yes/no): " proceed_writers
        [[ "$proceed_writers" == "yes" ]] && process_writers
    fi
	# 최종 요약 정보 출력
    print_final_summary "${cluster_names[@]}"

}

# 메인 스크립트
echo "💡 Aurora/DocumentDB 인스턴스 유형 변경 스크립트"
read -p "작업할 클러스터 이름을 콤마(,)로 구분하여 입력하세요: " input_clusters
read -p "변경할 인스턴스 타입을 입력하세요 (예: db.t3.medium): " instance_type
read -p "작업 순서를 선택하세요 (reader-first / writer-first): " operation_order

# 입력값 처리
IFS=',' read -ra cluster_names <<< "$input_clusters"

# 클러스터 정보 요약 및 확인
summarize_clusters_info "${cluster_names[@]}"
read -p "위 정보를 확인하셨습니까? 작업을 진행하시겠습니까? (yes/no): " proceed
if [[ "$proceed" == "yes" ]]; then
    process_clusters
    echo "🚀 작업 완료. 감사합니다."
else
    echo "🚫 작업이 취소되었습니다. 감사합니다."
    exit 0
fi

 

스크립트 실행.
## 작업 내용 입력 ##

💡 Aurora/DocumentDB 인스턴스 유형 변경 스크립트
작업할 클러스터 이름을 콤마(,)로 구분하여 입력하세요: minjae-test-01,minjae-test-02
변경할 인스턴스 타입을 입력하세요 (예: db.t3.medium): db.t4g.large
작업 순서를 선택하세요 (reader-first / writer-first): writer-first

## 엔터 ##

📋 모든 클러스터 요약 정보:
---------------------------------------------------------------
| Cluster Name       | Instance Name       | Role   | Type     |
---------------------------------------------------------------
   minjae-test-01    minjae-test-01-primary      Writer    null
   minjae-test-01    minjae-test-01-replica01    Reader    null
   minjae-test-02    minjae-test-02-replica01    Writer    null
   minjae-test-02    minjae-test-02-primary      Reader    null
---------------------------------------------------------------

##요약 정보 출력 및 진행 여부 확인 ##
위 정보를 확인하셨습니까? 작업을 진행하시겠습니까? (yes/no): 

## yes 입력시## 

🛠 Writer -> Reader 작업 순서로 진행합니다.
🚀 Writer 인스턴스 변경 요청 시작...
🔄 Writer 인스턴스 minjae-test-02-replica01의 유형 변경 요청 중...
🔄 Writer 인스턴스 minjae-test-01-primary의 유형 변경 요청 중...
✅ Writer 인스턴스 minjae-test-01-primary의 유형 변경 요청 성공
✅ Writer 인스턴스 minjae-test-02-replica01의 유형 변경 요청 성공
✅ 모든 Writer 인스턴스 변경 요청 완료.

## 30초 단위로 인스턴스의 상태 체크 available 상태면 종료 ##

📡 클러스터 : Writer 인스턴스 minjae-test-02-replica01 상태 추적을 30초 뒤에 시작합니다...  
📡 클러스터 : Writer 인스턴스 minjae-test-01-primary 상태 추적을 30초 뒤에 시작합니다...
⏳ 클러스터 : Writer 인스턴스 minjae-test-01-primary 상태: modifying
⏳ 클러스터 : Writer 인스턴스 minjae-test-02-replica01 상태: modifying
## ... (생략) ##
⏳ 클러스터 : Writer 인스턴스 minjae-test-01-primary 상태: configuring-enhanced-monitoring
⏳ 클러스터 : Writer 인스턴스 minjae-test-02-replica01 상태: configuring-enhanced-monitoring
⏳ 클러스터 : Writer 인스턴스 minjae-test-01-primary 상태: modifying
⏳ 클러스터 : Writer 인스턴스 minjae-test-02-replica01 상태: modifying
⏳ 클러스터 : Writer 인스턴스 minjae-test-01-primary 상태: modifying
⏳ 클러스터 : Writer 인스턴스 minjae-test-02-replica01 상태: modifying
✅ 클러스터 : Writer 인스턴스 minjae-test-01-primary 상태 업데이트 완료
✅ 클러스터 : Writer 인스턴스 minjae-test-02-replica01 상태 업데이트 완료
✅ 모든 Writer 인스턴스 상태 추적 완료.

## 모두 진행이 완료가 되면 Reader 변경에 대하여 확인 진행 ##

Writer 작업이 완료되었습니다. Reader 작업을 시작할까요? (yes/no):

## yes 입력할 경우 writer와 동일한 프로세스로 진행 ##
🚀 Reader 인스턴스 변경 요청 시작...
🔄 Reader 인스턴스 minjae-test-02-primary의 유형 변경 요청 중...
🔄 Reader 인스턴스 minjae-test-01-replica01의 유형 변경 요청 중...
✅ Reader 인스턴스 minjae-test-01-replica01의 유형 변경 요청 성공
✅ Reader 인스턴스 minjae-test-02-primary의 유형 변경 요청 성공
✅ 모든 Reader 인스턴스 변경 요청 완료.
📡 클러스터 : Reader 인스턴스 minjae-test-02-primary 상태 추적을 30초 뒤에 시작합니다...
📡 클러스터 : Reader 인스턴스 minjae-test-01-replica01 상태 추적을 30초 뒤에 시작합니다...
⏳ 클러스터 : Reader 인스턴스 minjae-test-02-primary 상태: modifying
⏳ 클러스터 : Reader 인스턴스 minjae-test-01-replica01 상태: modifying
⏳ 클러스터 : Reader 인스턴스 minjae-test-01-replica01 상태: modifying
⏳ 클러스터 : Reader 인스턴스 minjae-test-02-primary 상태: modifying
## ... (생략) ##
⏳ 클러스터 : Reader 인스턴스 minjae-test-02-primary 상태: configuring-enhanced-monitoring
✅ 클러스터 : Reader 인스턴스 minjae-test-01-replica01 상태 업데이트 완료
⏳ 클러스터 : Reader 인스턴스 minjae-test-02-primary 상태: configuring-enhanced-monitoring
⏳ 클러스터 : Reader 인스턴스 minjae-test-02-primary 상태: modifying
⏳ 클러스터 : Reader 인스턴스 minjae-test-02-primary 상태: modifying
✅ 클러스터 : Reader 인스턴스 minjae-test-02-primary 상태 업데이트 완료
✅ 모든 Reader 인스턴스 상태 추적 완료.
📋 작업 완료 후 모든 클러스터 최종 요약 정보:
---------------------------------------------------------------
| Cluster Name       | Instance Name       | Role   | Type     |
---------------------------------------------------------------
   minjae-test-01    minjae-test-01-primary      Writer    null
   minjae-test-01    minjae-test-01-replica01    Reader    null
   minjae-test-02    minjae-test-02-replica01    Writer    null
   minjae-test-02    minjae-test-02-primary      Reader    null
---------------------------------------------------------------
🚀 작업 완료. 감사합니다.

 
 

#!/bin/bash
 
# ElastiCache 클러스터의 노드 타입 변경
change_cache_node_type() {
    local cluster="$1"
 
    # 클러스터 모드 활성화 여부 확인
    local cluster_mode
    cluster_mode=$(aws elasticache describe-replication-groups \
        --replication-group-id "$cluster" \
        --query "ReplicationGroups[0].ClusterEnabled" \
        --output text)
 
    if [[ "$cluster_mode" == "True" ]]; then
        echo "🔄 클러스터 모드 활성화 상태: $cluster"
        echo "🔄 전체 클러스터의 노드 타입을 변경합니다."
 
        # 전체 클러스터의 노드 타입 변경
        aws elasticache modify-replication-group \
            --replication-group-id "$cluster" \
            --cache-node-type "$node_type" \
            --apply-immediately > /dev/null 2>&1
 
        if [[ $? -eq 0 ]]; then
            echo "✅ 클러스터 $cluster: 노드 타입 변경 요청 성공"
        else
            echo "❌ 클러스터 $cluster: 노드 타입 변경 요청 실패"
        fi
    else
        echo "🔄 클러스터 모드 비활성화 상태: $cluster"
        echo "🔄 전체 클러스터의 노드 타입을 변경합니다."
 
        # 클러스터의 노드 타입 변경
        aws elasticache modify-replication-group \
            --replication-group-id "$cluster" \
            --cache-node-type "$node_type" \
            --apply-immediately > /dev/null 2>&1
 
        if [[ $? -eq 0 ]]; then
            echo "✅ 클러스터 $cluster: 노드 타입 변경 요청 성공"
        else
            echo "❌ 클러스터 $cluster: 노드 타입 변경 요청 실패"
        fi
    fi
}
 
# ElastiCache 클러스터 상태 추적
track_cache_cluster_update() {
    local cluster="$1"
    echo "📡 ElastiCache 클러스터 $cluster 상태 추적 중..."
    sleep 30
    while true; do
        local shard_status
        local node_statuses
        local all_available=true
 
        # 샤드 상태 확인
        shard_status=$(aws elasticache describe-replication-groups \
            --replication-group-id "$cluster" \
            --query "ReplicationGroups[0].Status" \
            --output text)
 
        # 노드 상태 확인
        node_statuses=$(aws elasticache describe-replication-groups \
            --replication-group-id "$cluster" \
            --query "ReplicationGroups[0].NodeGroups[].NodeGroupMembers[].CacheClusterId" \
            --output text)
 
        echo "🔍 클러스터 $cluster: 현재 샤드 상태: $shard_status"
 
        # 각 노드의 상태 출력
        for node in $node_statuses; do
            local node_status
            node_status=$(aws elasticache describe-cache-clusters \
                --cache-cluster-id "$node" \
                --query "CacheClusters[0].CacheClusterStatus" \
                --output text)
 
            echo "   노드 $node 상태: $node_status"
 
            if [[ "$node_status" != "available" ]]; then
                all_available=false
            fi
        done
 
        # 모든 상태가 available인지 확인
        if [[ "$shard_status" == "available" && "$all_available" == true ]]; then
            echo "✅ ElastiCache 클러스터 $cluster: 모든 노드 및 샤드 상태 'available'"
            break
        else
            echo "⏳ ElastiCache 클러스터 $cluster 상태: 샤드 ($shard_status), 노드 확인 중..."
            sleep 30
        fi
    done
}
 
# ElastiCache 클러스터 최종 정보 출력
print_final_status() {
    local cluster="$1"
    echo "📋 ElastiCache 클러스터 $cluster 최종 상태 확인 중..."
 
    # 클러스터 정보 가져오기
    local cluster_info
    cluster_info=$(aws elasticache describe-cache-clusters \
        --show-cache-node-info \
        --query "CacheClusters[?ReplicationGroupId=='$cluster']" \
        --output json)
 
    if [[ -z "$cluster_info" ]]; then
        echo "❌ 클러스터 $cluster: 정보를 가져오지 못했습니다."
        return
    fi
 
    echo "---------------------------------------------------------------"
    echo "| Cluster Name       | Node Name          | Node Type         | Status      |"
    echo "---------------------------------------------------------------"
 
    echo "$cluster_info" | jq -r --arg cluster_name "$cluster" \
        '.[] | .CacheClusterId as $cluster_id | .CacheNodeType as $node_type | .CacheNodes[] |
        "| \($cluster_name) | \($cluster_id) | \($node_type) | \(.CacheNodeStatus // "N/A") |"' \
        | column -t -s '|'
 
    echo "---------------------------------------------------------------"
}
 
 
# ElastiCache 작업 처리
process_elasticache_clusters() {
    local clusters=("${@}")
    echo "🚀 ElastiCache 작업 시작..."
 
    # 클러스터 병렬 작업
    for cluster in "${clusters[@]}"; do
        (
            change_cache_node_type "$cluster"
            track_cache_cluster_update "$cluster"
        ) &
    done
 
    wait
    echo "✅ 모든 ElastiCache 클러스터 작업 완료."
 
    # 최종 상태 출력
    for cluster in "${clusters[@]}"; do
        print_final_status "$cluster"
    done
}
 
# 메인 스크립트
echo "💡 ElastiCache 노드 타입 변경 스크립트"
read -p "작업할 ElastiCache 클러스터 이름을 콤마(,)로 구분하여 입력하세요: " input_clusters
read -p "변경할 노드 타입을 입력하세요 (예: cache.t3.medium): " node_type
 
# 입력값 처리
IFS=',' read -ra cluster_names <<< "$input_clusters"
 
process_elasticache_clusters "${cluster_names[@]}"
 
echo "🚀 작업 완료. 감사합니다."

 

## 작업 내용 입력 ##
## 클러스터 모드, 비클러스터 모드 모두 작업 가능##

💡 ElastiCache 노드 타입 변경 스크립트
작업할 ElastiCache 클러스터 이름을 콤마(,)로 구분하여 입력하세요: minjae-ela-test-02,minjae-ela-test-03
변경할 노드 타입을 입력하세요 (예: cache.t3.medium): cache.t4g.medium

## 엔터 ##

🚀 ElastiCache 작업 시작...
🔄 클러스터 모드 비활성화 상태: minjae-ela-test-03
🔄 전체 클러스터의 노드 타입을 변경합니다.
🔄 클러스터 모드 활성화 상태: minjae-ela-test-02
🔄 전체 클러스터의 노드 타입을 변경합니다.

## 변경 요청 이후 30초 단위로 클러스터, 노드의 상태 체크 ## 

✅ 클러스터 minjae-ela-test-03: 노드 타입 변경 요청 성공
📡 ElastiCache 클러스터 minjae-ela-test-03 상태 추적 중...
✅ 클러스터 minjae-ela-test-02: 노드 타입 변경 요청 성공
📡 ElastiCache 클러스터 minjae-ela-test-02 상태 추적 중...
🔍 클러스터 minjae-ela-test-03: 현재 샤드 상태: modifying
🔍 클러스터 minjae-ela-test-02: 현재 샤드 상태: modifying
   노드 minjae-ela-test-03-001 상태: modifying
   노드 minjae-ela-test-02-0001-001 상태: modifying
   노드 minjae-ela-test-03-002 상태: modifying
⏳ ElastiCache 클러스터 minjae-ela-test-03 상태: 샤드 (modifying), 노드 확인 중...
   노드 minjae-ela-test-02-0001-002 상태: modifying
   노드 minjae-ela-test-02-0002-001 상태: modifying
   노드 minjae-ela-test-02-0002-002 상태: modifying
⏳ ElastiCache 클러스터 minjae-ela-test-02 상태: 샤드 (modifying), 노드 확인 중...
🔍 클러스터 minjae-ela-test-03: 현재 샤드 상태: modifying
   노드 minjae-ela-test-03-001 상태: modifying
   노드 minjae-ela-test-03-002 상태: modifying

## 모든 노드, 클러스터의 상태가 available 일 경우 종료 및 결과 출력##
✅ ElastiCache 클러스터 minjae-ela-test-02: 모든 노드 및 샤드 상태 'available'
✅ 모든 ElastiCache 클러스터 작업 완료.
📋 ElastiCache 클러스터 minjae-ela-test-02 최종 상태 확인 중...
---------------------------------------------------------------
| Cluster Name       | Node Name          | Node Type         | Status      |
---------------------------------------------------------------
   minjae-ela-test-02    minjae-ela-test-02-0001-001    cache.t4g.small    available
   minjae-ela-test-02    minjae-ela-test-02-0001-002    cache.t4g.small    available
   minjae-ela-test-02    minjae-ela-test-02-0002-001    cache.t4g.small    available
   minjae-ela-test-02    minjae-ela-test-02-0002-002    cache.t4g.small    available
---------------------------------------------------------------
📋 ElastiCache 클러스터 minjae-ela-test-03 최종 상태 확인 중...
---------------------------------------------------------------
| Cluster Name       | Node Name          | Node Type         | Status      |
---------------------------------------------------------------
   minjae-ela-test-03    minjae-ela-test-03-001    cache.t4g.small    available
   minjae-ela-test-03    minjae-ela-test-03-002    cache.t4g.small    available
---------------------------------------------------------------
🚀 작업 완료. 감사합니다.

'공부 > DATABASE' 카테고리의 다른 글

[Aurora] Commit 지연 지표  (0) 2024.12.06
[MySQL] MySQL group by 개선  (0) 2024.11.28
SQL Server와 MySQL만 하다가 PostgreSQL을 공부하니..  (0) 2024.10.15
Valkey의 멀티스레드 아키텍처  (0) 2024.10.12
[AWS] DynamoDB  (0) 2024.09.15