본문으로 건너뛰기

memorystore

Cloud Memorystore​

개요​

Cloud Memorystore는 GCP에서 제공하는 완전 관리형 Redis 서비스입니다. DTA-WIDE 시스템에서는 다음과 같은 용도로 사용됩니다:

  • 세션 데이터 저장소
  • API 응답 캐싱
  • 실시간 데이터 처리
  • 분산 락 관리

초기 설정​

Memorystore 서비스를 사용하기 위한 초기 설정 단계입니다:

  1. 인스턴스 생성

    • 인스턴스 이름 및 크기 설정
    • 리전/영역 구성
    • 네트워크 설정 (VPC 및 IP 주소 범위)
  2. 네트워크 연결

    • VPC 네트워크 피어링 설정
    • 비공개 서비스 액세스 구성
    • 방화벽 규칙 설정
  3. 보안 구성

    • IAM 역할 및 권한 설정
    • 인증 메커니즘 구성
    • 데이터 암호화 설정
  4. 모니터링 설정

    • 알림 임계값 구성
    • 로깅 활성화
    • 대시보드 설정

구성​

  • 인스턴스 유형: Standard Tier
  • 메모리 크기: 5GB
  • Redis 버전: 7.0
  • 가용성 구성: Regional (다중 영역)
  • 네트워크: VPC 내부 통신

보안 설정​

  • VPC 서비스 제어 적용
  • IAM 기반 접근 제어
  • 암호화된 통신 (TLS)
  • 자동 백업 활성화

모니터링​

  • Cloud Monitoring 통합
  • 메모리 사용량 알림 설정
  • 연결 상태 모니터링
  • 성능 메트릭 수집

운영 가이드​

TBD

모범 사례​

  1. 캐시 전략

    • Cache-Aside 패턴 사용
    • TTL 설정 가이드라인
    • 캐시 무효화 전략
  2. 성능 최적화

    • 키 네이밍 컨벤션
    • 데이터 구조 선택 가이드
    • 메모리 관리 전략
  3. 장애 대응

    • Fallback 메커니즘
    • 자동 복구 설정
    • 알림 구성

Terraform을 통한 인프라 관리​

구현 요소​

Memorystore를 Terraform으로 관리하기 위해 다음 요소를 구현했습니다:

  1. Terraform 모듈: 재사용 가능한 Memorystore 구성
  2. Terragrunt 구성: 환경별 설정값 관리
  3. 배포 파이프라인: CI/CD와 통합

Terraform 모듈 구조​

Memorystore 모듈은 다음과 같은 구조로 구현되어 있습니다:

infrastructure/
└── terraform/
└── modules/
└── memorystore/
├── main.tf # 리소스 정의
├── variables.tf # 입력 변수
├── outputs.tf # 출력 변수
└── README.md # 사용 가이드

주요 기능​

  • 고가용성 지원: tier 변수를 STANDARD_HA로 설정하여 여러 가용 영역에 걸쳐 고가용성 구성 활성화
  • 성능 튜닝: redis_configs 변수를 통해 Redis 구성 옵션 조정 (maxmemory-policy, timeout, activedefrag 등)
  • 네트워크 보안: VPC 네트워크 통합, 필요시 암호화 활성화
  • 유지보수 관리: 유지보수 기간 설정을 통해 서비스 중단 최소화
  • 삭제 방지: 프로덕션 환경에서 prevent_destroy = true 설정으로 실수로 인한 삭제 방지

중요: Terraform의 lifecycle.prevent_destroy 속성은 변수 참조를 지원하지 않기 때문에, 환경별 설정을 위해 조건부 리소스 생성 패턴을 사용합니다. 개발/스테이징 환경용 리소스(cache_dev)와 프로덕션 환경용 리소스(cache_prod)를 따로 정의하고, prevent_destroy 변수에 따라 적절한 리소스가 생성됩니다.

참고: 유지보수 기간 요일 설정은 숫자가 아닌 문자열 상수("MONDAY", "TUESDAY" 등)를 사용해야 합니다. Google Redis API는 요일을 문자열로 지정하도록 요구합니다.

환경별 Terragrunt 구성​

개발, 스테이징, 프로덕션 환경별로 다음과 같이 Terragrunt 구성 파일이 작성되어 있습니다:

infrastructure/
└── terragrunt/
├── dev/
│ └── memorystore/
│ └── terragrunt.hcl # 개발 환경 구성
├── stage/
│ └── memorystore/
│ └── terragrunt.hcl # 스테이징 환경 구성
└── prod/
└── memorystore/
└── terragrunt.hcl # 프로덕션 환경 구성

환경별 주요 설정​

  • 개발 환경: 기본 구성, 5GB 메모리, 화요일(TUESDAY) 유지보수
  • 스테이징 환경: 10GB 메모리, 수요일(WEDNESDAY) 유지보수
  • 프로덕션 환경: 고성능 구성, 20GB 메모리, 월요일(MONDAY) 유지보수, 암호화 활성화, 삭제 방지 기능 활성화

배포 방법​

Memorystore 인스턴스를 배포하려면 다음 단계를 따릅니다:

사전 요구 사항​

  1. VPC 네트워크가 구성되어 있어야 합니다.
  2. 비공개 서비스 액세스가 구성되어 있어야 합니다.
  3. Terraform 및 Terragrunt가 설치되어 있어야 합니다.
  4. 적절한 GCP 권한이 필요합니다.
  5. Memorystore for Redis API가 활성화되어 있어야 합니다:
    # 각 환경별로 API 활성화
    gcloud services enable redis.googleapis.com --project=dta-cloud-de-dev
    gcloud services enable redis.googleapis.com --project=dta-cloud-de-stage
    gcloud services enable redis.googleapis.com --project=dta-cloud-de-prod

배포 단계​

개발 환경 배포:

cd infrastructure/terragrunt/dev/memorystore
terragrunt init
terragrunt plan
terragrunt apply

프로덕션 환경은 변경 관리 절차를 따라야 합니다:

cd infrastructure/terragrunt/prod/memorystore
terragrunt init
terragrunt plan -out=redis-plan.tfplan
# 계획 검토 및 승인 후
terragrunt apply redis-plan.tfplan

운영 및 유지보수​

스케일링​

메모리 크기 조정이 필요한 경우:

  1. Terragrunt 구성 파일에서 memory_size_gb 값을 변경
  2. 계획 확인 및 적용

참고: 메모리 크기는 증가만 가능하고 감소는 불가능합니다.

백업 및 복구​

수동 백업 생성:

gcloud redis instances backup [INSTANCE_ID] --project=[PROJECT_ID] --region=[REGION]

백업에서 복원:

gcloud redis instances import [INSTANCE_ID] --source-redis-config-file=backup.rdb

문제 해결​

일반적인 오류와 해결 방법​

  1. API 활성화 오류

    오류 메시지:

    Error: Error creating Instance: googleapi: Error 403: Google Cloud Memorystore for Redis API has not been used in project dta-cloud-de-dev before or it is disabled.

    해결 방법: 프로젝트에서 Redis API를 활성화합니다:

    gcloud services enable redis.googleapis.com --project=PROJECT_ID
  2. 네트워크 관련 오류

    오류 메시지:

    Error: Error creating Instance: googleapi: Error 400: The network does not have private service networking configured.

    해결 방법: VPC 네트워크에 비공개 서비스 액세스를 구성합니다:

    # 할당 범위 생성
    gcloud compute addresses create google-managed-services-NETWORK_NAME \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=16 \
    --network=NETWORK_NAME \
    --project=PROJECT_ID

    # 서비스 피어링 연결 설정
    gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=google-managed-services-NETWORK_NAME \
    --network=NETWORK_NAME \
    --project=PROJECT_ID
  3. 권한 오류

    오류 메시지:

    Error: Error creating Instance: googleapi: Error 403: Required 'compute.networks.get' permission for NETWORK_NAME.

    해결 방법: Terraform을 실행하는 서비스 계정에 필요한 권한을 부여합니다:

    # Memorystore 관리자 역할 부여
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=serviceAccount:SERVICE_ACCOUNT_EMAIL \
    --role=roles/redis.admin

    # 컴퓨팅 네트워크 사용자 역할 부여
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=serviceAccount:SERVICE_ACCOUNT_EMAIL \
    --role=roles/compute.networkUser
  4. 인스턴스 이름 중복 오류

    오류 메시지:

    Error: Error creating Instance: googleapi: Error 409: The Redis instance already exists.

    해결 방법:

    • 인스턴스 이름을 변경하거나
    • 기존 인스턴스를 삭제합니다:
    gcloud redis instances delete INSTANCE_NAME --region=REGION --project=PROJECT_ID
  5. 유지보수 기간 형식 오류

    오류 메시지:

    Error: expected maintenance_policy.0.weekly_maintenance_window.0.day to be one of ["DAY_OF_WEEK_UNSPECIFIED" "MONDAY" "TUESDAY"...

    해결 방법: 유지보수 기간 요일에 문자열 상수를 사용합니다:

    maintenance_window_day = "MONDAY"  # "1"이 아님

변경 이력​

버전날짜작성자변경 내용
0.1.02025-03-25bok@weltcorp.com최초 작성