Terraform Backend
Terraform의 state file을 어디에 저장을 하고, 가져올지에 대한 설정이며 기본적으로는는 로컬 스토리지에 저장을 하지만, 설정에 따라서 s3, consul, etcd 등 다양한 “Backend type“을 사용할 수 있습니다.
Terraform Backend 를 사용하는 이유?
- Locking: 보통 Terraform 코드를 혼자 작성하지 않기에 인프라를 변경한다는 것은 굉장히 민감한 작업이 될 수 있다. 원격 저장소를 사용함으로써 동시에 같은 state를 접근하는 것을 막아 의도치 않은 변경을 방지할 수 있다.
- Backup: 로컬 스토리지에 저장한다는건 유실할 수 있다는 가능성이 있으며 S3와 같은 원격저장소를 사용함으로써 state 파일의 유실을 방지할 수 있다.
Backend 예시

Terraform variables
Terraform 은 HCL Syntax를 가진 언어이며 언어적 특성을 가지고 있기 때문에 당연히 변수를 정의하고 주입해서 사용할 수 있다.
변수 정의하기
변수의 정의는 .tf 파일 어느 곳에서나 정의는 가능하나 보통 variables.tf 파일을 만들어 해당 파일에 정의한다.

변수에 값 주입하기
정의한 변수에 값을 주입하기 위해 가장 일반적인 방법은 terraform.tfvars 파일을 생성하는 것이며Variable = Value 형태로 정의한다.

이런 식으로도 쓸 수 있다.

terraform.tfvars 가 아닌 다른 방법으로는 module block 에 주입하는 방법도 있다.
Terraform Output
Terraform은 입력 변수 이외에 출력 변수도 설정해서 원하는 값을 출력할 수 있으며 variable로 입력 변수를 컨트롤하고, output으로 출력 변수를 컨트롤 한다고 생각하면 이해하기 쉬울 것이다.
Terraform Output의 기본 형식
ouput "NAME" {
value = VALUE
}
예시
provider "aws" {
region = "us-east-1"
access_key = "IAM Access Key 입력"
secret_key = "IAM Secret Access Key 입력"
}
resource "aws_instance" "example" {
ami = "ami-40d28157"
instance_type = "t2.micro"
tags = {
Name = "cloudest"
}
}
output "instance_ip_addr" {
value = aws_instance.example.private_ip
}
output "Instance_pubip_addr" {
value = aws_instance.example.public_ip
}
위 코드는 버지니아 북부 리전 Default VPC에 EC2를 생성하는 간단한 Terraform 코드다.
그 후, terraform apply 결과화면에 리소스 add, change, dstroy 말고도 Outputs 값이 함께 출력된다.

또한, terraform.tfstate 파일에서도 확인할 수 있다.

Terraform modules
Module은 한개 or 여러개의 .tf 또는 .tf.json 파일들로 구성되어 있으며, module 에 따라 한개 또는 여러개의 resource 들을 포함한다.
module 내의 파일들은 한개의 directory 에 모두 위치하며 module 은 쉽게 생각하면 일종의 library 라고 할 수 있을 것 같다.
여러 기능들을 포함하고 있는 library 를 만들어서 사용하는 곳에서 원하는 기능들을 사용하듯이, 여러 resource 들을 포함하고 있는 module 을 만들어서 원하는 곳에서 원하는 resource 들을 생성하거나, 필요한 정보를 가져올 수도 있다.
module 은 크게 두가지로 나눌 수 있다.
- Root module - Terraform command 를 수행하는 directory 에 있는 파일들로 구성된 module 을 Root module 이라고 한다.
- Child module - 다른 module (Root module 포함) 에서 호출하여 사용되는 module 을 Child module 이라고 한다.
Child module 은 여러번 호출되어 사용될 수 있고 module 에 따라 다른 configuration 값을 전달하여 사용할 수도 있다.
Module 예제

또한 깃허브에서 모듈을 가져와 사용할 수 있으며 s3등도 가능하다.

Terraform remote
Terraform을 통해서 만든 인프라 구성 요소를 다른 모듈 혹은 다른 파일에서 참조할 수 있게 하는 기능이며 state의 저장된 output에 저장된 값을 불러와 사용한다.
같은 파일 혹은 같은 디렉토리 내에 TF 코드가 있으면 TF 코드들은 각각의 리소스를 참고할 수 있지만, 아예 다른 디렉토리에서 새로 만들어진 TF코드는 다른 폴더에 있는 TF코드의 리소스를 참조할 수 없다. 이럴 때 output을 통해 state에 저장한다. 그 후 아래 그림과 같이 data.terrform_remote_state까진 똑같고 data 지시자에 의해 지정된 remote_state 이름과 해당 state 파일에 기록된 output 섹션 안에 저장된 필드이름이다.


그럼 서로 다른 tf파일이어도 state에 있는 리소스를 참고할 수 있다.
'TIL' 카테고리의 다른 글
| 53일차 컨테이너 오케스트레이션 (0) | 2022.07.01 |
|---|---|
| 52일차 컨테이너 오케스트레이션 (0) | 2022.06.30 |
| 50~51일차 Infrastructure as Code 실습 (0) | 2022.06.28 |
| 49일차 Infrastructure as Code (0) | 2022.06.24 |
| 47~48일차 마이크로서비스 작성 (0) | 2022.06.23 |