후니의 IT인프라 사전

[T101 스터디] 네이버 클라우드 - VPC 환경의 단일 WebServer 배포 본문

프로젝트&&스터디/Terraform 스터디 [T101]

[T101 스터디] 네이버 클라우드 - VPC 환경의 단일 WebServer 배포

james_janghun 2022. 11. 12. 15:00

당연하지만 우리는 클라우드 벤더사의 자원을 생성할 것이고, CLI를 이용하기 때문에 반드시 사전작업을 먼저 진행해야한다.

 

사전 작업을 진행했다는 전제 하에 다음 작업을 수행할 수 있다.

완성된 코드는 github에서 확인할 수 있다.

 

작업 디렉토리 생성

앞서 말했듯 테라폼에서는 작업 디렉토리 단위로 작업을 편성하고 이를 마치 프로젝트라고 생각하면 된다.

우리는 web-dev라는 하나의 프로젝트를 구성하겠다.

mkdir single-web-server
cd single-web-server

 

provider 규정

가장 먼저 할 일은 내가 사용할 provider가 무엇인지 테라폼에게 알려주는 일이다. 따라서 provider 선언을 해주고 terraform init명령어를 통해서 해당 디렉토리를 해당 환경으로 규정시킨다.

 

1. provider.tf 생성

해당 provider에 대한 코드는 모두 Terraform registry의 ncloud 항목에서 가져올 수 있다.

민감정보는 모두 var를 통한 변수처리를 진행한다.

terraform {
  required_providers {
    ncloud = {
      source = "NaverCloudPlatform/ncloud"
    }
  }
  required_version = ">= 0.13"
}

provider "ncloud" {
  access_key  = var.access_key
  secret_key  = var.secret_key
  region      = var.region
  site        = var.site
  support_vpc = var.support_vpc
}

 

2. variables.tf 생성

기존 코드에서 {var.변수명}으로 처리된 내용에 대한 값을 variables 파일로 별도 생성해서 관리할 수 있다.

variable "access_key" {
  default = "엑세스 키"
}

variable "secret_key" {
  default = "시크릿 키"
}

variable "region" {
  default = "KR"
}

variable "site" {
  default = "public"
}

variable "support_vpc" {
  default = "true"
}

 

3. terraform init 

init을 통해서 내가 사용할 provider 선언을 마친다. 아래 화면처럼 초록색으로 successfully initialized! 라는 문구가 등장한다면 잘 선언된 것이다.

terraform init

 

main.tf 테라폼 파일 작성

이 후부터는 사실 terraform 보다 클라우드 지식이 더 중요하다고 볼 수 있는데 인스턴스 생성에 앞서 내가 사용할 인스턴스의 네트워킹 구성을 선행해야한다. 

 

VPC (Virtual Private Cloud) 및 Subnet생성

 

VPC는 해당 인스턴스가 위치할 개인 사설 네트워크 영역으로 구성할 IP 설정이 가능하다.

먼저 vpc.tf 파일을 작성한다.

 

1. main.tf작성

resource "ncloud_vpc" "vpc" {
  name = "web-dev-vpc"
  ipv4_cidr_block = "10.0.0.0/16"
}

resource "ncloud_subnet" "subnet" {
  vpc_no         = ncloud_vpc.vpc.id
  subnet         = "10.0.1.0/24"
  zone           = "KR-2"
  network_acl_no = ncloud_vpc.vpc.default_network_acl_no
  subnet_type    = "PUBLIC"
  name           = "subnet-01"
}

 

2. Terraform plan 으로 파악

terraform plan

 

Terraform plan을 입력하면 아래와 같이 생성될 리소스 정보에 대해서 표시해준다.

resource가 우리가 선언한 내용에 대한 내용이며, +는 생성표시이다.

맨 마지막 줄에 plan 줄에서 총 생성되는 리소스의 갯수 등을 파악할 수 있다.

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # ncloud_network_acl.nacl will be created
  + resource "ncloud_network_acl" "nacl" {
      + description    = (known after apply)
      + id             = (known after apply)
      + is_default     = (known after apply)
      + name           = (known after apply)
      + network_acl_no = (known after apply)
      + vpc_no         = (known after apply)
    }

  # ncloud_vpc.vpc will be created
  + resource "ncloud_vpc" "vpc" {
      + default_access_control_group_no = (known after apply)
      + default_network_acl_no          = (known after apply)
      + default_private_route_table_no  = (known after apply)
      + default_public_route_table_no   = (known after apply)
      + id                              = (known after apply)
      + ipv4_cidr_block                 = "10.0.0.0/16"
      + name                            = (known after apply)
      + vpc_no                          = (known after apply)
    }

Plan: 2 to add, 0 to change, 0 to destroy.

 

 

 

3. Terraform apply로 작업 실행

plan에서 원하는 대로 실행될 준비가 완료되었다면 terraform apply를 통해서 실제로 배포해본다.

terraform apply --auto-approve

 

 

서버 인증키(pem) 생성

서버 인증 및 비밀번호 획득을 위한 pem 키를 생성하고, 해당 pem키가 저장될 장소를 local_file 리소스를 통해서 규정합니다. filename에 저장 경로를 규정해주면 해당 경로로 pem키가 생성되며, destroy시 pem키도 같이 삭제됩니다.

resource "ncloud_login_key" "login_key" {
  key_name = "key-test"
}

resource "local_file" "private_key" {
  filename = "./${ncloud_login_key.login_key.key_name}.pem"
  content = "ncloud_login_key.login_key.private_key"
  file_permission = "0400"
}

 

ACG(Access Control Group) 생성

ACG는 AWS의 Security Group 과 동일한 리소스입니다. 인스턴스의 inbound, outbound traffic을 통제합니다.

 

1. ACG 생성 (acg 설정이 필요한 경우만 사용, default가 기본으로 생성됨)

resource "ncloud_access_control_group" "web-acg" {
  name        = "web-dev-acg"
  description = "This is acg for webserver on dev"
  vpc_no      = ncloud_vpc.vpc.id
}

- ncloud_access_control_group

  name : ACG의 이름을 규정

  description : 설명 작성

  vpc_no : 해당 ACG가 속할 vpc를 규정

 

 

2. ACG-Rule 설정

resource "ncloud_access_control_group_rule" "acg-rule" {
  access_control_group_no = ncloud_vpc.vpc.default_access_control_group_no

  inbound {
    protocol    = "TCP"
    ip_block    = "0.0.0.0/0"
    port_range  = "22"
    description = "accept 22 port"
  }

  inbound {
    protocol    = "TCP"
    ip_block    = "0.0.0.0/0"
    port_range  = "80"
    description = "accept 80 port"
  }

  outbound {
    protocol    = "TCP"
    ip_block    = "0.0.0.0/0"
    port_range  = "1-65535"
    description = "accept 1-65535 port"
  }
}

 

 

WebServer 배포

1. init script 규정

nginx 서버를 통해서 web server를 배포하기 위해서 자동 설치 스크립트를 적용시켜 보겠습니다.

resource "ncloud_init_script" "init" {
  name    = "http-script"
  content = "#!/bin/bash \n yum install -y httpd \n systemctl start httpd"
}

 

2. Web Server 인스턴스 생성

 

서버 인스턴스를 생성하기 위해서 필요한 서브넷 정보와 이미지 정보를 기입하고, 공인 IP를 추가하도록 하겠습니다.

resource "ncloud_server" "server" {
  subnet_no                 = ncloud_subnet.subnet.id
  name                      = "dev-web-server"
  server_image_product_code = "SW.VSVR.OS.LNX64.CNTOS.0703.B050"
  login_key_name            = ncloud_login_key.login_key.key_name
  init_script_no            = ncloud_init_script.init.id
}

- ncloud_server

  name : 서버의 이름을 규정합니다.

  subnet_no : 해당 서버가 위치할 서브넷 규정

  server_image_product_code : 서버 이미지를 규정  (이미지 정보는 이 링크에서 자세하게 확인 가능합니다)

  login_key_name : 사용할 pem 키를 규정

  init_script_no : 사용할 init script가 있다면 id를 규정

 

3. Public IP 추가

공인 IP를 통해서 외부 노출을 할 수 있도록 적용시켜 줍니다.

resource "ncloud_public_ip" "public_ip" {
  server_instance_no = ncloud_server.server.id
}

- ncloud_public_ip

  server_instance_no : 공인아이피를 부여할 서버 규정