Infra/main.tf 에 NCP 를 위한 provider 셋팅
Beginning point
terraform doc 에서 Ncloud 와 관련한 문서찾기
init: Customizing configuration
NaverClould provider 셋팅 가져와서 설정값 커스터마이징
# main.tf
terraform {
required_providers {
ncloud = {
source = "NaverCloudPlatform/ncloud"
}
}
required_version = ">= 0.13"
}
// Configure the ncloud provider
provider "ncloud" {
# access_key = var.access_key
# secret_key = var.secret_key
region = var.region
# site = var.site
# support_vpc = var.support_vpc
}
// Create a new server instance
resource "ncloud_server" "server" {
# ...
}
# configuration set up
terraform init
Server instance code
VPC setup
VPC 로 진행할 예정이니 아래에 있는 VPC 버전으로 셋팅
terraform {
required_providers {
ncloud = {
source = "NaverCloudPlatform/ncloud"
}
}
required_version = ">= 0.13"
}
// Configure the ncloud provider
provider "ncloud" {
# access_key = var.access_key
# secret_key = var.secret_key
region = "KR"
site = "PUBLIC"
support_vpc = true
}
// Create a new server instance
resource "ncloud_login_key" "loginkey" {
key_name = "test-key"
}
resource "ncloud_vpc" "test" {
ipv4_cidr_block = "10.1.0.0/16"
}
resource "ncloud_subnet" "test" {
vpc_no = ncloud_vpc.test.vpc_no
subnet = cidrsubnet(ncloud_vpc.test.ipv4_cidr_block, 8, 1)
zone = "KR-2"
network_acl_no = ncloud_vpc.test.default_network_acl_no
subnet_type = "PUBLIC"
usage_type = "GEN"
}
resource "ncloud_server" "server" {
subnet_no = ncloud_subnet.test.id
name = "my-tf-server"
server_image_product_code = "SW.VSVR.OS.LNX64.CNTOS.0703.B050"
login_key_name = ncloud_login_key.loginkey.key_name
}
plan 과 apply 를 진행하게되면 이번에는 NCP 통해 서버를 띄우기 떄문에 access key 와 secret key 를 입력하라고 요청이 온다. NCP 웹사이트 → 계정관리 → 인증키 관리 에서 찾아서 입력하면 된다.
terraform plan
terraform apply
Key handling
필요할 떄마다 계속해서 복사 붙여넣기 하기 힘들기 때문에 zsh 에 삽입해주는 것도 방법이다.
vi ~/.zshrc
# 값 추가해 놓기
export NCLOUD_ACCESS_KEY=""
export NCLOUD_SECRET_KEY=""
export NCLOUD_REGION="KR"
# 이후 쉘에서 source
source ~/.zshrc
Result check
완료가 되었으면 생성된 부분을 NCP 에서 확인이 가능하다.
이제 다시 삭제해보자
terraform destroy
위에서 zshrc 에 등록해서 소싱을 해두었다면 따로 access key 와 secret key 를 입력하라고 뜨지 않을 것이다.
삭제완료
Update code
NCP 서버 생성에 디테일을 잡아주자.
기본적으로 테라폼은 API 를 기반으로 운용되기 때문에 각각의 서비스들에서 제공하는 문서들을 참고하여 필드를 사용하는 것이 바람직하다.
<https://api.ncloud-docs.com/docs/home>
Instance detail
원하는 클라우드 환경과 원하는 인스턴스를 설정한다.
<https://api.ncloud-docs.com/docs/common-vapidatatype-clouddbproduct>
네이버 클라우드 API 문서에서 제공하는 필드 네임들을 체크하고 코드에 적용한다.
resource "ncloud_server" "server" {
subnet_no = ncloud_subnet.test.id
name = "my-tf-server"
# server_image_product_code = "SW.VSVR.OS.LNX64.CNTOS.0703.B050"
server_image_product_code = "SW.VSVR.OS.LNX64.UBNTU.SVR2004.B050"
server_product_code = data.ncloud_server_products.products.server_products[0].product_code # 서버스펙 설정
login_key_name = ncloud_login_key.loginkey.key_name
...
}
# 서버스펙 데이터 삽입
data "ncloud_server_products" "products" {
server_image_product_code = "SW.VSVR.OS.LNX64.UBNTU.SVR2004.B050"
# SVR.VSVR.HICPU.C002.M004.NET.HDD.B050.G002
filter {
name = "product_code"
values = ["SSD"]
regex = true
}
filter {
name = "cpu_count"
values = ["2"]
}
filter {
name = "memory_size"
values = ["4GB"]
}
filter {
name = "base_block_storage_size"
values = ["50GB"]
}
filter {
name = "product_type"
values = ["HICPU"]
}
output_file = "product.json"
}
output "products" {
value = {
for product in data.ncloud_server_products.products.server_products:
product.id => product.product_name
}
}
filter 된 내용과 일치하는 정보값으로 product code (server sepcs) 가 들어가게 된다.
Public IP set up
기존 코드로는 ip 설정이 되지 않아 ssh 로 접근이 어렵다. 이부분을 설정하고 할당하자.
Server resource 에 기본적으로 들어가 있는 필드들을 알고 있어야 작성하는데 이해가 안가는 부분을 줄일 수 있다.
공인 IP 를 생성해주고 server_instance_no 를 이용해서 할당해준다.
# 공인 IP 설정 및 부여
resource "ncloud_public_ip" "test" { # 빈 깡통으로 넣어주기만 해도 공인 IP는 생성
server_instance_no = ncloud_server.server.instance_no
}
그러나 resource 를 이용해 사용되는 리소스를 생성하기는 하지만 가져다 쓰기 위한 내용이 아니기 때문에 바로 적용되지 않는 에러가 나게 된다. 이를 해결하기위해 값을 가져다 쓸 수 있게 하는 output 을 이용해 값을 재사용할 수 있게 하자.
# 공인 IP 를 서버에서 가져오기
output "server_ip" {
value = ncloud_server.server.public_ip
}
# 공인 IP 를 생성하면서 가져오기
output "public_ip" {
value = ncloud_public_ip.test.public_ip
}
terraform plan
terraform apply
Init script
기존 ncp 서버에서는 init script 를 이용하여 서버가 생성되면 특정 유저를 과정내에서 생성하여 ssh 접속을 편하게 했었다.
# init script
#!/bin/bash
USERNAME="lion"
PASSWORD="****************"
REMOTE_DIRECTORY="/home/$USERNAME/"
echo "Add user"
useradd -s /bin/bash -d $REMOTE_DIRECTORY -m $USERNAME
echo "Set password"
echo "$USERNAME:$PASSWORD" | chpasswd
echo "Set sudo"
usermod -aG sudo $USERNAME
echo "$USERNAME ALL=(ALL:ALL) NOPASSWD: ALL" >> /etc/sudoers.d/$USERNAME
echo "Update apt and Install docker & docker-compose"
sudo apt-get update
sudo apt install -y docker.io docker-compose
echo "Start docker"
sudo service docker start && sudo service docker enable
echo "Add user to 'docker' group"
sudo usermod -aG docker $USERNAME
echo "done"
이 부분 역시 테라폼에서 리소스로 해결이 가능하다.
서버에 대한 내용은 이미 존재하기 떄문에 넘어가고 init 에 집중해서 코드를 구현한다.
resource "ncloud_init_script" "init" {
name = "set-docker-tf"
content = <<EOT
#!/bin/bash
USERNAME="lion"
PASSWORD="****************"
REMOTE_DIRECTORY="/home/$USERNAME/"
echo "Add user"
useradd -s /bin/bash -d $REMOTE_DIRECTORY -m $USERNAME
echo "Set password"
echo "$USERNAME:$PASSWORD" | chpasswd
echo "Set sudo"
usermod -aG sudo $USERNAME
echo "$USERNAME ALL=(ALL:ALL) NOPASSWD: ALL" >> /etc/sudoers.d/$USERNAME
echo "Update apt and Install docker & docker-compose"
sudo apt-get update
sudo apt install -y docker.io docker-compose
echo "Start docker"
sudo service docker start && sudo service docker enable
echo "Add user to 'docker' group"
sudo usermod -aG docker $USERNAME
echo "done"
EOT
} # 인덴트가 진짜 중요하니까 꼭 맞춰서 넣기!
resource "ncloud_server" "server" {
...
...
...
init_script_no = ncloud_init_script.init.init_script_no
}
DB instance
NCP 를 통해서 인스턴스를 2개 띄워서 서버로 하나, DB 로 하나를 사용했다. terraform 으로도 2개의 인스턴스를 띄워서 활용할 수 있도록 해보자
NCP 에서도 그랬지만 VPC 나 init script 등은 공유하고, 인스턴스나 공유 IP 등은 따로따로 관리 헀다. 같은 원리로 코드를 추가해보자
# DB instance 생성
resource "ncloud_server" "db" {
subnet_no = ncloud_subnet.main.id
name = "db-staging"
server_image_product_code = "SW.VSVR.OS.LNX64.UBNTU.SVR2004.B050"
server_product_code = data.ncloud_server_products.products.server_products[0].product_code # 서버스펙 설정
login_key_name = ncloud_login_key.loginkey.key_name
init_script_no = ncloud_init_script.init.init_script_no
}
# 공인 아이피 설정 및 부여
resource "ncloud_public_ip" "db" { # db 용
server_instance_no = ncloud_server.db.instance_no
description = "public IP for db server"
}
# 공인 IP 를 생성하면서 가져오기
output "db_public_ip" {
value = ncloud_public_ip.db.public_ip
}
'Dev. > Terraform' 카테고리의 다른 글
Terraform: Modules (0) | 2023.09.05 |
---|---|
Terraform: LoadBalancer (0) | 2023.09.05 |
Terraform: AWS - VPC 생성 (0) | 2023.09.04 |
Terraform: 설치와 기본정보 (0) | 2023.09.01 |
Terraform: IaC (0) | 2023.09.01 |
댓글