본문 바로가기

NCP

[NCP] Terraform을 사용해서 서버 생성하기

실습 환경

NCP(네이버 클라우드 플랫폼) 서버 1대 : 2 vCPU, 4GB Memory / CentOS 7.8

 

테라폼이란?

테라폼은 프로그램 코드를 통해 인프라 서버를 구축/운영 있게 해주는 오픈 소스 소프트웨어 이다.(자동화)

코드형 인프라를 뜻하는 IaC 도구 이다.

 

1. NCP 에서 테라폼으로 서버 생성하기

 

1) NCP 콘솔에서 서버 생성

 

2) 서버에 테라폼 설치

sudo yum install -y yum-utils

sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo

sudo yum -y install terraform

terraform version

 

3) 샘 코드 다운로드

wget https://github.com/NaverCloudPlatform/terraform-provider-ncloud/archive/refs/heads/master.zip

unzip master.zip

 

cd /root/terraform-provider-ncloud-master/examples/vpc/scenario01

ls -al

 

4) 코드 파일 수정

----------------------------------------------------------------------------------------------------------------------------------

vi versions.tf

 

terraform {

  required_providers {

    ncloud = {

      source = "navercloudplatform/ncloud"

    }

  }

  required_version = ">= 1.2.4"   -> 테라폼버전 입력

}

 

vi variables.tf

 

variable name_scn02 {

  default = "tf-scn02"    -> 생성될 인증키 이름

}

 

variable client_ip {

  default = "YOUR_CLIENT_IP"    -> ifconfig.kr 가서 확인

}

 

variable access_key {

  default = "YOUR_ACCESS_KEY"    -> NCP계정 액세스

}

 

variable secret_key {

  default = "YOUR_SECRET_KEY"    -> NCP계정 시크릿

}

----------------------------------------------------------------------------------------------------------------------------------

vi main.tf

 

# VPC > User scenario > Scenario 1. Single Public Subnet

# https://docs.ncloud.com/ko/networking/vpc/vpc_userscenario1.html

 

provider "ncloud" {

  support_vpc = true

  region      = "KR"

  access_key  = var.access_key

  secret_key  = var.secret_key

}

 

resource "ncloud_login_key" "key_scn_02" {

  key_name = var.name_scn02

}

 

# Pem key Create

resource "local_file" "login_key" {

  filename        = "${ncloud_login_key.key_scn_02.key_name}.pem"

  content         = ncloud_login_key.key_scn_02.private_key

  file_permission = "0400"

}

# VPC

resource "ncloud_vpc" "vpc_scn_02" {

  name            = var.name_scn02

  ipv4_cidr_block = "10.0.0.0/16"

}

# Public Subnet Create

resource "ncloud_subnet" "subnet_scn_02" {

  name           = "${var.name_scn02}-public"

  vpc_no         = ncloud_vpc.vpc_scn_02.id

  subnet         = cidrsubnet(ncloud_vpc.vpc_scn_02.ipv4_cidr_block, 8, 2)

  // 10.0.2.0/24

  zone           = "KR-2"

  network_acl_no = ncloud_network_acl.network_acl_02_public.id

  subnet_type    = "PUBLIC"

  // PUBLIC(Public) | PRIVATE(Private)

}

# Private Subnet Create

resource "ncloud_subnet" "subnet_scn_02_private" {

  name           = "${var.name_scn02}-private"

  vpc_no         = ncloud_vpc.vpc_scn_02.vpc_no

  subnet         = cidrsubnet(ncloud_vpc.vpc_scn_02.ipv4_cidr_block, 8, 1)

  // "10.0.1.0/24"

  zone           = "KR-2"

  network_acl_no = ncloud_network_acl.network_acl_02_private.id

  subnet_type    = "PRIVATE"

  // PRIVATE(Private)

}

# Server Create (WEB)

resource "ncloud_server" "server_scn_02" {

  subnet_no                 = ncloud_subnet.subnet_scn_02.id

  name                      = "${var.name_scn02}-public"

  server_image_product_code = "SW.VSVR.OS.LNX64.CNTOS.0708.B050"

  login_key_name            = ncloud_login_key.key_scn_02.key_name

}

# Server Create (WAS)

resource "ncloud_server" "server_scn_02_private" {

  subnet_no                 = ncloud_subnet.subnet_scn_02_private.id

  name                      = "${var.name_scn02}-private"

  server_image_product_code = "SW.VSVR.OS.LNX64.CNTOS.0708.B050"

  login_key_name            = ncloud_login_key.key_scn_02.key_name

}

# Public IP Create

resource "ncloud_public_ip" "public_ip_scn_02" {

  server_instance_no = ncloud_server.server_scn_02.id

  description        = "for ${var.name_scn02}"

}

# ACG Create

locals {

  scn02_inbound = [

    [1, "TCP", "0.0.0.0/0", "80", "ALLOW"],

    [2, "TCP", "0.0.0.0/0", "443", "ALLOW"],

    [3, "TCP", "${var.client_ip}/32", "22", "ALLOW"],

    [4, "TCP", "${var.client_ip}/32", "3389", "ALLOW"],

    [5, "TCP", "0.0.0.0/0", "32768-65535", "ALLOW"],

    [197, "TCP", "0.0.0.0/0", "1-65535", "DROP"],

    [198, "UDP", "0.0.0.0/0", "1-65535", "DROP"],

    [199, "ICMP", "0.0.0.0/0", null, "DROP"],

  ]

 

  scn02_outbound = [

    [1, "TCP", "0.0.0.0/0", "80", "ALLOW"],

    [2, "TCP", "0.0.0.0/0", "443", "ALLOW"],

    [3, "TCP", "${var.client_ip}/32", "1000-65535", "ALLOW"],

    [197, "TCP", "0.0.0.0/0", "1-65535", "DROP"],

    [198, "UDP", "0.0.0.0/0", "1-65535", "DROP"],

    [199, "ICMP", "0.0.0.0/0", null, "DROP"]

  ]

}

# Network ACL Create

resource "ncloud_network_acl" "network_acl_02_public" {

  vpc_no = ncloud_vpc.vpc_scn_02.id

  name   = "${var.name_scn02}-public"

}

resource "ncloud_network_acl" "network_acl_02_private" {

  vpc_no = ncloud_vpc.vpc_scn_02.id

  name   = "${var.name_scn02}-private"

}

# Nacl Rule (Pub)

resource "ncloud_network_acl_rule" "nacl_rule_public" {

  network_acl_no    = ncloud_network_acl.network_acl_02_public.id

 

# Nacl Inbound Rule (Pub)

  dynamic "inbound" {

    for_each = local.scn02_inbound

    content {

      priority    = 1

      protocol    = "TCP"

      ip_block    = "0.0.0.0/0"

      port_range  = "22"

      rule_action = "ALLOW"

      description = "SSH for Service"

    }

  }

  dynamic "inbound" {

    for_each = local.scn02_inbound

    content {

      priority    = 2

      protocol    = "TCP"

      ip_block    = "0.0.0.0/0"

      port_range  = "80"

      rule_action = "ALLOW"

      description = "HTTP for Service"

    }

  }

  dynamic "inbound" {

    for_each = local.scn02_inbound

    content {

      priority    = 3

      protocol    = "TCP"

      ip_block    = "0.0.0.0/0"

      port_range  = "443"

      rule_action = "ALLOW"

      description = "HTTPS for Service"

    }

  }

# Nacl Outbound Rule (Pub)

  dynamic "outbound" {

    for_each = local.scn02_outbound

    content {

      priority    = 1

      protocol    = "TCP"

      ip_block    = "0.0.0.0/0"

      port_range  = "1-65535"

      rule_action = "ALLOW"

      description = "for ${var.name_scn02}"

    }

  }

  dynamic "outbound" {

    for_each = local.scn02_outbound

    content {

      priority    = 2

      protocol    = "UDP"

      ip_block    = "0.0.0.0/0"

      port_range  = "1-65535"

      rule_action = "ALLOW"

      description = "for ${var.name_scn02}"

    }

  }

  dynamic "outbound" {

    for_each = local.scn02_outbound

    content {

      priority    = 3

      protocol    = "ICMP"

      ip_block    = "0.0.0.0/0"

      port_range  = null

      rule_action = "ALLOW"

      description = "for ${var.name_scn02}"

    }

  }

}

# Nacl Rule (Priv)

resource "ncloud_network_acl_rule" "nacl_rule_private" {

  network_acl_no    = ncloud_network_acl.network_acl_02_private.id

 

# Nacl Inbound Rule (Priv)

  dynamic "inbound" {

    for_each = local.scn02_inbound

    content {

      priority    = 1

      protocol    = "TCP"

      ip_block    = "0.0.0.0/0"

      port_range  = "22"

      rule_action = "ALLOW"

      description = "SSH for Service"

    }

  }

  dynamic "inbound" {

    for_each = local.scn02_inbound

    content {

      priority    = 2

      protocol    = "TCP"

      ip_block    = "0.0.0.0/0"

      port_range  = "80"

      rule_action = "ALLOW"

      description = "HTTP for Service"

    }

  }

  dynamic "inbound" {

    for_each = local.scn02_inbound

    content {

      priority    = 3

      protocol    = "TCP"

      ip_block    = "0.0.0.0/0"

      port_range  = "443"

      rule_action = "ALLOW"

      description = "HTTPS for Service"

    }

  }

# Nacl Outbound Rule (Priv)

  dynamic "outbound" {

    for_each = local.scn02_outbound

    content {

      priority    = 1

      protocol    = "TCP"

      ip_block    = "0.0.0.0/0"

      port_range  = "1-65535"

      rule_action = "ALLOW"

      description = "for ${var.name_scn02}"

    }

  }

  dynamic "outbound" {

    for_each = local.scn02_outbound

    content {

      priority    = 2

      protocol    = "UDP"

      ip_block    = "0.0.0.0/0"

      port_range  = "1-65535"

      rule_action = "ALLOW"

      description = "for ${var.name_scn02}"

    }

  }

  dynamic "outbound" {

    for_each = local.scn02_outbound

    content {

      priority    = 3

      protocol    = "ICMP"

      ip_block    = "0.0.0.0/0"

      port_range  = null

      rule_action = "ALLOW"

      description = "for ${var.name_scn02}"

    }

  }

}

# NAT Gateway

resource "ncloud_nat_gateway" "nat_gateway_scn_02" {

  vpc_no = ncloud_vpc.vpc_scn_02.id

  zone   = "KR-2"

  name   = var.name_scn02

}

# Route

resource "ncloud_route" "route_scn_02_nat" {

  route_table_no         = ncloud_vpc.vpc_scn_02.default_private_route_table_no

  destination_cidr_block = "0.0.0.0/0"

  target_type            = "NATGW" // NATGW (NAT Gateway) | VPCPEERING (VPC Peering) | VGW (Virtual Private Gateway).

  target_name            = ncloud_nat_gateway.nat_gateway_scn_02.name

  target_no              = ncloud_nat_gateway.nat_gateway_scn_02.id

}

 

----------------------------------------------------------------------------------------------------------------------------------

5) 테라폼 생성&삭제 명령어 수행

terrafrom init

terrafrom plan

terrafrom apply -auto-approve  -> 생성

terrafrom destroy -auto-approve  -> 삭제

 

6) 생성된 리소스 확인

- Network ACL (Nacl) 확인

 

- Nat Gateway 확인

 

- Route Table 설정 확인

 

- Subnet 확인

 

- VPC 확인

 

- Server 생성 확인

 

- 인증키(.pem 키) 생성 및 위치 확인

7) 기타 및 이슈사항

1 테스트 완료

 - VPC/Subnet/NACL/Route Table/ACG 생성 완료 (룰설정x,ACG디폴트만 생성,코드 수정 필요)

 - pub/priv 서버 1대씩 생성 완료 (코드에 작성한 Spec대로)

 - 생성한 인증키 파일은 어디에 있는가? ->NCP에 문의, 아래와 같은 답변 받음

안녕하세요.

네이버 클라우드 플랫폼입니다.

 

로그인 키 다운로드하는 방법은 테라폼 기본 리소스인 "local_file" 을 통해 다운로드가 가능합니다.

(정확히는 다운로드가 아니고, 로컬에 작성하는 형식입니다.)

아래는 예시입니다.

 

resource "local_file" "login_key" {

  filename        = "${ncloud_login_key.key_devops.key_name}.pem"

  content         = ncloud_login_key.key_devops.private_key

  file_permission = "0400"

 

2 테스트 완료

 - 위의 작성한 코드 문제없이 apply 가능 확인

 - Nacl 설정한대로 적용되어 생성

 

3 테스트 완료

 - pem 파일 생성 코드 작성 생성 위치 파일 확인

 

'NCP' 카테고리의 다른 글

[NCP] MySQL 웹-DB 연동  (0) 2022.01.11