1 # 테라폼 설치 sudo yum install -y yum-utils shadow-utils sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo sudo yum -y install terraform terraform version 2 #!/bin/bash # 네이버 표준 네트워크 Terraform 파일 일괄 생성 스크립트 WORKDIR=${1:-./6} mkdir -p "$WORKDIR" cd "$WORKDIR" || exit 1 ############################################ # main.tf ############################################ cat > main.tf <<'EOF' provider "ncloud" { support_vpc = true region = "KR" access_key = var.access_key secret_key = var.secret_key } resource "ncloud_login_key" "key_vpc" { key_name = var.name_vpc } resource "ncloud_vpc" "vpc_vpc" { name = var.name_vpc ipv4_cidr_block = "10.0.0.0/20" } resource "ncloud_subnet" "subnet_pri1" { name = var.name_pri1 vpc_no = ncloud_vpc.vpc_vpc.id subnet = cidrsubnet(ncloud_vpc.vpc_vpc.ipv4_cidr_block, 3, 0) zone = "KR-1" network_acl_no = ncloud_vpc.vpc_vpc.default_network_acl_no subnet_type = "PRIVATE" // PUBLIC(Public) | PRIVATE(Private) } resource "ncloud_subnet" "subnet_pub1" { name = var.name_pub1 vpc_no = ncloud_vpc.vpc_vpc.id subnet = cidrsubnet(ncloud_vpc.vpc_vpc.ipv4_cidr_block, 4, 2) zone = "KR-1" network_acl_no = ncloud_vpc.vpc_vpc.default_network_acl_no subnet_type = "PUBLIC" // PUBLIC(Public) | PRIVATE(Private) } resource "ncloud_subnet" "subnet_pri-db1" { name = var.name_pri-db1 vpc_no = ncloud_vpc.vpc_vpc.id subnet = cidrsubnet(ncloud_vpc.vpc_vpc.ipv4_cidr_block, 4, 3) zone = "KR-1" network_acl_no = ncloud_vpc.vpc_vpc.default_network_acl_no subnet_type = "PRIVATE" // PUBLIC(Public) | PRIVATE(Private) } resource "ncloud_subnet" "subnet_pub-nat1" { name = var.name_pub-nat1 vpc_no = ncloud_vpc.vpc_vpc.id subnet = cidrsubnet(ncloud_vpc.vpc_vpc.ipv4_cidr_block, 4, 4) zone = "KR-1" network_acl_no = ncloud_vpc.vpc_vpc.default_network_acl_no subnet_type = "PUBLIC" usage_type = "NATGW" // PUBLIC(Public) | PRIVATE(Private) } resource "ncloud_subnet" "subnet_pub-lb1" { name = var.name_pub-lb1 vpc_no = ncloud_vpc.vpc_vpc.id subnet = cidrsubnet(ncloud_vpc.vpc_vpc.ipv4_cidr_block, 4, 5) zone = "KR-1" network_acl_no = ncloud_vpc.vpc_vpc.default_network_acl_no subnet_type = "PUBLIC" usage_type = "LOADB" // PUBLIC(Public) | PRIVATE(Private) } resource "ncloud_subnet" "subnet_pri-lb1" { name = var.name_pri-lb1 vpc_no = ncloud_vpc.vpc_vpc.id subnet = cidrsubnet(ncloud_vpc.vpc_vpc.ipv4_cidr_block, 4, 6) zone = "KR-1" network_acl_no = ncloud_vpc.vpc_vpc.default_network_acl_no subnet_type = "PRIVATE" usage_type = "LOADB" // PUBLIC(Public) | PRIVATE(Private) } EOF ############################################ # nat.tf ############################################ cat > nat.tf <<'EOF' resource "ncloud_route_table" "route_table_pri1" { name = var.name_pri1 vpc_no = ncloud_vpc.vpc_vpc.id supported_subnet_type = "PRIVATE" } resource "ncloud_route_table_association" "subnet_pri-db1" { route_table_no = ncloud_route_table.route_table_pri1.id subnet_no = ncloud_subnet.subnet_pri-db1.id } # NAT Gateway resource "ncloud_nat_gateway" "nat_gateway_scn_02" { vpc_no = ncloud_vpc.vpc_vpc.id subnet_no = ncloud_subnet.subnet_pub-nat1.id zone = "KR-1" name = var.name_pub-nat1 } # Route Table resource "ncloud_route" "route_scn_02_nat" { route_table_no = ncloud_vpc.vpc_vpc.default_private_route_table_no #route_table_no = ncloud_route_table.route_table_pri1.id destination_cidr_block = "0.0.0.0/0" target_type = "NATGW" target_name = ncloud_nat_gateway.nat_gateway_scn_02.name target_no = ncloud_nat_gateway.nat_gateway_scn_02.id } EOF ############################################ # variables.tf ############################################ cat > variables.tf <<'EOF' variable name_vpc { default = "agame-dev-vpc8" } variable name_pri1 { default = "agame-dev-pri1" } variable name_pub1 { default = "agame-dev-pub1" } variable name_pri-db1 { default = "agame-dev-pri-db1" } variable name_pub-nat1 { default = "agame-dev-pub-nat1" } variable name_pub-lb1 { default = "agame-dev-pub-lb1" } variable name_pri-lb1 { default = "agame-dev-pri-lb1" } variable client_ip { default = "3.3.3.3" } # 인증키는 파일에 하드코딩하지 않고 환경변수로 주입 # export TF_VAR_access_key="ncp_iam_xxxx" # export TF_VAR_secret_key="ncp_iam_xxxx" variable access_key { sensitive = true } variable secret_key { sensitive = true } variable nks_version { default = "1.32" } variable name_scn_02 { default = "tf-scn02" } variable login_key { default = "agame-k8s12" } EOF ############################################ # versions.tf ############################################ cat > versions.tf <<'EOF' terraform { required_providers { ncloud = { source = "navercloudplatform/ncloud" } } required_version = ">= 0.13" } EOF echo "=== 생성 완료: $(pwd) ===" ls -l *.tf 3 # 네이버 클라우드 리소스를 만들기 위한 권한이 필요하다. # 오른쪽위 본인 계정 , 계정 및 보안 관리 , 2차 인증 # 보안 접근 관리 > API 인증키 관리 , 신규 API 인증키 생성 ncp_iam_BPAMtJQ8 보기 ncp_iam_BPKMKR3b9jvRf 4 # 여기 access_key 와 secret_key는 개인것을 넣어주세요!!! export TF_VAR_access_key="ncp_iam_BPAM8" export TF_VAR_secret_key="ncp_iam_BPKMt66hZAb9jvRf" terraform init && terraform plan terraform apply yes 5 terraform destroy yes 6 cd mkdir -p multi && cd multi ############################################ # main.tf (Provider, VPC, KR-1 서브넷/서버) ############################################ cat > main.tf <<'EOF' provider "ncloud" { support_vpc = true region = "KR" access_key = var.access_key secret_key = var.secret_key } resource "ncloud_vpc" "vpc" { name = var.server_name ipv4_cidr_block = "10.0.0.0/20" } resource "ncloud_subnet" "pri_subnet1" { vpc_no = ncloud_vpc.vpc.id subnet = cidrsubnet(ncloud_vpc.vpc.ipv4_cidr_block, 3, 0) zone = "KR-1" network_acl_no = ncloud_vpc.vpc.default_network_acl_no subnet_type = "PRIVATE" name = var.pribate_subnet1 usage_type = "GEN" } resource "ncloud_subnet" "pub_subnet1" { vpc_no = ncloud_vpc.vpc.id subnet = cidrsubnet(ncloud_vpc.vpc.ipv4_cidr_block, 4, 2) zone = "KR-1" network_acl_no = ncloud_vpc.vpc.default_network_acl_no subnet_type = "PUBLIC" name = var.public_subnet1 usage_type = "GEN" } resource "ncloud_subnet" "pri_lb_subnet1" { vpc_no = ncloud_vpc.vpc.id subnet = cidrsubnet(ncloud_vpc.vpc.ipv4_cidr_block, 4, 6) zone = "KR-1" network_acl_no = ncloud_vpc.vpc.default_network_acl_no subnet_type = "PRIVATE" name = var.private_subnet_lb1 usage_type = "LOADB" } resource "ncloud_subnet" "subnet_pub_ls1" { vpc_no = ncloud_vpc.vpc.id subnet = cidrsubnet(ncloud_vpc.vpc.ipv4_cidr_block, 4, 5) zone = "KR-1" network_acl_no = ncloud_vpc.vpc.default_network_acl_no subnet_type = "PUBLIC" name = var.public_subnet_lb1 usage_type = "LOADB" } resource "ncloud_subnet" "subnet_pri-db1" { name = var.private_subnet_db1 vpc_no = ncloud_vpc.vpc.id subnet = cidrsubnet(ncloud_vpc.vpc.ipv4_cidr_block, 4, 3) zone = "KR-1" network_acl_no = ncloud_vpc.vpc.default_network_acl_no subnet_type = "PRIVATE" // PUBLIC(Public) | PRIVATE(Private) } resource "ncloud_subnet" "subnet_pub-nat1" { name = var.public_subnet_nat1 vpc_no = ncloud_vpc.vpc.id subnet = cidrsubnet(ncloud_vpc.vpc.ipv4_cidr_block, 4, 4) zone = "KR-1" network_acl_no = ncloud_vpc.vpc.default_network_acl_no subnet_type = "PUBLIC" usage_type = "NATGW" // PUBLIC(Public) | PRIVATE(Private) } resource "ncloud_server" "pri_server1" { name = var.private_server_name1 server_image_number = "107029409" subnet_no = ncloud_subnet.pri_subnet1.id server_spec_code = "c2-g3a" login_key_name = "ncp-web-2025-0807" } resource "ncloud_server" "pub_server1" { name = var.public_server_name1 server_image_number = "107029409" subnet_no = ncloud_subnet.pub_subnet1.id server_spec_code = "c2-g3a" login_key_name = "ncp-web-2025-0807" } resource "ncloud_public_ip" "public_ip_scn_01" { server_instance_no = ncloud_server.pub_server1.id } EOF ############################################ # main2.tf (KR-2 서브넷/서버) ############################################ cat > main2.tf <<'EOF' resource "ncloud_subnet" "pri_subnet2" { vpc_no = ncloud_vpc.vpc.id subnet = cidrsubnet(ncloud_vpc.vpc.ipv4_cidr_block, 3, 4) zone = "KR-2" network_acl_no = ncloud_vpc.vpc.default_network_acl_no subnet_type = "PRIVATE" name = var.pribate_subnet2 usage_type = "GEN" } resource "ncloud_subnet" "pub_subnet2" { vpc_no = ncloud_vpc.vpc.id subnet = cidrsubnet(ncloud_vpc.vpc.ipv4_cidr_block, 4, 10) zone = "KR-2" network_acl_no = ncloud_vpc.vpc.default_network_acl_no subnet_type = "PUBLIC" name = var.public_subnet2 usage_type = "GEN" } resource "ncloud_subnet" "pri_lb_subnet2" { vpc_no = ncloud_vpc.vpc.id subnet = cidrsubnet(ncloud_vpc.vpc.ipv4_cidr_block, 4, 14) zone = "KR-2" network_acl_no = ncloud_vpc.vpc.default_network_acl_no subnet_type = "PRIVATE" name = var.private_subnet_lb2 usage_type = "LOADB" } resource "ncloud_subnet" "subnet_pub_lb2" { vpc_no = ncloud_vpc.vpc.id subnet = cidrsubnet(ncloud_vpc.vpc.ipv4_cidr_block, 4, 13) zone = "KR-2" network_acl_no = ncloud_vpc.vpc.default_network_acl_no subnet_type = "PUBLIC" name = var.public_subnet_lb2 usage_type = "LOADB" } resource "ncloud_subnet" "subnet_pri-db2" { name = var.private_subnet_db2 vpc_no = ncloud_vpc.vpc.id subnet = cidrsubnet(ncloud_vpc.vpc.ipv4_cidr_block, 4, 11) zone = "KR-2" network_acl_no = ncloud_vpc.vpc.default_network_acl_no subnet_type = "PRIVATE" // PUBLIC(Public) | PRIVATE(Private) } resource "ncloud_subnet" "subnet_pub-nat2" { name = var.public_subnet_nat2 vpc_no = ncloud_vpc.vpc.id subnet = cidrsubnet(ncloud_vpc.vpc.ipv4_cidr_block, 4, 12) zone = "KR-2" network_acl_no = ncloud_vpc.vpc.default_network_acl_no subnet_type = "PUBLIC" usage_type = "NATGW" // PUBLIC(Public) | PRIVATE(Private) } resource "ncloud_server" "pri_server2" { name = var.private_server_name2 server_image_number = "107029409" subnet_no = ncloud_subnet.pri_subnet2.id server_spec_code = "c2-g3a" login_key_name = "ncp-web-2025-0807" } resource "ncloud_server" "pub_server2" { name = var.public_server_name2 server_image_number = "107029409" subnet_no = ncloud_subnet.pub_subnet2.id server_spec_code = "c2-g3a" login_key_name = "ncp-web-2025-0807" } resource "ncloud_public_ip" "public_ip_scn_02" { server_instance_no = ncloud_server.pub_server2.id } EOF ############################################ # nat.tf (라우팅 테이블, NAT Gateway) ############################################ cat > nat.tf <<'EOF' # db용 RT 생성 resource "ncloud_route_table" "route_table_pri1" { name = var.private_db_rt1 vpc_no = ncloud_vpc.vpc.id supported_subnet_type = "PRIVATE" } # db rt와 subnet 연결 resource "ncloud_route_table_association" "subnet_pri-db1" { route_table_no = ncloud_route_table.route_table_pri1.id subnet_no = ncloud_subnet.subnet_pri-db1.id } # kr-1 pri전용 라우팅 테이블 생성 resource "ncloud_route_table" "route_table_pri-kr1" { name = "pri-rt-kr1" vpc_no = ncloud_vpc.vpc.id supported_subnet_type = "PRIVATE" } resource "ncloud_route_table_association" "subnet_pri-kr1" { route_table_no = ncloud_route_table.route_table_pri-kr1.id subnet_no = ncloud_subnet.pri_subnet1.id } resource "ncloud_route_table_association" "lb-subnet_pri-kr11" { route_table_no = ncloud_route_table.route_table_pri-kr1.id subnet_no = ncloud_subnet.pri_lb_subnet1.id } # NAT Gateway (KR-1) resource "ncloud_nat_gateway" "nat_gateway_scn_01" { vpc_no = ncloud_vpc.vpc.id subnet_no = ncloud_subnet.subnet_pub-nat1.id zone = "KR-1" name = var.public_not_gateway1 } # Route (KR-1 pri RT -> NAT1) resource "ncloud_route" "route_scn_01_nat" { route_table_no = ncloud_route_table.route_table_pri-kr1.id destination_cidr_block = "0.0.0.0/0" target_type = "NATGW" target_name = ncloud_nat_gateway.nat_gateway_scn_01.name target_no = ncloud_nat_gateway.nat_gateway_scn_01.id } # db2 rt와 subnet 연결 resource "ncloud_route_table_association" "subnet_pri-db2" { route_table_no = ncloud_route_table.route_table_pri1.id subnet_no = ncloud_subnet.subnet_pri-db2.id } # NAT Gateway (KR-2) resource "ncloud_nat_gateway" "nat_gateway_scn_02" { vpc_no = ncloud_vpc.vpc.id subnet_no = ncloud_subnet.subnet_pub-nat2.id zone = "KR-2" name = var.public_not_gateway2 } # Route (기본 Private RT -> NAT2) resource "ncloud_route" "route_scn_02_nat" { route_table_no = ncloud_vpc.vpc.default_private_route_table_no destination_cidr_block = "0.0.0.0/0" target_type = "NATGW" target_name = ncloud_nat_gateway.nat_gateway_scn_02.name target_no = ncloud_nat_gateway.nat_gateway_scn_02.id } EOF ############################################ # var.tf (변수) ############################################ cat > var.tf <<'EOF' variable client_ip { default = "211.188.53.77" } # 인증키는 환경변수로 주입 # export TF_VAR_access_key="ncp_iam_xxxx" # export TF_VAR_secret_key="ncp_iam_xxxx" variable access_key { sensitive = true } variable secret_key { sensitive = true } variable "server_name" { type = string default = "agame-dev-vpc" } variable "pribate_subnet1" { type = string default = "pri1" } variable "public_subnet1" { type = string default = "pub1" } variable "private_subnet_db1" { type = string default = "pri-db1" } variable "public_subnet_nat1" { type = string default = "pub-nat1" } variable "public_subnet_lb1" { type = string default = "pub-lb1" } variable "private_subnet_lb1" { type = string default = "pri-lb1" } variable "private_db_rt1" { type = string default = "db-rt1" } variable "public_not_gateway1" { type = string default = "pub-nat1" } variable "private_server_name1" { type = string default = "pri-srv1" } variable "public_server_name1" { type = string default = "pub-srv1" } variable "pribate_subnet2" { type = string default = "pri2" } variable "public_subnet2" { type = string default = "pub2" } variable "private_subnet_db2" { type = string default = "pri-db2" } variable "public_subnet_nat2" { type = string default = "pub-nat2" } variable "public_subnet_lb2" { type = string default = "pub-lb2" } variable "private_subnet_lb2" { type = string default = "pri-lb2" } variable "private_db_rt2" { type = string default = "db-rt2" } variable "public_not_gateway2" { type = string default = "pub-nat2" } variable "private_server_name2" { type = string default = "pri-srv2" } variable "public_server_name2" { type = string default = "pub-srv2" } EOF ############################################ # ver.tf (Terraform/Provider 버전) ############################################ cat > ver.tf <<'EOF' terraform { required_providers { ncloud = { source = "navercloudplatform/ncloud" } } required_version = ">= 0.13" } EOF ls -l *.tf 6 terraform init && terraform plan terraform apply yes terraform destroy yes