[Infra] 테라폼 폴더 구조, block 쓰임새 (resource, data, output, variable, .tfvars)

나른한 개발자·2023년 3월 13일
1

이전 포스팅 👉 테라폼이란?

파일 구성

테라폼에서는 resource, data, output, variable와 같은 블럭들로 코드를 작성할 수 있는데, 보통 파일마다 한가지 블록만 작성되게끔 구분하는 것이 일반적이다. 작은 프로젝트의 경우 한 파일에 합쳐서 작성할 수도 있겠지만 확장성과 가독성을 위해 분리하는 것이 더 낫다. 아래는 요소별로 파일을 분리할 경우의 파일 구성 트리를 나타낸 것이다. 아래와 같은 구성을 리소스 별 디렉터리에 묶어 둘 수 있다.

.
├── main.tf
├── variables.tf
├── outputs.tf
├── <resource_name>.tf
└── data.tf

main.tf 는 일반적인 의미와 같이 apply명령어를 실행시켰을때 가장 먼저 실행되는 파일이다. 각각 파일은 어떤 의미이며 어떻게 활용할 수 있는지 살펴보도록 하자.


blocks

resource

프로바이더가 제공하는 자원의 타입이다. 예를 들어 aws의 경우 aws_vpc 라는 타입을 제공하고 이를 이용해 vpc 리소스를 생성하고 조작하는 것이 가능하다.

resource "aws_vpc" "vpc" {
    cidr_block = "10.0.0.0/32"
    tags = { Name = "my-vpc" }
}

variable

varable을 이용하여 변수를 정의할 수 있다. 아래와 같이 타입과, 디폴트 값을 지정하면 된다. type에는 string, number, bool, list, map, set, tuple, object 가 있다.

# 예시 1
variable "env" {
	type = string
    default = "dev"
}

# 예시 2
variable "env" {}

종종 예제 코드를 보면 예시 2번처럼 괄호 안이 비어있는 것을 볼 수 있을 것이다. 이렇게 변수 정의 시 괄호 안에 default 값을 적어주지 않으면 terraform plan, terraform apply 같은 명령어 실행 시 변수 명령어를 입력받는다.

var.environment
  Enter a value: 

테라폼 코드도 git과 같은 vcs로 관리하기 때문에 외부에 노출되면 안되는 예민한 정보들을 관리할 때 이런 방법을 쓴다. 하지만 명령어를 실행시킬 때마다 변수를 일일이 작성하는 것은 성가신 일이다. 이런 경우에는 .tfvars를 사용할 수 있는데, 이는 밑에서 더 설명하도록 하겠다.

output

output은 어떤 값을 내보낼 것이냐에 대한 정의를 할때 사용된다. 예를 들어 위에서 정의한 vpc의 리소스 id를 출력을 해야한다고 할 때, 아래처럼 정의할 수 있다.

output "vpc_id" {
    value = aws_vpc.vpc.id
}

이렇게 output을 정의해주면 terraform apply 실행 시 아래처럼 지정값이 출력된다.

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Outputs:

vpc_id = vpc-01234bbcb1234

output은 단순히 쉘에서 출력 값을 확인하기 위한 용도보다는 다른 디렉터리에서 특정 값을 참조할 수 있도록 하는 목적에 더 가깝다.

data

프로바이더에서 제공하는 리소스 정보를 가져와 테라폼에서 사용할 수 있는 상태로 맵핑시킬 수 있다. 즉, 클라우드 콘솔에 이미 존재하는 리소스를 가져오는 것이다.

data "aws_iam_policy" "policy" {
    arn = "arn:aws:iam::aws:policy/abc/abc"
}

위 처럼 작성하면, aws의 iam policy 중 arn이 arn:aws:iam::aws:policy/abc/abc 인 것을 가져오게 된다. 꼭 arn이 아니더라도 filter를 사용하여 가져오고자 하는 리소스를 검색할 수 있다.

data "aws_ami" "web" {
  filter {
    name   = "state"
    values = ["available"]
  }
  most_recent = true
}

.tfvars

.tfvars에는 db 비밀번호와 같이 예민한 변수 값을 관리할 때 사용할 수 있다. .tfvars에 변수를 정의할 때는 variable 블록도 함께 정의해주어야 변수에 접근할 수 있다. 해당 파일은 버전 관리 툴에 추적되지 않도록 주의해야 한다.

# .tfvars
rds_password = "manager22"

# variables.tf
variable {}

# rds.tf
resource "aws_db_instance" "db" {
	...
    password = var.rds_password
    ...
}

마치며

위에서 output블록이 리소스 참조를 위해 사용된다고 언급한 바가 있는데, 다음 시간에는 output과 data를 사용해서 서로 다른 디렉터리에서 정의된 리소스를 접근하는 방법을 알아보도록 하겠다.

다음 포스팅 👉 output, data 블록의 활용 (terraform.tfstate 파일 관리법, 리소스 참조)

profile
Start fast to fail fast

0개의 댓글