젯브레인 IDE로 쾌적한 테라폼 코딩 환경 구축
들어가며
테라폼Terraform은 클라우드 시대에 각광받고 있는 인프라스트럭처 관리 도구입니다. 인기 만큼 여러 에디터들이 테라폼을 지원하고 있는데요. 이 글에서는 인텔리J IDEAIntelliJ IDEA의 강력한 테라폼 지원 기능을 소개합니다. 여기서는 무료로 사용할 수 있는 인텔리J 커뮤니티 버전으로 설명하지만, 다른 젯브레인JetBrains 에디터에서도 사용할 수 있습니다.
테라폼 플러그인 설치하고 파일 준비하기
메뉴에서 IntelliJ IDEA -> Preferences
를 누른 후, 왼쪽 트리에서 Plugins
를 선택하고 검색 창에 terraform
을 입력하면 Hashicorp Terraform...
플러그인이 나타납니다. install
버튼을 누르고,
![](https://d2uleea4buiacg.cloudfront.net/files/af6/af6216f495a08a355b3881e62010afaf6a8d5d4390e07b73c49ec39f68b15ceb.m.png)
다음 화면에서 Accept
를 선택하고 인텔리J를 재시작하면 테라폼 플러그인을 사용할 수 있습니다.
![](https://d2uleea4buiacg.cloudfront.net/files/ef6/ef6350a56ea947c3fe679b6c161b2c93b0bf8aa8cb069c469fd159f3cf741026.m.png)
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
파일을 열고 다음과 같이 입력해봅니다.
![](https://d2uleea4buiacg.cloudfront.net/files/aa0/aa0d74f76969898474869fbcd4d5f4501abc528318d3c03a290ed3ab8ced3947.m.png)
또한 variable
같은 테라폼 키워드들도 자동 완성을 지원합니다.
![](https://d2uleea4buiacg.cloudfront.net/files/ab4/ab4de37c77973c90433d5001032c8832698d428f7dfb6f22cbc03f301e26ca59.m.png)
현재까지 main.tf
의 내용은 다음과 같습니다.
variable "public_cidr_blocks" {
type = "list"
default = ["0.0.0.0/0"]
}
resource "aws_vpc" "this" {
}
참조 오류 힌트
테라폼의 리소스 중에는 특정 변수를 반드시 선언해야만 하는 리소스들도 있습니다.
방금 추가한 aws_vpc
리소스에서는 cidr_blocks
변수를 반드시 정의해야 합니다. 인텔리J에서는 필수 변수를 선언하지 않은 리소스에 노란색 하이라이트를 표시해줍니다.
![](https://d2uleea4buiacg.cloudfront.net/files/1fa/1fa12ee17175cca67743129dc691d93954753389bb258d02ad84ea598e93644f.m.png)
cidr_blocks
을 다음과 같이 작성합니다.
...
resource "aws_vpc" "this" {
cidr_block = "${var.public_cidr_blocks}"
}
var.
까지 입력해보면 인텔리J가 현재 사용할 수 있는 변수 목록을 보여줍니다. 여기서는 public_cidr_blocks
가 나타납니다.
![](https://d2uleea4buiacg.cloudfront.net/files/2fc/2fc4f282300db1dabed40ef768ca8135be1f71c04b0ef3bda7bd3d81e92f345d.m.png)
선언하지 않은 변수를 사용하려고 하면 어떻게 될까요? cidr_blocks
에 존재하지 않는 변수를 적으면 다음과 같이 빨간색 글씨로 오류 부분을 알려줍니다.
![](https://d2uleea4buiacg.cloudfront.net/files/bc6/bc6398006a78280c1aa14ad5c7b39ae2a413c948425e40ad1d9f05b3fd54617d.m.png)
아직까지는 선언한 변수와 리소스가 많지 않지만, 인프라스트럭처의 규모가 커지면 내가 선언한 변수와 리소스 이름을 다른 곳에서 참조하기가 어렵습니다. 그럴 때 이러한 자동완성과 참조 오류 힌트 덕에, 파일 여닫기 작업을 줄일 수 있습니다.
- 필수 변수를 선언하지 않았을 때(리소스 외에 모듈에 선언된 필수 변수도 지원합니다)
- 선언하지 않은 변수를 사용하려고 할 때
- 이후 버전에서 사라질 예정인(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
를 클릭하면 이 변수를 사용하는 위치의 목록을 확인할 수 있습니다.
![](https://d2uleea4buiacg.cloudfront.net/files/097/097a05f49edd45850fef55ee9313a09fab410c4e9bc8e9cc8ba7e1fbafecfaec.m.png)
반대로 Cmd
키를 누른 채 7행이나 12행의 ${var.public_cidr_blocks}
부분에 마우스 커서를 올리면 선언된 위치가 툴팁 형태로 나타납니다. 클릭을 하면 (당연하게도) 선언 위치로 이동하고요.
![](https://d2uleea4buiacg.cloudfront.net/files/93f/93f9c2d9689265eb0804969bcc863360980bcdc5b2bce367c3abb64b51f7eb54.m.png)
현재까지 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
키를 누릅니다.
![](https://d2uleea4buiacg.cloudfront.net/files/296/29649f8ebf42a32cb372b6037d2c71fff6653501375dda548235dcc253c7e5c3.m.png)
새로 정하려는 이름으로 public_cidrs
를 입력하고 Preview
버튼을 클릭합니다.
![](https://d2uleea4buiacg.cloudfront.net/files/3eb/3eb00d1f5473b1645f75f936c96a6c2540f67616a2de4383db27c33d9708116a.m.png)
화면 아래쪽에서 어떤 파일의 어느 부분이 바뀌는지 확인할 수 있습니다. 모두 확인했다면 Do Refactor
버튼을 클릭합니다. (바꾸고 싶지 않은 부분을 클릭하고 Delete
키나 Cmd + X
키를 누르면, 해당 부분만 제외됩니다.)
![](https://d2uleea4buiacg.cloudfront.net/files/2e1/2e11cea04dd4fd98d628f6886041959e8651264ac70acfa1e71a0038538cc43b.m.png)
public_cidr_blocks
가 모두 public_cidrs
로 바뀌었습니다. 단순한 문자열 찾아 바꾸기 기능이었다면 not_public_cidr_blocks
도 not_public_cidrs
로 바뀌었겠지만, 인텔리J의 Rename 기능은 정확히 원하는 이름만 찾아 바꿔줍니다.
![](https://d2uleea4buiacg.cloudfront.net/files/e76/e760322d8cb9126f3d89da739bd1ef190c900231a015b53d03f03e47fef85531.m.png)
이 외에 중복되는 ["0.0.0.0/0"]
같은 값을 변수화하는 등의 리팩터링 기능도 지원합니다.
코드 하이라이팅
지금까지 내용을 따라오셨다면 HCL 문법 하이라이팅이 잘 되고 있음도 확인하셨겠죠?
포매팅
테라폼에서 제공하는 terraform fmt
명령으로 들여쓰기나 정렬 방식을 맞출 수 있지만, 에디터와 콘솔을 오가기가 조금 불편한 것은 사실입니다. 인텔리J에서는 테라폼 포매팅을 제공합니다.
aws_vpc.other
리소스에 count = 1
을 추가해봅시다.
![](https://d2uleea4buiacg.cloudfront.net/files/56e/56e33ace696bf2a6a4c7ce573307157ce7ec897fe50cb1f8afac9772e926ec45.m.png)
이제 Shift + Alt + Cmd + F
키를 누르면 포매팅이 적용됩니다. (메뉴에서 Code -> Terraform Tools -> Terraform fmt file
을 선택해도 됩니다.)
![](https://d2uleea4buiacg.cloudfront.net/files/473/473044a5f78c829a95c0d9cf2dabcee1c7e010e046738c542aef2ea4a208b4c4.m.png)
현재 파일의 구조 보기(파일이 커졌을 때 유용할 듯)
하나의 테라폼 파일을 길게 관리하는 습관이 있다면 전체 구조를 파악하기가 조금 어려웠을 겁니다. 이를 위해 인텔리J에서는 파일 구조 뷰를 제공합니다.
Cmd + 7
키를 누르면 다음과 같이 파일 구조 뷰가 나타납니다.
![](https://d2uleea4buiacg.cloudfront.net/files/e71/e71916aff20c6b44a309716b0d37748875d2e3b36ca85e16bcda86ae1d1fa581.m.png)
추가 예정 기능들
이후 버전에서는 변수의 타입 확인이나 모듈 의존성 같은 기능들도 추가된다고 하니, 당분간은 인텔리J가 테라폼 사용자의 필수 에디터로 자리 잡기에 충분하리라 생각합니다.