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 |