논리적으로 분리된 아래와 같은 구조에서 다른 폴더에서 생성한 리소들에 대한 정보를 변수로 저장해서 사용하기.
.
├── alb
│ ├── data.tf
│ ├── main.tf
│ ├── variables.tf
│ └── versions.tf
├── backend
│ ├── main.tf
│ ├── variables.tf
│ └── versions.tf
├── eks
│ ├── main.tf
│ ├── node_group.tf
│ ├── outputs.tf
│ ├── variables.tf
│ └── versions.tf
└── service
├── main.tf
├── variables.tf
└── versions.tf
tfstate 파일 저장용 s3 버킷이 이미 생성되어 있으며 상태 저장을 remote로 사용하고 있어야 한다.
그러고 있다면, versions.tf 파일에는 backend를 s3로 아래와 같이 지정되어 있을 것이다.
terraform {
required_version = "1.3.7"
required_providers {
kubectl = {
source = "gavinbunney/kubectl"
version = "1.14.0"
}
}
backend "s3" {
bucket = "aimmo-mlops-terraform-backend"
key = "eks/terraform.tfstate"
region = "ap-northeast-2"
dynamodb_table = "terraform-backend-lock"
encrypt = true
}
}
변수로 저장하여 사용하고 싶은 디렉토리에서 아래와 같이 내보내고 싶은 변수들을 지정해준다. 리소스를 반드시 output 지시자를 통해 state 파일의 output 섹션에 기록될 수 있도록 해야 한다.
output "region" {
value = var.region
}
output "vpc_id" {
value = module.vpc.vpc_id
}
output "subnet_ids" {
value = module.vpc.public_subnets
}
output "cpu_node_instance_id" {
value = module.cpu_node_group.instance_id
}
그 후, refresh를 해줘야 함
terraform refresh
변수가 remote state 파일에 저장되며 콘솔에서도 확인할 수 있다.

아까와는 다른 폴더인 변수를 최종적으로 사용하고자 하는 폴더에서는 output이 아닌 data 변수를 만들어준다. config는 위에서 변수를 저장할 때 사용한 backend state 파일 저장 경로를 지정한다.
data "terraform_remote_state" "eks" {
backend = "s3"
config = {
bucket = "aimmo-mlops-terraform-backend"
key = "eks/terraform.tfstate"
region = "ap-northeast-2"
dynamodb_table = "terraform-backend-lock"
encrypt = true
}
}
그리고 여기에서도 한번 refresh를 해줌