• NCP[Naver Cloud Platform] - 테라폼(Terraform)을 통한 모듈식 구현

    2025. 2. 28.

    by. Daramu

    이번에 aws의 Terraform을 공부하여,

    비교적 값이 저렴한 ncp에서의 테스트 구성을 해보았다.

     

    기존의 방식에서는 변수등의 설정이 어려워 몇가지 수정사항이 있었으며, 마찬가지로 vpc,subnet을 만들었고, 추가로 nat_gateway까지 생성해 보았다.

     

    컨셉은 "추가로 작성하기 간편한 구성"이기에 모듈식에서 locals등의 파일 변화를 사용해 중앙에서 관리하는 요소를 강하게 만들었다.

    (이름과 IP를 모두 바꿨기에 동작이 안할 수 있다. 100% 이름(변수명)으로 인한 것이니 수정해서 사용하면 동작할 것이다.)

     

     

    우선 각각의 리소스에 대하여 modules 폴더를 만들어 실제 resuorce는 modules안의 vpc, subnet등의 폴더에서 동작하게 만들었다.

     

    그리고 각각의 리소스를 별도의 tf 파일로 만들어 후에 신규 리소스가 추가되면 그냥 모듈 추가 + 파일 추가 형식으로 간단하게 할 수 있게 만들었다.

     

    구성을 위해 우선 provider.tf를 작성한다.

     

    terraform {
    required_providers {
    ncloud = {
    source = "NaverCloudPlatform/ncloud"
    }
    }
    required_version = ">= 0.13"
    }
    // Configure the ncloud provider
    provider "ncloud" {
    access_key = ""
    secret_key = ""
    region = "KR"
    site = "public"
    support_vpc = true
    }

     

    여기서 site의 public은 민간존을 의미한다.

    만약 자신이 공공존이라면 gov를, 금융존이라면 fin을 입력한다.

     

    자세한 변수는 ncp 공공 테라폼 홈페이지 를 참고한다.

     

    그리고 모듈을 생성한다.

    가장 먼저 VPC를 생성할 것이다.

    vpc 모듈을 생성하고, 그 폴더 안에 vpc.tf(or main.tf)와 variable.tf 를 생성한다.

    그리고 최상위 폴더에 vpc.tf 를 생성한다.

     

    vpc.tf

    modules

      ㄴvpc

          ㄴvpc.tf

          ㄴvariable.tf

     

    이렇게 되었다면 우선 modules/vpc 의 vpc.tf와 variable.tf 를 채워넣는다.

    terraform {
    required_providers {
    ncloud = {
    source = "NaverCloudPlatform/ncloud"
    }
    }
    required_version = ">= 0.13"
    }
    resource "ncloud_vpc" "vpc" {
    name = var.vpc_name
    ipv4_cidr_block = var.vpc_prd_cidr
    }
    output "vpc_prd_cidr"{
    value = ncloud_vpc.vpc.id
    }

     

    그리고 variable.tf 를 생성한다.

    variable "vpc_prd_cidr" {
    type = string
    }
    variable "vpc_name" {
    type = string
    }

     

    그리고 최상위 vpc.tf에서 module/vpc로 넣어줄 변수를 생성한다.

    module "vpc" {
    source = "./modules/vpc"
    providers = {
    ncloud = ncloud
    }
    vpc_prd_cidr = local.vpc_cidr
    vpc_name = local.vpc_name
    }

     

    최상위 vpc.tf -> module/vpc/variable -> modules/vpc/vpc.tf 순으로 선언한 변수가 내려간다.

    변수중에 local이 있다. 이건 일종의 variable과 유사한 변수로, locals를 선언하고 안에 변수를 채워넣으면 local.{name} 형식으로 사용할 수 있다.

    이제 locals.tf 를 생성하여 변수를 채워넣는다.

    (물론 vpc내부에 locals를 만들어 사용해도 된다. 사용자의 몫)

     

    locals {
    vpc_no = module.vpc.vpc_prd_id
    zone = "KR-1"
    #vpc 관련
    vpc_cidr = "10.0.0.0/16"
    vpc_name = "vpc_prd_cidr"
    #subnet 관련
    subnet_public_natgw_id = module.subnet_public_nat.subnet_id_map["10.0.1.0/24"]
    }

     

    locals에서 modules/vpc/vpc.tf 에서 output으로 빼낸 vpc_id를 vpc_no라는 변수로 받는 것을 볼 수있다.

    이 id(=no)를 통해 subnet을 생성할 것이다.

     

    여기까지 진행하였다면

    vpc.tf

    locals.tf

    modules

      ㄴvpc

         ㄴvpc.tf

         ㄴvariable.tf 

     

    이런 형식이다.

     

    이제 subnet을 위해 subnet.tf와, modules/subnet, modules/subnet/subnet.tf & variable.tf 를 생성한다.

     

    #modules/subnet/subnet.tf
    terraform {
    required_providers {
    ncloud = {
    source = "NaverCloudPlatform/ncloud"
    }
    }
    required_version = ">= 0.13"
    }
    resource "ncloud_subnet" "subnet" {
    for_each = var.subnet_map
    vpc_no = var.vpc_no
    subnet = each.key
    zone = var.zone
    network_acl_no = var.network_acl_no
    subnet_type = var.subnet_type
    usage_type = var.usage_type
    name = each.value
    }
    output "subnet_id_map" {
    # CIDR -> ID Map
    value = { for key, subnet in ncloud_subnet.subnet : key => subnet.id }
    }

     

    그리고 variable.tf 를 생성한다.

    variable "vpc_no" {
    type = string
    }
    variable "zone" {
    type = string
    }
    variable "network_acl_no" {
    type = string
    }
    variable "subnet_type" {
    type = string
    }
    variable "usage_type" {
    type = string
    }
    variable "subnet_map" {
    # key: CIDR, value: 이름
    type = map(string)
    }

     

    modules/subnet.tf 에는 map 함수가 있다.

    이건 후에 vm및 nat_gateway 추가를 위해 특정 subnet을 지목하기 위함이다.

    여기서는 key를 ip로, value를 이름으로 할 것이다.

    즉, name : 1.1.1.1 형식으로 주어진다면, name은 name이고, ip에는 1.1.1.1 을 채워넣겠다는 것이다.

     

    이건 최상단의 subnet.tf파일에서 바로 사용한다.

    module "subnet_public_nat" {
    source = "./modules/subnet"
    providers = {
    ncloud = ncloud
    }
    vpc_no = local.vpc_no
    subnet_map = {
    "10.0.1.0/24" = "sub-prd-public-nat"
    }
    zone = local.zone
    network_acl_no = module.vpc.default_network_acl_no
    subnet_type = "PUBLIC"
    usage_type = "NATGW"
    }
    module "subnet_public_lb" {
    source = "./modules/subnet"
    providers = {
    ncloud = ncloud
    }
    vpc_no = local.vpc_no
    subnet_map = {
    "10.0.10.0/24" = "sub-prd-pub-lb-web"
    "10.0.30.0/24" = "sub-prd-pub-lb-test"
    }
    zone = local.zone
    network_acl_no = module.vpc.default_network_acl_no
    subnet_type = "PUBLIC"
    usage_type = "LOADB"
    }
    module "subnet_public_gen" {
    source = "./modules/subnet"
    providers = {
    ncloud = ncloud
    }
    vpc_no = local.vpc_no
    subnet_map = {
    "10.0.100.0/24" = "sub-prd-test2"
    "10.0.101.0/24" = "sub-prd-test3"
    }
    zone = local.zone
    network_acl_no = module.vpc.default_network_acl_no
    subnet_type = "PUBLIC"
    usage_type = "GEN"
    }
    module "subnet_private_lb" {
    source = "./modules/subnet"
    providers = {
    ncloud = ncloud
    }
    vpc_no = local.vpc_no
    subnet_map = {
    "10.0.200.0/24" = "sub-prd-pri-lb"
    }
    zone = local.zone
    network_acl_no = module.vpc.default_network_acl_no
    subnet_type = "PRIVATE"
    usage_type = "LOADB"
    }
    module "subnet_private_gen" {
    source = "./modules/subnet"
    providers = {
    ncloud = ncloud
    }
    vpc_no = local.vpc_no
    subnet_map = {
    "10.0.220.0/24" = "sub-prd-pri-test6"
    "10.0.221.0/24" = "sub-prd-pri-test7"
    "10.0.222.0/24" = "sub-prd-pri-test8"
    "10.0.223.0/24" = "sub-prd-pri-test9"
    "10.0.224.0/24" = "sub-prd-pri-test10"
    }
    zone = local.zone
    network_acl_no = module.vpc.default_network_acl_no
    subnet_type = "PRIVATE"
    usage_type = "GEN"
    }

     

    이렇게 되었다면 modules가 있는 최상위 subnet.tf에서 key를 "10.0.223.0/24"로 가고, valuse로는 "sub-prd-pri-test9" 으로 주어진다.

     

    그리고 natgateway를 위해

    nat_gateway.tf와 modules안에 natgw, 그리고 natgw/natgw.tf와 variable.tf 를 만들어준다.

     

    module "natgw" {
    source = "./modules/nat_gateway"
    providers = {
    ncloud = ncloud
    }
    vpc_no = local.vpc_no
    zone = local.zone
    subnet_no = local.subnet_public_natgw_id
    name = "natgw"
    }

     

    terraform {
    required_providers {
    ncloud = {
    source = "NaverCloudPlatform/ncloud"
    }
    }
    required_version = ">= 0.13"
    }
    resource "ncloud_nat_gateway" "nat_gateway" {
    vpc_no = var.vpc_no
    subnet_no = var.subnet_no
    zone = var.zone
    name = var.name
    }
    variable "vpc_no" {
    type = string
    }
    variable "zone" {
    type = string
    }
    variable "subnet_no" {
    type = string
    }
    variable "name" {
    type = string
    }
    variable "private_route_table_no" {
    type = string
    }

     

    이런식으로 natgw가 있을 subnet위치를 locals에서 선언했던 "subnet_public_natgw_id = module.subnet_public_nat.subnet_id_map["10.0.1.0/24"]" 를 사용해 해당 정보를 얻고 그걸 natgw에 넣는 식으로 참조할 수 있다.

     

    '클라우드 > NCP' 카테고리의 다른 글

    댓글