memorystore
Cloud Memorystore
개요
Cloud Memorystore는 GCP에서 제공하는 완전 관리형 Redis 서비스입니다. DTA-WIDE 시스템에서는 다음과 같은 용도로 사용됩니다:
- 세션 데이터 저장소
- API 응답 캐싱
- 실시간 데이터 처리
- 분산 락 관리
초기 설정
Memorystore 서비스를 사용하기 위한 초기 설정 단계입니다:
-
인스턴스 생성
- 인스턴스 이름 및 크기 설정
- 리전/영역 구성
- 네트워크 설정 (VPC 및 IP 주소 범위)
-
네트워크 연결
- VPC 네트워크 피어링 설정
- 비공개 서비스 액세스 구성
- 방화벽 규칙 설정
-
보안 구성
- IAM 역할 및 권한 설정
- 인증 메커니즘 구성
- 데이터 암호화 설정
-
모니터링 설정
- 알림 임계값 구성
- 로깅 활성화
- 대시보드 설정
구성
- 인스턴스 유형: Standard Tier
- 메모리 크기: 5GB
- Redis 버전: 7.0
- 가용성 구성: Regional (다중 영역)
- 네트워크: VPC 내부 통신
보안 설정
- VPC 서비스 제어 적용
- IAM 기반 접근 제어
- 암호화된 통신 (TLS)
- 자동 백업 활성화
모니터링
- Cloud Monitoring 통합
- 메모리 사용량 알림 설정
- 연결 상태 모니터링
- 성능 메트릭 수집
운영 가이드
TBD
모범 사례
-
캐시 전략
- Cache-Aside 패턴 사용
- TTL 설정 가이드라인
- 캐시 무효화 전략
-
성능 최적화
- 키 네이밍 컨벤션
- 데이터 구조 선택 가이드
- 메모리 관리 전략
-
장애 대응
- Fallback 메커니즘
- 자동 복구 설정
- 알림 구성
Terraform을 통한 인프라 관리
구현 요소
Memorystore를 Terraform으로 관리하기 위해 다음 요소를 구현했습니다:
- Terraform 모듈: 재사용 가능한 Memorystore 구성
- Terragrunt 구성: 환경별 설정값 관리
- 배포 파이프라인: 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 인스턴스를 배포하려면 다음 단계를 따릅니다:
사전 요구 사항
- VPC 네트워크가 구성되어 있어야 합니다.
- 비공개 서비스 액세스가 구성되어 있어야 합니다.
- Terraform 및 Terragrunt가 설치되어 있어야 합니다.
- 적절한 GCP 권한이 필요합니다.
- 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
운영 및 유지보수
스케일링
메모리 크기 조정이 필요한 경우:
- Terragrunt 구성 파일에서
memory_size_gb값을 변경 - 계획 확인 및 적용
참고: 메모리 크기는 증가만 가능하고 감소는 불가능합니다.
백업 및 복구
수동 백업 생성:
gcloud redis instances backup [INSTANCE_ID] --project=[PROJECT_ID] --region=[REGION]
백업에서 복원:
gcloud redis instances import [INSTANCE_ID] --source-redis-config-file=backup.rdb
문제 해결
일반적인 오류와 해결 방법
-
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 -
네트워크 관련 오류
오류 메시지:
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 -
권한 오류
오류 메시지:
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 -
인스턴스 이름 중복 오류
오류 메시지:
Error: Error creating Instance: googleapi: Error 409: The Redis instance already exists.해결 방법:
- 인스턴스 이름을 변경하거나
- 기존 인스턴스를 삭제합니다:
gcloud redis instances delete INSTANCE_NAME --region=REGION --project=PROJECT_ID -
유지보수 기간 형식 오류
오류 메시지:
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.0 | 2025-03-25 | bok@weltcorp.com | 최초 작성 |