목표

논리적으로 분리된 아래와 같은 구조에서 다른 폴더에서 생성한 리소들에 대한 정보를 변수로 저장해서 사용하기.

.
├── 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
  }
}

참고

Terraform의 remote_state 활용하기

디렉토리에서 output 생성

변수로 저장하여 사용하고 싶은 디렉토리에서 아래와 같이 내보내고 싶은 변수들을 지정해준다. 리소스를 반드시 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 파일에 저장되며 콘솔에서도 확인할 수 있다.

Untitled

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를 해줌