VPC 네트워크 인프라 관리
개요
DTA-WIDE 시스템은 Google Cloud Platform의 Virtual Private Cloud(VPC) 네트워크를 사용하여 안전하고 격리된 네트워크 환경을 구성합니다. 이 문서는 Terraform과 Terragrunt를 통한 VPC 네트워크 관리 방법을 설명합니다.
아키텍처
VPC 네트워크 구성
DTA-WIDE 시스템의 각 환경은 독립적인 VPC 네트워크를 사용합니다:
| 환경 | VPC 네트워크 이름 | 주요 서브넷 |
|---|---|---|
| 개발(dev) | dta-cloud-de-dev-vpc | app-subnet, db-subnet, service-subnet |
| 스테이징(stage) | dta-cloud-de-stage-vpc | app-subnet, db-subnet, service-subnet |
| 프로덕션(prod) | dta-cloud-de-prod-vpc | app-subnet, db-subnet, service-subnet, dmz-subnet |
서브넷 구성
각 환경은 서비스 유형별로 분리된 서브넷을 갖습니다:
개발 환경
- app-subnet: 10.10.0.0/20 - 애플리케이션 서버용 서브넷
- db-subnet: 10.10.16.0/20 - 데이터베이스 서버용 서브넷
- service-subnet: 10.10.32.0/20 - 서비스 인스턴스용 서브넷
스테이징 환경
- app-subnet: 10.20.0.0/20 - 애플리케이션 서버용 서브넷
- db-subnet: 10.20.16.0/20 - 데이터베이스 서버용 서브넷
- service-subnet: 10.20.32.0/20 - 서비스 인스턴스용 서브넷
프로덕션 환경
- app-subnet: 10.100.0.0/20 - 애플리케이션 서버용 서브넷
- db-subnet: 10.100.16.0/20 - 데이터베이스 서버용 서브넷
- service-subnet: 10.100.32.0/20 - 서비스 인스턴스용 서브넷
- dmz-subnet: 10.100.48.0/20 - 외부 접속을 위한 DMZ 서브넷
방화벽 관리
기본 방화벽 규칙
모든 환경에는 다음과 같은 기본 방화벽 규칙이 적용됩니다:
- 내부 통신 허용: 각 VPC 내 서브넷 간 통신 허용
- SSH 접속 제어: IAP(Identity-Aware Proxy)를 통한 SSH 접속만 허용(35.235.240.0/20)
환경별 추가 규칙
필요에 따라 환경별로 추가적인 방화벽 규칙을 구성할 수 있습니다:
- 개발 환경: 개발 편의성을 위한 추가 포트 개방
- 프로덕션 환경: 엄격한 접근 제어, 서비스 계정 기반 접근
NAT 게이트웨이
모든 환경에는 아웃바운드 인터넷 액세스를 위한 Cloud NAT 게이트웨이가 구성되어 있습니다:
create_nat_gateway = true
nat_region = "europe-west3"
이를 통해 외부 IP 없이도 인터넷 기반 서비스에 접근할 수 있습니다.
비공개 서비스 액세스 구성
각 VPC 네트워크에는 Google 관리형 서비스(Cloud SQL, Memorystore 등)를 비공개 IP로 사용하기 위한 비공개 서비스 액세스가 구성되어 있습니다. 이 구성은 다음과 같은 요소로 이루어집니다:
- 서비스 피어링 연결: VPC 네트워크와 Google 서비스 네트워크 간의 피어링
- 할당된 IP 범위: Google 관리형 서비스가 사용할 내부 IP 주소 범위 (일반적으로 /16 CIDR 블록)
- Service Networking API: 이 연결을 활성화하는 Google API
비공개 서비스 액세스를 사용하면 다음과 같은 이점이 있습니다:
- 보안 강화: 인터넷을 통해 접근할 수 없는 비공개 IP 주소 사용
- 성능 향상: Google 네트워크 내부에서 직접 통신
- 간소화된 방화벽 관리: 공용 IP 노출에 따른 방화벽 규칙 필요성 감소
중요: VPC 네트워크 생성 후 비공개 서비스 액세스를 구성하지 않으면, Cloud SQL과 같은 서비스 배포 시 SERVICE_NETWORKING_NOT_ENABLED 오류가 발생합니다.
인프라 코드 관리
Terraform 모듈 구현 필요
주의: 현재
infrastructure/terraform/modules/network디렉토리에는 필요한 Terraform 코드가 구현되어 있지 않습니다. 모듈 구현이 필요합니다.
네트워크 모듈이 다음과 같은 기능을 제공하도록 구현해야 합니다:
- VPC 네트워크 생성
- 커스텀 서브넷 구성
- 방화벽 규칙 관리
- NAT 게이트웨이 구성
- 접근 제어
권장 모듈 구조
infrastructure/
└── terraform/
└── modules/
└── network/
├── main.tf # 리소스 정의
├── variables.tf # 입력 변수
├── outputs.tf # 출력 변수
└── README.md # 사용 가이드
Terragrunt 구성
환경별 VPC 네트워크는 Terragrunt를 통해 관리됩니다:
infrastructure/
└── terragrunt/
├── dev/
│ └── network/
│ └── terragrunt.hcl # 개발 환경 구성
├── stage/
│ └── network/
│ └── terragrunt.hcl # 스테이징 환경 구성
└── prod/
└── network/
└── terragrunt.hcl # 프로덕션 환경 구성
각 환경별 Terragrunt 구성 파일은 현재 구현되어 있으며, 공통 네트워크 모듈을 참조하고 있습니다. 모듈을 구현하면 이 Terragrunt 구성을 사용하여 환경별 VPC를 배포할 수 있습니다.
환경별 구성 예시
개발 환경
개발 환경 구성 예시:
# infrastructure/terragrunt/dev/network/terragrunt.hcl
terraform {
source = "../../../terraform/modules/network"
}
include {
path = find_in_parent_folders()
}
locals {
project = "dta-cloud-de-dev"
location = "europe-west3"
}
inputs = {
project_id = local.project
network_name = "dta-cloud-de-dev-vpc"
# 서브넷 설정
subnets = [
{
name = "app-subnet"
ip_cidr_range = "10.10.0.0/20"
region = local.location
description = "애플리케이션 서버용 서브넷"
},
{
name = "db-subnet"
ip_cidr_range = "10.10.16.0/20"
region = local.location
description = "데이터베이스 서버용 서브넷"
},
{
name = "service-subnet"
ip_cidr_range = "10.10.32.0/20"
region = local.location
description = "서비스 인스턴스용 서브넷"
}
]
# SSH 액세스 허용
create_ssh_rule = true
ssh_source_ranges = ["35.235.240.0/20"] # IAP IP 범위
# NAT 게이트웨이 설정
create_nat_gateway = true
nat_region = local.location
}
프로덕션 환경
프로덕션 환경 구성 예시:
# infrastructure/terragrunt/prod/network/terragrunt.hcl
terraform {
source = "../../../terraform/modules/network"
}
include {
path = find_in_parent_folders()
}
locals {
project = "dta-cloud-de-prod"
location = "europe-west3"
}
inputs = {
project_id = local.project
network_name = "dta-cloud-de-prod-vpc"
# 프로덕션 환경에서는 좀 더 큰 CIDR 블록 사용
subnets = [
{
name = "app-subnet"
ip_cidr_range = "10.100.0.0/20"
region = local.location
description = "애플리케이션 서버용 서브넷"
},
{
name = "db-subnet"
ip_cidr_range = "10.100.16.0/20"
region = local.location
description = "데이터베이스 서버용 서브넷"
},
{
name = "service-subnet"
ip_cidr_range = "10.100.32.0/20"
region = local.location
description = "서비스 인스턴스용 서브넷"
},
{
name = "dmz-subnet"
ip_cidr_range = "10.100.48.0/20"
region = local.location
description = "외부 접속을 위한 DMZ 서브넷"
}
]
# 프로덕션 환경에서는 더 제한적인 SSH 액세스
create_ssh_rule = true
ssh_source_ranges = ["35.235.240.0/20"] # IAP IP 범위만 허용
# 고가용성 NAT 게이트웨이 설정
create_nat_gateway = true
nat_region = local.location
}
VPC 배포 방법
중요: 네트워크 모듈이 구현될 때까지 아래 배포 방법은 사용할 수 없습니다.
배포 전 준비사항
-
권한 확인: Google Cloud 계정에 다음 권한이 필요합니다:
compute.networks.*compute.subnetworks.*compute.firewalls.*compute.routers.*
-
GCP 인증 설정:
gcloud auth application-default login -
Terragrunt 설치:
brew install terragrunt -
네트워크 모듈 구현:
infrastructure/terraform/modules/network모듈을 구현해야 합니다.
환경별 배포 절차
개발 환경 배포
-
개발 환경 디렉토리로 이동:
cd infrastructure/terragrunt/dev/network -
배포 계획 확인:
terragrunt plan -
배포 실행:
terragrunt apply
스테이징/프로덕션 환경 배포
스테이징과 프로덕션 환경은 변경 관리 절차를 따라야 합니다:
-
해당 환경 디렉토리로 이동:
cd infrastructure/terragrunt/stage/network # 또는 prod/network -
계획 파일 생성:
terragrunt plan -out=network-changes.plan -
계획 파일 검토 및 승인 프로세스 진행
-
승인 후 배포 실행:
terragrunt apply network-changes.plan
전체 환경 일괄 배포
모든 환경을 한번에 배포해야 할 경우:
-
Terragrunt 루트 디렉토리로 이동:
cd infrastructure/terragrunt -
모든 네트워크 계획 확인:
terragrunt run-all plan --terragrunt-include-dir "*/network" -
모든 네트워크 배포 실행:
terragrunt run-all apply --terragrunt-include-dir "*/network"
배포 삭제
필요한 경우 VPC 네트워크와 관련 리소스 삭제:
terragrunt destroy
주의: 프로덕션 환경의 리소스 삭제는 변경 관리 절차를 통해 승인된 후에만 실행하세요.
배포 검증
배포 후 다음 항목을 확인하여 VPC 네트워크가 정상적으로 생성되었는지 검증합니다:
-
GCP 콘솔에서 VPC 네트워크 확인:
- 네트워크 및 서브넷 생성 여부
- IP 대역 할당 확인
- 방화벽 규칙 적용 확인
-
CLI로 네트워크 확인:
gcloud compute networks list --filter="name=dta-cloud-de-*"
gcloud compute networks describe dta-cloud-de-dev-vpc
gcloud compute firewall-rules list --filter="network=dta-cloud-de-dev-vpc" -
연결성 테스트:
- 테스트 VM 인스턴스를 생성하여 서브넷 간 통신 테스트
- NAT 게이트웨이를 통한 외부 연결 테스트
운영 관리
연결 서비스
VPC 네트워크는 다음과 같은 Google Cloud 서비스와 연동됩니다:
- Cloud SQL: 비공개 IP를 통한 데이터베이스 연결
- Cloud Run: VPC 커넥터를 통한 비공개 네트워크 접근
- Compute Engine: 애플리케이션 서버 인스턴스
모니터링 및 로깅
흐름 로그
네트워크 트래픽 모니터링 및 분석을 위해 VPC 흐름 로그가 구성되어 있습니다:
log_config = [
{
aggregation_interval = "INTERVAL_5_SEC"
flow_sampling = 0.5
metadata = "INCLUDE_ALL_METADATA"
}
]
모니터링 지표
다음과 같은 네트워크 관련 지표가 모니터링됩니다:
- 방화벽 규칙 히트 수
- NAT 게이트웨이 사용량
- 서브넷 간 트래픽 패턴
- 외부 접속 시도
보안 관행
- 모든 인스턴스는 기본적으로 비공개 IP 사용
- IAP를 통한 SSH 접속만 허용
- 서브넷 단위로 접근 제어 구성
- 필요한 포트만 개방하는 방화벽 정책
재해 복구
VPC 페어링
필요한 경우 멀티 리전 배포를 위한 VPC 페어링을 구성할 수 있습니다:
module "vpc_peering" {
source = "terraform-google-modules/network/google//modules/network-peering"
prefix = "dta"
local_network = module.vpc.network_self_link
peer_network = "projects/peer-project/global/networks/peer-network"
}
다중 리전 서브넷
중요 워크로드의 경우 다중 리전 서브넷 구성을 고려합니다:
subnets = [
{
name = "multi-region-subnet"
ip_cidr_range = "10.100.64.0/20"
region = "europe-west1" # 보조 리전
}
]
비공개 서비스 액세스 구성
Cloud SQL이나 Memorystore와 같은 Google 관리형 서비스는 VPC 내부에서 비공개 IP 주소로 접근하기 위해 Service Networking API 및 비공개 서비스 액세스 구성이 필요합니다. 이 섹션에서는 비공개 서비스 액세스 설정 방법을 설명합니다.
사전 요구 사항
VPC 네트워크 생성 후 Cloud SQL과 같은 비공개 IP 기반 서비스를 배포하기 전에 반드시 다음 단계를 완료해야 합니다:
1. Service Networking API 활성화
# 개발 환경
gcloud services enable servicenetworking.googleapis.com --project=dta-cloud-de-dev
# 스테이징 환경
gcloud services enable servicenetworking.googleapis.com --project=dta-cloud-de-stage
# 프로덕션 환경
gcloud services enable servicenetworking.googleapis.com --project=dta-cloud-de-prod
2. 비공개 서비스 할당 IP 범위 생성
# 개발 환경
gcloud compute addresses create google-managed-services-dta-cloud-de-dev-vpc \
--global \
--purpose=VPC_PEERING \
--prefix-length=16 \
--network=dta-cloud-de-dev-vpc \
--project=dta-cloud-de-dev
# 스테이징 환경
gcloud compute addresses create google-managed-services-dta-cloud-de-stage-vpc \
--global \
--purpose=VPC_PEERING \
--prefix-length=16 \
--network=dta-cloud-de-stage-vpc \
--project=dta-cloud-de-stage
# 프로덕션 환경
gcloud compute addresses create google-managed-services-dta-cloud-de-prod-vpc \
--global \
--purpose=VPC_PEERING \
--prefix-length=16 \
--network=dta-cloud-de-prod-vpc \
--project=dta-cloud-de-prod
3. VPC 피어링 연결 설정
# 개발 환경
gcloud services vpc-peerings connect \
--service=servicenetworking.googleapis.com \
--ranges=google-managed-services-dta-cloud-de-dev-vpc \
--network=dta-cloud-de-dev-vpc \
--project=dta-cloud-de-dev
# 스테이징 환경
gcloud services vpc-peerings connect \
--service=servicenetworking.googleapis.com \
--ranges=google-managed-services-dta-cloud-de-stage-vpc \
--network=dta-cloud-de-stage-vpc \
--project=dta-cloud-de-stage
# 프로덕션 환경
gcloud services vpc-peerings connect \
--service=servicenetworking.googleapis.com \
--ranges=google-managed-services-dta-cloud-de-prod-vpc \
--network=dta-cloud-de-prod-vpc \
--project=dta-cloud-de-prod
주의사항
- 비공개 서비스 액세스 구성은 VPC 네트워크 생성 직후, Cloud SQL이나 다른 비공개 서비스를 배포하기 전에 완료해야 합니다.
- 프로젝트당 최대 10개의 할당 범위만 생성할 수 있으므로 적절한 크기의 IP 범위를 할당하세요.
- 할당된 IP 주소 범위는 서브넷 IP 범위와 겹치지 않아야 합니다.
- 이 설정은 Service Networking API를 통해 Google 관리 서비스에만 적용됩니다.
Terraform으로 비공개 서비스 액세스 구성
Terragrunt/Terraform으로 VPC 네트워크를 배포할 때 비공개 서비스 액세스를 포함하려면 network 모듈에 다음 구성을 추가할 수 있습니다:
# 네트워크 모듈 확장 예시
resource "google_compute_global_address" "private_service_access" {
name = "google-managed-services-${var.network_name}"
purpose = "VPC_PEERING"
address_type = "INTERNAL"
prefix_length = 16
network = google_compute_network.vpc_network.id
project = var.project_id
}
resource "google_service_networking_connection" "private_service_access" {
network = google_compute_network.vpc_network.id
service = "servicenetworking.googleapis.com"
reserved_peering_ranges = [google_compute_global_address.private_service_access.name]
}
다음 단계
- 네트워크 모듈 구현:
infrastructure/terraform/modules/network모듈을 구현해야 합니다 - 모듈 테스트: 개발 환경에서 모듈 기능 테스트
- 환경별 배포: 모든 환경에 네트워크 배포
참고 자료
TBD