Canvas 1 Layer 1

테라폼을 가장 잘 지원하는 에디터는?
젯브레인 인텔리J를 활용한 테라폼 코드 작성

들어가며

테라폼Terraform은 클라우드 시대에 각광받고 있는 인프라스트럭처 관리 도구입니다. 인기 만큼 여러 에디터들이 테라폼을 지원하고 있는데요. 이 글에서는 인텔리J IDEAIntelliJ IDEA의 강력한 테라폼 지원 기능을 소개합니다. 여기서는 무료로 사용할 수 있는 인텔리J 커뮤니티 버전으로 설명하지만, 다른 젯브레인JetBrains 에디터에서도 사용할 수 있습니다.

테라폼 플러그인 설치하고 파일 준비하기

메뉴에서 IntelliJ IDEA -> Preferences를 누른 후, 왼쪽 트리에서 Plugins를 선택하고 검색 창에 terraform을 입력하면 Hashicorp Terraform... 플러그인이 나타납니다. install 버튼을 누르고,

terraform으로 검색하면 Hashicorp Terraform 플러그인이 나타납니다
terraform으로 검색하면 Hashicorp Terraform 플러그인이 나타납니다

다음 화면에서 Accept를 선택하고 인텔리J를 재시작하면 테라폼 플러그인을 사용할 수 있습니다.

이 플러그인을 사용하고 싶으니까 Accept 버튼을 누릅니다
이 플러그인을 사용하고 싶으니까 Accept 버튼을 누릅니다

terraform_best_editor 폴더를 만들고, terraform_best_editor/terraform.tf 파일을 다음과 같이 생성합니다.

provider "aws" {
  version = "~> 1.56"
}

terraform_best_editor/main.tf 파일은 다음과 같습니다.

resource "aws_vpc" "this" {
}

이제 terraform_best_editor 폴더를 인텔리J에서 엽니다.

자동 완성

테라폼을 처음 마주하면 수많은 리소스 종류와 각 리소스에 선언해야 하는 변수들의 다양함에 기가 죽기 마련인데요. 이름의 일부만 알고 있다면 나머지는 인텔리J가 도와줍니다. main.tf 파일을 열고 다음과 같이 입력해봅니다.

aws_vpc와 관련된 리소스들
aws_vpc와 관련된 리소스들

또한 variable 같은 테라폼 키워드들도 자동 완성을 지원합니다.

var까지만 입력해도 나머지는 인텔리J가 도와줍니다
var까지만 입력해도 나머지는 인텔리J가 도와줍니다

현재까지 main.tf의 내용은 다음과 같습니다.

variable "public_cidr_blocks" {
  type = "list"
  default = ["0.0.0.0/0"]
}

resource "aws_vpc" "this" {

}

참조 오류 힌트

테라폼의 리소스 중에는 특정 변수를 반드시 선언해야만 하는 리소스들도 있습니다.

방금 추가한 aws_vpc 리소스에서는 cidr_blocks 변수를 반드시 정의해야 합니다. 인텔리J에서는 필수 변수를 선언하지 않은 리소스에 노란색 하이라이트를 표시해줍니다.

필수 변수를 선언하지 않으면 노란색 하이라이트가 표시됩니다
필수 변수를 선언하지 않으면 노란색 하이라이트가 표시됩니다

cidr_blocks을 다음과 같이 작성합니다.

...
resource "aws_vpc" "this" {
  cidr_block = "${var.public_cidr_blocks}"
}

var.까지 입력해보면 인텔리J가 현재 사용할 수 있는 변수 목록을 보여줍니다. 여기서는 public_cidr_blocks가 나타납니다.

variable 자동 완성 기능
variable 자동 완성 기능

선언하지 않은 변수를 사용하려고 하면 어떻게 될까요? cidr_blocks에 존재하지 않는 변수를 적으면 다음과 같이 빨간색 글씨로 오류 부분을 알려줍니다.

선언하지 않은 변수를 사용하려고 하면 빨간 글씨로 알려줍니다
선언하지 않은 변수를 사용하려고 하면 빨간 글씨로 알려줍니다

아직까지는 선언한 변수와 리소스가 많지 않지만, 인프라스트럭처의 규모가 커지면 내가 선언한 변수와 리소스 이름을 다른 곳에서 참조하기가 어렵습니다. 그럴 때 이러한 자동완성과 참조 오류 힌트 덕에, 파일 여닫기 작업을 줄일 수 있습니다.

현재까지 main.tf 파일의 내용은 다음과 같습니다.

variable "public_cidr_blocks" {
  type = "list"
  default = ["0.0.0.0/0"]
}

resource "aws_vpc" "this" {
  cidr_block = "${var.public_cidr_blocks}"
}

참조 따라가기

선언한 변수와 리소스가 많아지고 테라폼 파일이 여러 개로 나뉘다보면, 이 변수를 어디에서 사용하는지 혹은 이 변수가 어디에 선언되어 있는지 찾기가 어렵습니다. 인텔리J는 변수 선언부를 찾거나 변수 참조 위치를 찾는 기능을 지원합니다.

예시를 위해 main.tf에 다음 내용을 추가합니다.

resource "aws_vpc" "other" {
  cidr_block = "${var.public_cidr_blocks}"
}

그리고 Cmd 키를 누른 채 1행의 public_cidr_blocks를 클릭하면 이 변수를 사용하는 위치의 목록을 확인할 수 있습니다.

Cmd 키를 누른 채 변수 이름을 클릭하면 참조 위치 목록을 볼 수 있습니다
Cmd 키를 누른 채 변수 이름을 클릭하면 참조 위치 목록을 볼 수 있습니다

반대로 Cmd 키를 누른 채 7행이나 12행의 ${var.public_cidr_blocks} 부분에 마우스 커서를 올리면 선언된 위치가 툴팁 형태로 나타납니다. 클릭을 하면 (당연하게도) 선언 위치로 이동하고요.

Cmd 키를 누른 채 참조한 변수 위에 커서를 올리면 선언 위치를 확인할 수 있습니다
Cmd 키를 누른 채 참조한 변수 위에 커서를 올리면 선언 위치를 확인할 수 있습니다

현재까지 main.tf 파일의 내용입니다.

variable "public_cidr_blocks" {
  type = "list"
  default = ["0.0.0.0/0"]
}

resource "aws_vpc" "this" {
  cidr_block = "${var.public_cidr_blocks}"
}

resource "aws_vpc" "other" {
  cidr_block = "${var.public_cidr_blocks}"
}

이름 일괄 바꾸기

변수나 리소스의 이름을 바꾸고 싶은데 관련된 내용들을 모두 찾기가 어려워 난감한 경우가 있었을 겁니다. 인텔리J에 기본으로 탑재된 리팩터링 기능을 사용하면 간단히 해결할 수 있습니다.

이 기능이 일반적인 찾기/바꾸기와 다르다는 점을 보이기 위해 main.tf 파일 제일 위에 not_public_cidr_blocks 변수를 하나 추가해보겠습니다.

variable "not_public_cidr_blocks" {
  type = "list"
  default = ["0.0.0.0/0"]
}
...

이제 public_cidr_blocks가 적힌 세 부분 중 아무데서나 마우스 오른쪽 버튼을 클릭하거나 Shift + F6 키를 누릅니다.

이름 바꾸기(Rename) 기능
이름 바꾸기(Rename) 기능

새로 정하려는 이름으로 public_cidrs를 입력하고 Preview 버튼을 클릭합니다.

새 변수명을 입력합니다
새 변수명을 입력합니다

화면 아래쪽에서 어떤 파일의 어느 부분이 바뀌는지 확인할 수 있습니다. 모두 확인했다면 Do Refactor 버튼을 클릭합니다. (바꾸고 싶지 않은 부분을 클릭하고 Delete 키나 Cmd + X 키를 누르면, 해당 부분만 제외됩니다.)

바꾸고 싶지 않은 위치는 제외할 수도 있습니다
바꾸고 싶지 않은 위치는 제외할 수도 있습니다

public_cidr_blocks가 모두 public_cidrs로 바뀌었습니다. 단순한 문자열 찾아 바꾸기 기능이었다면 not_public_cidr_blocksnot_public_cidrs로 바뀌었겠지만, 인텔리J의 Rename 기능은 정확히 원하는 이름만 찾아 바꿔줍니다.

not_public_cidr_blocks은 바뀌지 않았습니다
not_public_cidr_blocks은 바뀌지 않았습니다

이 외에 중복되는 ["0.0.0.0/0"] 같은 값을 변수화하는 등의 리팩터링 기능도 지원합니다.

코드 하이라이팅

지금까지 내용을 따라오셨다면 HCL 문법 하이라이팅이 잘 되고 있음도 확인하셨겠죠?

포매팅

테라폼에서 제공하는 terraform fmt 명령으로 들여쓰기나 정렬 방식을 맞출 수 있지만, 에디터와 콘솔을 오가기가 조금 불편한 것은 사실입니다. 인텔리J에서는 테라폼 포매팅을 제공합니다.

aws_vpc.other 리소스에 count = 1을 추가해봅시다.

파일 포매팅이 맞지 않는 상황
파일 포매팅이 맞지 않는 상황

이제 Shift + Alt + Cmd + F 키를 누르면 포매팅이 적용됩니다. (메뉴에서 Code -> Terraform Tools -> Terraform fmt file을 선택해도 됩니다.)

포매팅이 수정된 모습
포매팅이 수정된 모습

현재 파일의 구조 보기(파일이 커졌을 때 유용할 듯)

하나의 테라폼 파일을 길게 관리하는 습관이 있다면 전체 구조를 파악하기가 조금 어려웠을 겁니다. 이를 위해 인텔리J에서는 파일 구조 뷰를 제공합니다.

Cmd + 7 키를 누르면 다음과 같이 파일 구조 뷰가 나타납니다.

파일 구조 뷰에서 파일 전체 구조를 파악하기가 쉽습니다
파일 구조 뷰에서 파일 전체 구조를 파악하기가 쉽습니다

추가 예정 기능들

이후 버전에서는 변수의 타입 확인이나 모듈 의존성 같은 기능들도 추가된다고 하니, 당분간은 인텔리J가 테라폼 사용자의 필수 에디터로 자리 잡기에 충분하리라 생각합니다.