brunch

You can make anything
by writing

C.S.Lewis

by Master Seo May 19. 2022

6탄-테라폼-5. NCP  테라폼으로 VPC 생성

테라폼으로  VPC 생성해봅시다~

수작업을 자동화해서 오류와 작업시간을 줄여 봅시다.


작업 순서는?

명령 내릴 서버를 1대 만들자.

명령 서버에  테라폼을 설치하고, 테라폼으로  VPC 1개 만들어보자.



<1>  작업용 로키 리눅스나 우분트 서버 1대 생성

<2>  테라폼 설치

<3>  네이버 클라우드 테라폼  샘플 코드 다운 로드

<4>  테라폼으로  vpc  생성하기




<1>  작업용 로키 리눅스나 우분트 서버 1대 생성


1

네이버 클라우드로 로그온 한다.

콘솔로 로그온해  작업용 서버를 1대를 만들어보자.

서버를 만들기 위해 VPC를 하나 만들어야 한다.


디폴트 VPC가 없다.

VPC 1개를 만들자.

VPC 1개와 퍼블릭 서브넷 1개를 만든다.

 VPC 생성

// 네이버 클라우드는 디폴트 VPC가 없다.  

VPC는 무조건 만들어야  서버 생성이 가능하다.

KR1

public subnet 1개도 생성



2

이후 서버 생성

Server > Server > +서버 생성   > 로키 리눅스나 우분트 생성해보자.



추가

공인 IP : 새로운 공인 IP 할당

다음

새로운 인증키 생성 

agame-command1

 서버 생성


3

서버 로그인

passwd

g1!




<2>  테라폼 설치


1

https://www.terraform.io/downloads.html



우분트 가능

로키 리눅스는  아마존 리눅스 테라폼 설치



2

centos 경우

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


3

 terraform -v

[root@s180 d9 ec005 f ~]# terraform -v

Terraform v1.1.9

on linux_amd64





<3>  네이버 클라우드 테라폼  샘플 코드 다운 로드


1

리눅스 서버 로그인


2

sample 위치

https://github.com/NaverCloudPlatform/terraform-provider-ncloud/tree/master/examples



3

다운로드


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

unzip master.zip





<4>  테라폼으로  vpc  생성하기


1

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


# ls

main.tf  variables.tf  versions.tf



2

포털 > 마이페이지 > 계정 관리 > 인증키 관리에서 키 확인에서  

access_key와 secret_key를 확인해 복사해 놓는다.



3

테라폼 파일 내용 확인


# ls

main.tf  variables.tf  versions.tf



# more *.tf

::::::::::::::

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_01" {

  key_name = var.name_scn01

}


resource "ncloud_vpc" "vpc_scn_01" {

  name            = var.name_scn01

  ipv4_cidr_block = "10.0.0.0/16"

}


resource "ncloud_subnet" "subnet_scn_01" {

  name           = var.name_scn01

  vpc_no         = ncloud_vpc.vpc_scn_01.id

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

  // 10.0.1.0/24

  zone           = "KR-2"

  network_acl_no = ncloud_vpc.vpc_scn_01.default_network_acl_no

  subnet_type    = "PUBLIC"

  // PUBLIC(Public) | PRIVATE(Private)

}


resource "ncloud_server" "server_scn_01" {

  subnet_no                 = ncloud_subnet.subnet_scn_01.id

  name                      = var.name_scn01

  server_image_product_code = "SW.VSVR.OS.LNX64.CNTOS.0703.B100"

  login_key_name            = ncloud_login_key.key_scn_01.key_name

}


resource "ncloud_public_ip" "public_ip_scn_01" {

  server_instance_no = ncloud_server.server_scn_01.id

  description        = "for ${var.name_scn01}"

}


locals {

  scn01_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"],

  ]


  scn01_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"]

  ]

}


resource "ncloud_network_acl_rule" "network_acl_01_rule" {

  network_acl_no = ncloud_vpc.vpc_scn_01.default_network_acl_no

  dynamic "inbound" {

    for_each = local.scn01_inbound

    content {

      priority    = inbound.value[0]

      protocol    = inbound.value[1]

      ip_block    = inbound.value[2]

      port_range  = inbound.value[3]

      rule_action = inbound.value[4]

      description = "for ${var.name_scn01}"

    }

  }


  dynamic "outbound" {

    for_each = local.scn01_outbound

    content {

      priority    = outbound.value[0]

      protocol    = outbound.value[1]

      ip_block    = outbound.value[2]

      port_range  = outbound.value[3]

      rule_action = outbound.value[4]

      description = "for ${var.name_scn01}"

    }

  }

}




::::::::::::::

variables.tf

::::::::::::::

variable name_scn01 {

  default = "tf-scn01"

}


variable client_ip {

  default = "YOUR_CLIENT_IP"

}


variable access_key {

  default = "YOUR_ACCESS_KEY"

}


variable secret_key {

  default = "YOUR_SECRET_KEY"

}





::::::::::::::

versions.tf

::::::::::::::

terraform {

  required_providers {

    ncloud = {

      source = "navercloudplatform/ncloud"

    }

  }

  required_version = ">= 0.13"

}





4

curl ifconfig.io



5

참고

CIDR  서브넷 

https://www.terraform.io/language/functions/cidrsubnet


  ipv4_cidr_block = "10.0.0.0/16"



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

/16에  + 8  =  /24

10.0.1.0/24 이다.




6

terraform init

terraform plan

terraform apply -auto-approve


삭제

terraform destroy --auto-approve



8

콘솔에서 확인






전체 보기

https://brunch.co.kr/@topasvga/2450


감사합니다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari