본문으로 건너뛰기

VPC 네트워크 인프라 관리

개요

DTA-WIDE 시스템은 Google Cloud Platform의 Virtual Private Cloud(VPC) 네트워크를 사용하여 안전하고 격리된 네트워크 환경을 구성합니다. 이 문서는 Terraform과 Terragrunt를 통한 VPC 네트워크 관리 방법을 설명합니다.

아키텍처

VPC 네트워크 구성

DTA-WIDE 시스템의 각 환경은 독립적인 VPC 네트워크를 사용합니다:

환경VPC 네트워크 이름주요 서브넷
개발(dev)dta-cloud-de-dev-vpcapp-subnet, db-subnet, service-subnet
스테이징(stage)dta-cloud-de-stage-vpcapp-subnet, db-subnet, service-subnet
프로덕션(prod)dta-cloud-de-prod-vpcapp-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 서브넷

방화벽 관리

기본 방화벽 규칙

모든 환경에는 다음과 같은 기본 방화벽 규칙이 적용됩니다:

  1. 내부 통신 허용: 각 VPC 내 서브넷 간 통신 허용
  2. 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 배포 방법

중요: 네트워크 모듈이 구현될 때까지 아래 배포 방법은 사용할 수 없습니다.

배포 전 준비사항

  1. 권한 확인: Google Cloud 계정에 다음 권한이 필요합니다:

    • compute.networks.*
    • compute.subnetworks.*
    • compute.firewalls.*
    • compute.routers.*
  2. GCP 인증 설정:

    gcloud auth application-default login
  3. Terragrunt 설치:

    brew install terragrunt
  4. 네트워크 모듈 구현: infrastructure/terraform/modules/network 모듈을 구현해야 합니다.

환경별 배포 절차

개발 환경 배포

  1. 개발 환경 디렉토리로 이동:

    cd infrastructure/terragrunt/dev/network
  2. 배포 계획 확인:

    terragrunt plan
  3. 배포 실행:

    terragrunt apply

스테이징/프로덕션 환경 배포

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

  1. 해당 환경 디렉토리로 이동:

    cd infrastructure/terragrunt/stage/network  # 또는 prod/network
  2. 계획 파일 생성:

    terragrunt plan -out=network-changes.plan
  3. 계획 파일 검토 및 승인 프로세스 진행

  4. 승인 후 배포 실행:

    terragrunt apply network-changes.plan

전체 환경 일괄 배포

모든 환경을 한번에 배포해야 할 경우:

  1. Terragrunt 루트 디렉토리로 이동:

    cd infrastructure/terragrunt
  2. 모든 네트워크 계획 확인:

    terragrunt run-all plan --terragrunt-include-dir "*/network"
  3. 모든 네트워크 배포 실행:

    terragrunt run-all apply --terragrunt-include-dir "*/network"

배포 삭제

필요한 경우 VPC 네트워크와 관련 리소스 삭제:

terragrunt destroy

주의: 프로덕션 환경의 리소스 삭제는 변경 관리 절차를 통해 승인된 후에만 실행하세요.

배포 검증

배포 후 다음 항목을 확인하여 VPC 네트워크가 정상적으로 생성되었는지 검증합니다:

  1. GCP 콘솔에서 VPC 네트워크 확인:

    • 네트워크 및 서브넷 생성 여부
    • IP 대역 할당 확인
    • 방화벽 규칙 적용 확인
  2. 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"
  3. 연결성 테스트:

    • 테스트 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]
}

다음 단계

  1. 네트워크 모듈 구현: infrastructure/terraform/modules/network 모듈을 구현해야 합니다
  2. 모듈 테스트: 개발 환경에서 모듈 기능 테스트
  3. 환경별 배포: 모든 환경에 네트워크 배포

참고 자료

TBD