두 개의 VM 인스턴스를 각각 다른 이미지로 복제후 오토스케일링 설정하는 Terraform 코드

네이버클라우드 플랫폼(NCP)에서 VPC를 생성하고, 두 개의 VM 인스턴스를 각각 다른 이미지로 생성하며, 하나의 인스턴스에 오토스케일링 설정하는 Terraform 코드를 제공해드리겠습니다. NCP의 경우 AWS와는 리소스 이름 및 설정이 다르기 때문에 이를 반영한 코드를 작성해야 합니다.

1. variables.tf

VPC 이름, 이미지 ID, 인스턴스 유형, 최소 및 최대 오토스케일링 인스턴스 수를 변수로 정의합니다.

hcl코드 복사<code>variable "vpc_name" {
  description = "Name of the VPC"
  type        = string
}

variable "image_a_id" {
  description = "Image ID for EC2A instance"
  type        = string
}

variable "image_b_id" {
  description = "Image ID for EC2B instance"
  type        = string
}

variable "instance_type" {
  description = "Instance type"
  type        = string
  default     = "n2.micro"
}

variable "min_size" {
  description = "Minimum number of EC2A instances in Auto Scaling"
  type        = number
  default     = 1
}

variable "max_size" {
  description = "Maximum number of EC2A instances in Auto Scaling"
  type        = number
  default     = 3
}
</code>

2. main.tf

NCP VPC, 서브넷, 보안 그룹, 인스턴스, 그리고 오토스케일링 그룹을 설정하는 주요 리소스를 정의합니다.

hcl코드 복사<code>provider "ncloud" {
  region = "KR"  # 원하는 리전을 지정하세요 (KR: Korea, JP: Japan, SG: Singapore)
}

resource "ncloud_vpc" "my_vpc" {
  vpc_name   = var.vpc_name
  ipv4_cidr  = "10.0.0.0/16"
}

resource "ncloud_subnet" "my_subnet" {
  vpc_no         = ncloud_vpc.my_vpc.vpc_no
  ipv4_cidr      = "10.0.1.0/24"
  subnet_name    = "${var.vpc_name}-subnet"
  zone           = "KR-1"  # 원하는 Zone을 지정하세요.
}

resource "ncloud_access_control_group" "allow_ssh" {
  name            = "${var.vpc_name}-sg"
  description     = "Security group for SSH access"
  vpc_no          = ncloud_vpc.my_vpc.vpc_no

  inbound {
    protocol   = "TCP"
    source_cidr_block = "0.0.0.0/0"
    port_range {
      from = 22
      to   = 22
    }
  }

  outbound {
    protocol   = "ALL"
    target_cidr_block = "0.0.0.0/0"
  }
}

# EC2B 인스턴스 생성
resource "ncloud_server" "ec2b" {
  name                   = "${var.vpc_name}-ec2b"
  vpc_no                 = ncloud_vpc.my_vpc.vpc_no
  subnet_no              = ncloud_subnet.my_subnet.subnet_no
  member_server_image_no = var.image_b_id
  server_product_code    = var.instance_type
  access_control_group_configuration_no_list = [ncloud_access_control_group.allow_ssh.access_control_group_no]
}

# EC2A 인스턴스를 위한 Launch Configuration
resource "ncloud_launch_configuration" "ec2a_config" {
  name                         = "${var.vpc_name}-ec2a-config"
  server_product_code          = var.instance_type
  member_server_image_no       = var.image_a_id
  access_control_group_configuration_no_list = [ncloud_access_control_group.allow_ssh.access_control_group_no]
}

# EC2A 오토스케일링 그룹 설정
resource "ncloud_auto_scaling_group" "ec2a_asg" {
  name                          = "${var.vpc_name}-ec2a-asg"
  min_size                      = var.min_size
  max_size                      = var.max_size
  desired_capacity              = var.min_size
  launch_configuration_no       = ncloud_launch_configuration.ec2a_config.launch_configuration_no
  zone                          = "KR-1"  # 원하는 Zone을 지정하세요.
  vpc_no                        = ncloud_vpc.my_vpc.vpc_no
  subnet_no_list                = [ncloud_subnet.my_subnet.subnet_no]
}

resource "ncloud_auto_scaling_policy" "scale_up" {
  name                          = "${var.vpc_name}-scale-up"
  adjustment_type               = "CHANGE_IN_CAPACITY"
  scaling_adjustment            = 1
  cooldown                      = 300
  auto_scaling_group_no         = ncloud_auto_scaling_group.ec2a_asg.auto_scaling_group_no
}

resource "ncloud_auto_scaling_policy" "scale_down" {
  name                          = "${var.vpc_name}-scale-down"
  adjustment_type               = "CHANGE_IN_CAPACITY"
  scaling_adjustment            = -1
  cooldown                      = 300
  auto_scaling_group_no         = ncloud_auto_scaling_group.ec2a_asg.auto_scaling_group_no
}
</code>

3. outputs.tf

생성된 리소스들의 정보를 출력합니다.

hcl코드 복사<code>output "vpc_no" {
  description = "The ID of the VPC"
  value       = ncloud_vpc.my_vpc.vpc_no
}

output "subnet_no" {
  description = "The ID of the Subnet"
  value       = ncloud_subnet.my_subnet.subnet_no
}

output "ec2b_server_instance_no" {
  description = "The ID of the EC2B instance"
  value       = ncloud_server.ec2b.server_instance_no
}

output "ec2a_asg_name" {
  description = "The name of the Auto Scaling Group for EC2A"
  value       = ncloud_auto_scaling_group.ec2a_asg.name
}
</code>

4. terraform.tfvars

변수값을 설정하는 파일입니다.

hcl코드 복사<code>vpc_name      = "my-custom-vpc"
image_a_id    = "6101334008"  # EC2A의 이미지 ID
image_b_id    = "6101334009"  # EC2B의 이미지 ID
instance_type = "n2.micro"
min_size      = 1
max_size      = 3
</code>

사용 방법

  1. 위의 코드 파일들을 각각 해당 이름으로 저장합니다.
  2. 터미널에서 해당 디렉토리로 이동하여 Terraform 초기화 및 적용을 실행합니다.
sh 코드 복사<code>terraform init
terraform apply
</code>
  1. 생성된 리소스들의 ID와 정보가 terraform apply 실행 후 출력됩니다.

이 코드는 네이버클라우드 플랫폼의 환경에 맞게 작성되었습니다. 사용 시 필요한 이미지 ID와 리소스 이름 등을 환경에 맞게 조정해 사용하시면 됩니다.

Leave a Reply

Your email address will not be published. Required fields are marked *