젯브레인 IDE로 쾌적한 테라폼 코딩 환경 구축
들어가며
테라폼Terraform은 클라우드 시대에 각광받고 있는 인프라스트럭처 관리 도구입니다. 인기 만큼 여러 에디터들이 테라폼을 지원하고 있는데요. 이 글에서는 인텔리J IDEAIntelliJ IDEA의 강력한 테라폼 지원 기능을 소개합니다. 여기서는 무료로 사용할 수 있는 인텔리J 커뮤니티 버전으로 설명하지만, 다른 젯브레인JetBrains 에디터에서도 사용할 수 있습니다.
테라폼 플러그인 설치하고 파일 준비하기
메뉴에서 IntelliJ IDEA -> Preferences
를 누른 후, 왼쪽 트리에서 Plugins
를 선택하고 검색 창에 terraform
을 입력하면 Hashicorp Terraform...
플러그인이 나타납니다. install
버튼을 누르고,
다음 화면에서 Accept
를 선택하고 인텔리J를 재시작하면 테라폼 플러그인을 사용할 수 있습니다.
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
파일을 열고 다음과 같이 입력해봅니다.
또한 variable
같은 테라폼 키워드들도 자동 완성을 지원합니다.
현재까지 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
가 나타납니다.
선언하지 않은 변수를 사용하려고 하면 어떻게 될까요? cidr_blocks
에 존재하지 않는 변수를 적으면 다음과 같이 빨간색 글씨로 오류 부분을 알려줍니다.
아직까지는 선언한 변수와 리소스가 많지 않지만, 인프라스트럭처의 규모가 커지면 내가 선언한 변수와 리소스 이름을 다른 곳에서 참조하기가 어렵습니다. 그럴 때 이러한 자동완성과 참조 오류 힌트 덕에, 파일 여닫기 작업을 줄일 수 있습니다.
- 필수 변수를 선언하지 않았을 때(리소스 외에 모듈에 선언된 필수 변수도 지원합니다)
- 선언하지 않은 변수를 사용하려고 할 때
- 이후 버전에서 사라질 예정인(deprecated) 프로퍼티를 사용했을 때
현재까지 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
키를 누른 채 7행이나 12행의 ${var.public_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}"
}
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
키를 누릅니다.
새로 정하려는 이름으로 public_cidrs
를 입력하고 Preview
버튼을 클릭합니다.
화면 아래쪽에서 어떤 파일의 어느 부분이 바뀌는지 확인할 수 있습니다. 모두 확인했다면 Do Refactor
버튼을 클릭합니다. (바꾸고 싶지 않은 부분을 클릭하고 Delete
키나 Cmd + X
키를 누르면, 해당 부분만 제외됩니다.)
public_cidr_blocks
가 모두 public_cidrs
로 바뀌었습니다. 단순한 문자열 찾아 바꾸기 기능이었다면 not_public_cidr_blocks
도 not_public_cidrs
로 바뀌었겠지만, 인텔리J의 Rename 기능은 정확히 원하는 이름만 찾아 바꿔줍니다.
이 외에 중복되는 ["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가 테라폼 사용자의 필수 에디터로 자리 잡기에 충분하리라 생각합니다.