[Terraform] 테라폼 공부하기 #2. 기본 문법

ChuYong·2023년 5월 29일
0
post-thumbnail

테라폼의 기본 문법을 살펴볼게요
우선 테라폼은 HCL이라는 언어를 사용하는데요,
이름이 멋있어서 유래를 찾아보니 HashiCorp Lang... (테라폼 만든 회사 이름이 HashiCorp임..)

암튼 뭐 결국 JSON,YAML같이 어떤 오브젝트를 잘 쌓아둘 수 있는 언어 느낌인것같아요.
기본 형태는 다음과 같데요. (이 아래 형태의 모양을 블록 이라고 하기로 했어요)

[type] "label1" "label2"... {
	some_other_codes..
}

그니까 label의 개수는 늘어날수도 0개일수도 있는거에요. (앞에 타입에 따라서)

예를 들어서 대표적인 타입 resource 의 경우, 첫번째 label로 리소스의 타입, 두번째 label로 리소스의 이름 인데요,
여기서 오해할만한게 두번째 label의 "리소스의 이름"은 실제 그 AWS 인프라 내부에서 Attribute로 달려있는 이름이 아니라,
이 테라폼 내부적으로 리소스를 구분짓기 위한 이름이에요.

그래서 aws_vpc를 main_vpc 이렇게 이름지어도 사실 그 vpc 이름은 랜덤한..(aws가 생성해준) 값이 들어갈 수 있는거죠

항상 다양한 언어를 하면 먼저 고민하는게 네이밍 컨벤션인데요.
우선 문서상으로는 테라폼은 snakecase 라고해요! 글자 사이사이에 밑줄 긋는거.. (파이썬에서 쓰는 컨벤션!)

그리고 주석은 #, //, /* ~~ */ 이렇게 국룰 주석 3개가 가능하다고 해용

블럭 안에 들어가는걸 좀 살펴볼게요.

resource "aws_instance" "cchuyong-ec2" {
	ami = "my_custom_ami"
    network_interface {
    	... [더 많은 코드]
    }
}

JSON/YAML좀 만져보셨으면 사실 모양이 달라서 그렇지 구조 자체는 쉽게 이해할 수 있을거에요.
일단 위에서 보면, 블록 안에 블록이 들어갈 수도 있고, 블록 자체의 오브젝트에 대한 Attribute도 설정이 가능한걸 볼 수 있어요.

예를 들어서 aws_instance 라는 타입에 resource 블록 attribute에는 ami라는 속성이 있는거고, 뿐만 아니라 network_interface라는 또하나의 타입에 대한 블록을 집어넣을수도 있는거같아요.

한편 제가 지금 인텔리제이로 테스트하고 있을때 Terraform 플러그인을 설치하니까 저기 들어갈 수 있는 Attribute를 추천도 해주네요!

일단 지금까지 살펴본 바로는, 제가 추측했던 하나의 이론은 깨진것 같아요.
저는 리소스의 종속성대로 몬가 짤 수 있을거라 생각했거든여. 예를 들어서, EC2가 하나 있으면, 결국 걔는 어느VPC안에 어느 서브넷에 있을테니까,, 대충 (이 아래는 제가 상상했던 모습이에요 작동하는 코드가 아님!!!)

resource "aws_vpc" "main_vpc" {
	resource "aws_subnet" "public_subnet" {
    	availabilty_zone = "ap-northeast-2a"
        resource "aws_instance" "my_public_ec2" {
        	ami = "my_custom_ami"
        }
    }
}

이런식으로 짤 수 있는건가!? 를 기대하긴 했는데,,,ㅠㅠ
모 아무튼 조금 더 공부를 해보아요~

profile
백엔드 & 인프라 를 좋아하는 개발자에요

0개의 댓글