Terraform으로 NCP 구축하기(2) - VPC, Subnet, Server 띄우기

2025. 5. 8. 17:36·Infra

1. VPC, Subnet 구성

VPC, Subnet 관련 모듈을 따로 network_module로 관리하기 때문에, 폴더 안에 porvider 정보를 작성해준다.

#network_module/providers.tf

terraform {
    required_providers {
        ncloud = {
            source  = "NaverCloudPlatform/ncloud"
            version = ">= 3.3.1"
        }
    }
}

생성할 VPC에 대한 내용을 작성한다.

# network_module/vpc.tf

resource "ncloud_vpc" "this" {
    name            = "${var.name_prefix}-vpc"
    ipv4_cidr_block = var.vpc_cidr
}

생성한 VPC내에 Subnet 구성에 대한 내용을 작성한다.

여기서 주목해야할 건 subnet에 대역을 할당해주는 부분인데, 기존 vpc의 대역을 10.0.0.0/16으로 구성했기 때문에, 해당 범위 내에서 만들어준다. 

# network_module/subnet.tf

resource "ncloud_subnet" "public" {
    name            = "${var.name_prefix}-public"
    vpc_no          = ncloud_vpc.this.vpc_no
    subnet          = cidrsubnet(ncloud_vpc.this.ipv4_cidr_block, 8, 0) # "10.0.0.0/24"
    zone            = var.zone
    network_acl_no  = ncloud_vpc.this.default_network_acl_no
    subnet_type     = "PUBLIC"
}

추후 다른 모듈로 넘겨줘야할 정보는 outputs.tf에 담아준다.

# network_module/outputs.tf

output "vpc_no" {
    description = "생성된 VPC 번호"
    value       = ncloud_vpc.this.vpc_no
}
output "subnet_public_id" {
    description = "생성된 퍼블랫 서브넷 ID"
    value       = ncloud_subnet.public.id
}

해당 모듈 내에서 사용할 변수들을 선언해준다.

# network_module/variables.tf

variable "name_prefix" {
    description = "리소스 접두사"
}
variable "vpc_cidr" {
    description = "VPC CIDR 블록"
    default     = "10.0.0.0/16"
}
variable "zone" {
    description = "Public Subnet 가용 영역"
    default     = "KR-2"
}

 

2. SERVER 구성

network_module과 동일하게 SERVER 관련 모듈을 따로 server_module로 관리하기 때문에, 폴더 안에 porvider 정보를 작성해준다.

#server_module/providers.tf

terraform {
    required_providers {
        ncloud = {
            source  = "NaverCloudPlatform/ncloud"
            version = ">= 3.3.1"
        }
    }
}

생성할 SERVER에 대한 내용을 작성한다.

# server_module/server.tf

# 1) SSH 키 생성 및 파일 저장
resource "ncloud_login_key" "bastion_key" {
    key_name = "${var.name_prefix}-bastion-key"
}
resource "local_file" "pem" {
    filename = "${ncloud_login_key.bastion_key.key_name}.pem"
    content  = ncloud_login_key.bastion_key.private_key
}

# 2) ACG(Security Group) 설정
resource "ncloud_access_control_group" "bastion_acg" {
    name        = "${var.name_prefix}-acg"
    description = "Bastion 서버용 ACG"
    vpc_no      = var.vpc_no
}
resource "ncloud_access_control_group_rule" "ssh" {
    access_control_group_no = ncloud_access_control_group.bastion_acg.id
    inbound {
        protocol   = "TCP"
        ip_block   = "0.0.0.0/0"
        port_range = "22"
    }
    outbound {
      protocol = "TCP"
      ip_block = "0.0.0.0/0"
      port_range = "1-65535"
    }
}

resource "ncloud_access_control_group_rule" "http" {
  access_control_group_no = ncloud_access_control_group.bastion_acg.id
  inbound {
    protocol   = "TCP"
    ip_block   = "0.0.0.0/0"
    port_range = "80"
  }

  outbound {
    protocol   = "TCP"
    ip_block   = "0.0.0.0/0"
    port_range = "1-65535"
  }
}

# 3) Network Interface
resource "ncloud_network_interface" "bastion_nic" {
    name                  = "${var.name_prefix}-nic"
    subnet_no             = var.subnet_public_id
    access_control_groups = [ncloud_access_control_group.bastion_acg.id]
}

# 4) Server 생성
data "ncloud_server_image" "ubuntu" {
    filter {
        name   = "product_name"
        values = ["ubuntu-20.04"]   # Ubuntu 20.04 LTS 선택 :contentReference[oaicite:2]{index=2}
    }
}
data "ncloud_server_product" "spec" {
    server_image_product_code = data.ncloud_server_image.ubuntu.id

    filter {
        name   = "product_code"
        values = ["SSD"]
        regex = true
    }
    filter {
        name   = "cpu_count"
        values = ["2"]
    }
    filter {
        name   = "memory_size"
        values = ["4GB"]
    }
    filter {
        name   = "product_type"
        values = ["HICPU"]
    }
}

resource "ncloud_server" "bastion" {
    name                     = "${var.name_prefix}-bastion"
    subnet_no                = var.subnet_public_id
    server_image_product_code = data.ncloud_server_image.ubuntu.id
    server_product_code      = data.ncloud_server_product.spec.id
    login_key_name           = ncloud_login_key.bastion_key.key_name

    network_interface {
        network_interface_no = ncloud_network_interface.bastion_nic.id
        order                = 0
    }
}

# 5) Public IP 할당
resource "ncloud_public_ip" "bastion_ip" {
    server_instance_no = ncloud_server.bastion.id
    description        = "Bastion Public IP"
}

# 6) 루트 패스워드 추출
data "ncloud_root_password" "root_pw" {
    server_instance_no = ncloud_server.bastion.instance_no
    private_key        = ncloud_login_key.bastion_key.private_key
}
resource "local_file" "root_pw" {
    filename = "${ncloud_server.bastion.name}-root_password.txt"
    content  = data.ncloud_root_password.root_pw.root_password
}

서버모듈에서 사용할 변수를 정의해준다

# server_module/variables.tf

variable "name_prefix" {
    description = "리소스 접두사 (Resource name prefix)"
}

variable "vpc_no" {
    description = "상위 모듈에서 전달받는 VPC 번호 (VPC ID)"
}

variable "subnet_public_id" {
    description = "상위 모듈에서 전달받는 Public Subnet ID"
}

3. 최종 구성 형태

저작자표시 비영리 동일조건 (새창열림)

'Infra' 카테고리의 다른 글

Terraform으로 NCP 구축하기(4) - Object Storage 구성하기  (0) 2025.05.08
Terraform으로 NCP 구축하기(3) - terraform apply  (0) 2025.05.08
NCP SSL 인증서 발급 및 DNS 인증  (0) 2025.05.01
도커 네트워크 - 도커네트워크 생성 및 추가  (0) 2025.05.01
Terraform으로 NCP 구축하기(1) - Provider 및 모듈 설정  (0) 2025.04.27
'Infra' 카테고리의 다른 글
  • Terraform으로 NCP 구축하기(4) - Object Storage 구성하기
  • Terraform으로 NCP 구축하기(3) - terraform apply
  • NCP SSL 인증서 발급 및 DNS 인증
  • 도커 네트워크 - 도커네트워크 생성 및 추가
SungHoJung
SungHoJung
  • SungHoJung
    HOLOUD
    SungHoJung
  • 전체
    오늘
    어제
    • 분류 전체보기 (43)
      • AlgoMate (13)
      • TroubleShooting (0)
      • 여러가지 모음집 (5)
      • Infra (18)
  • 링크

    • github
  • 인기 글

  • 태그

    결제 다이어그램
    AWS
    TossPayments
    크롤링
    Celery
    컨테이너 간 통신
    스왑 메모리 설정
    로컬 서버와 통신
    EC2
    redis
    docker-compose
    bypass recaptcha
    ECS
    celery+redis
    Kubernetes
    IAM
    토스페이먼츠 연동
    host.docker.internal
    ci-cd
    k8s
  • hELLO· Designed By정상우.v4.10.3
SungHoJung
Terraform으로 NCP 구축하기(2) - VPC, Subnet, Server 띄우기
상단으로

티스토리툴바