Skip to main content

Terraform으로 가상머신과 공인 IP 생성하기

ECI Terraform 프로바이더란?

ECI(Elice Cloud Infrastructure)는 AI 워크로드에 특화된 IaaS 클라우드 플랫폼입니다.

ECI Terraform 프로바이더를 사용하면 Terraform을 통해 ECI의 인프라 자원들을 코드로 관리할 수 있습니다.

이를 통해 가상 네트워크, 서브넷, 가상 머신, 스토리지 등 ECI 리소스를 Terraform으로 생성∙변경하고 추적할 수 있습니다.

다시 말해, ECI 프로바이더는 Terraform과 Elice Cloud의 API를 연결해 Infrastructure as Code(IaC)를 가능하게 해주는 플러그인입니다.

Terraform 기본 워크플로우

Terraform 설정 파일(.tf)을 작성하고 프로바이더 및 리소스를 정의했다면, 아래 단계로 인프라를 생성합니다.

  1. 초기화 (terraform init)

    • 필요한 프로바이더 다운로드 및 초기 설정 수행
    • 완료되면 .terraform 디렉터리가 생성되고 프로바이더가 준비됩니다.
  2. 계획 확인 (terraform plan)

    • 적용될 변경사항을 미리 확인
    • 생성/변경될 리소스 목록과 내용이 출력되어, 설정 오류/의도치 않은 변경을 사전에 점검할 수 있습니다.
  3. 적용 (terraform apply)

    • 실제로 변경사항을 적용
    • 최종 확인을 위해 "yes" 입력을 요구하며, 승인 후 리소스 생성/수정이 진행됩니다.
    • 작업 완료 후 Terraform은 상태 파일에 리소스 정보를 저장합니다.

본 문서에서는 공인 IP가 붙은 VM을 생성하는 방법에 대해 안내합니다.

0. 사전 준비

다음의 값들을 ECI 포털에서 미리 준비합니다.

  • zone_id (UUID)
    • "인프라 - 영역" ID 항목에서 확인할 수 있습니다.
  • api_access_token (API Key/Token) api_access_token
    • "구성원 관리 - 사용자 액세스 토큰"에서 생성할 수 있습니다.
  • VM 생성에 사용할 instance_type_id (포털에서 선택한 VM 이미지/스펙에 해당)
    • "인프라 - 인스턴스 유형"에서 확인할 수 있습니다.

ECI Provider는 api_endpoint, api_access_token, zone_id필수입니다.

1. Terraform 설치

로컬 PC 또는 CI 서버(GitLab Runner / GitHub Actions / Jenkins 등)에 Terraform CLI를 설치합니다. HashiCorp 공식 설치 가이드를 참고하세요.

설치 확인:

terraform --version

2. terraform init로 프로바이더 설치/초기화

1) 작업 디렉터리(프로젝트 폴더) 생성

Terraform 구성 파일들은 하나의 작업 디렉터리(폴더) 안에서 함께 동작합니다. 먼저 ECI Terraform을 실행할 폴더를 생성하고 해당 폴더로 이동합니다.

mkdir basic-example
cd basic-example

2) .tf 파일 생성 및 required_providers 작성

required_providers 블록은 작업 디렉터리 내의 임의의 .tf 파일에 작성할 수 있습니다.

예시) main.tf

terraform {
required_providers {
eci = {
source = "elice-dev/eci"
}
}
}

📌 참고: Terraform은 작업 디렉터리 내에 존재하는 모든 .tf 파일을 하나의 구성으로 합쳐서 처리합니다. 따라서 main.tf, provider.tf, network.tf 등으로 파일을 나누어 관리해도 정상적으로 동작합니다.

3) 초기화 및 프로바이더 설치 진행

terraform init

terraform init은 작업 디렉터리를 초기화하고 필요한 프로바이더 플러그인을 설치합니다.

성공 시, 다음과 같은 화면이 나타납니다.

3. “공인 IP가 붙은 VM”을 만드는 .tf 작성

실습 파일 구조

eci-public-vm/
main.tf
outputs.tf

main.tf

아래 예시는 다음 리소스를 순서대로 만듭니다.

  1. eci_virtual_machine
  2. eci_virtual_machine_allocation
  3. eci_block_storage
  4. eci_virtual_network
  5. eci_subnet
  6. eci_network_interface
  7. eci_public_ip

모든 지원되는 모든 리소스를 확인하고 싶다면 ECI Terraform Registry 문서의 ResourcesData Sources를 확인해주세요.

terraform {
required_providers {
eci = {
source = "elice-dev/eci"
}
}
}

provider "eci" {
api_endpoint = "https://portal.elice.cloud/api"
api_access_token = ""
zone_id=""
}

data "eci_block_storage_image" "ubuntu2204" {
name="Ubuntu 22.04 LTS (20250116)"
}

data "eci_instance_type" "test_instance_type" {
name="M-8"
}

resource "eci_virtual_machine" "my_virtual_machine" {
name="terraform-test-vm-1"
instance_type_id=data.eci_instance_type.test_instance_type.id
always_on=false
username="elice"
password="secretpassword1!"
on_init_script=""
dr=false
tags = {
"created-by": "terraform"
}
}

resource "eci_virtual_machine_allocation" "my_vm_allocation" {
machine_id =eci_virtual_machine.my_virtual_machine.id
tags = {
"created-by": "terraform"
}
depends_on = [
eci_block_storage.my_block_storage,
eci_network_interface.my_network_interface,
]
}

resource "eci_block_storage" "my_block_storage" {
attached_machine_id=eci_virtual_machine.my_virtual_machine.id
name="terraform-test-1"
dr=false
size_gib=40
image_id=data.eci_block_storage_image.ubuntu2204.id
tags = {
"created-by": "terraform"
}
}

resource "eci_virtual_network" "my_virtual_network" {
name="terraform-test-virtual-network_ii"
network_cidr="192.168.0.0/16"
firewall_rules= [
{
"proto": "ALL",
"source": "0.0.0.0/0",
"destination": "0.0.0.0/0",
"port": 0,
"port_end": 65535,
"action": "ACCEPT",
"comment": "sample network rule"
}
]
tags = {
"created-by": "terraform"
}
}

resource "eci_subnet" "my_subnet" {
name="terraform-test-subnet-1"
attached_network_id=eci_virtual_network.my_virtual_network.id
purpose="virtual_machine"
network_gw="192.168.0.1/24"
tags = {
"created-by": "terraform"
}
}

resource "eci_network_interface" "my_network_interface" {
attached_subnet_id=eci_subnet.my_subnet.id
attached_machine_id=eci_virtual_machine.my_virtual_machine.id
name="terraform-network-interace-1"
dr=false
tags = {
"created-by": "terraform"
}
}


resource "eci_public_ip" "my_public_ip" {
attached_network_interface_id=(
eci_network_interface.my_network_interface.id
)
dr=false
tags = {
"created-by": "terraform"
}
}

outputs.tf

output "instance_ip_addr" {
value = "${eci_network_interface.my_network_interface.ip}"
description = "The private IP address of the virtual machine"
}

output "instance_mac_addr" {
value = "${eci_network_interface.my_network_interface.mac}"
description = "The MAC address of the virtual machine"
}

output "block_storage_image_name" {
value = "${data.eci_block_storage_image.ubuntu2204.name}"
}

output "instance_public_ip_addr" {
value = "${eci_public_ip.my_public_ip.ip}"
description = "The public IP address of the virtual machine"
}

4. terraform plan으로 변경사항 미리 확인

terraform plan

plan은 실제 적용 전 “무엇이 생성/수정/삭제될지” 실행 계획을 보여줍니다. 실행 시 아래와 같은 화면이 나타납니다.

5. terraform apply로 생성

terraform apply

apply는 plan에 따라 실제 API 호출로 리소스를 생성합니다. 필요한 값들을 모두 입력하면, 다음과 같은 화면이 나타나고 'yes'를 입력하면 리소스를 생성하기 시작합니다.

6. “공인 IP가 붙은 VM” 생성 확인

Terraform 출력(terraform output) 또는

ECI 포털에서 VM / NIC / Public IP 연결 상태 확인합니다.

7. 테스트 리소스 삭제 (terraform destroy)

terraform destroy

terraform destroy는 현재 구성/상태로 생성된 리소스를 정리합니다. 'yes'를 입력하고 나면 다음과 같은 화면이 나타나며 리소스가 삭제됩니다.

추가 정보

  • 만약 CI 서버에서 실행하는 경우, CI Secret에 아래 형태로 넣으면 코드에 토큰/비밀번호를 직접 넣지 않아도 됩니다.

    • TF_VAR_eci_api_access_token
    • TF_VAR_vm_password
    • TF_VAR_eci_zone_id
    • TF_VAR_instance_type_id
  • 소스 코드 및 Github : ECI Terraform 프로바이더의 소스 코드는 GitHub 저장소에 공개되어 있습니다. 버그 수정을 위한 이슈 제기나 소스 수준의 이해가 필요하다면 GitHub 저장소를 방문해 보세요. 또한 릴리스 노트와 변경 사항 역시 GitHub를 통해 확인할 수 있습니다.