실습 환경
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 |
---|