본문 바로가기

IaC/Terraform

[Terraform]다른 워크스페이스의 정보 가져오기 - terraform_remote_state 사용법

개요: terraform_remote_state

terraform_remote_state를 사용하면, 하나의 테라폼 워크스페이스에서 다른 워크스페이스의 상태(state) 정보를 읽어올 수 있습니다.

이 기능은 한 워크스페이스의 결과값(outputs)을 다른 워크스페이스의 입력값(inputs)으로 사용할 수 있기 때문에 여러 워크스페이스로 인프라를 나눠 관리할 때 유용합니다.

terraform_remote_state를 통한 워크스페이스 관리

1. terraform_remote_state의 위치

terraform_remote_state는 테라폼 내에서 data source block 안에 위치해 사용됩니다. 이는 다른 워크스페이스의 상태 정보를 현재 워크스페이스에서 참조하기 위한 설정입니다.

2. 단일 워크스페이스와 멀티 워크스페이스의 차이

단일 워크스페이스에서는 전체 인프라를 한 곳에서 관리하기 때문에, 특별한 의존성 관리나 추가 설정이 필요 없습니다. 모든 리소스와 설정이 한 곳에서 이루어지기 때문에 간편하게 관리할 수 있습니다.

그러나 멀티 워크스페이스를 사용하여 인프라를 나눠서 관리하게 되면 상황이 달라집니다. 각 워크스페이스는 특정 부분의 인프라를 담당하게 되며, 때로는 이 워크스페이스들 사이에 의존성이 발생할 수 있습니다.

예를 들어, network 워크스페이스에서 생성한 네트워크 설정이 ec2-instance 워크스페이스에서 필요할 수 있습니다. 이런 경우, network 워크스페이스의 결과값(outputs)을 ec2-instance 워크스페이스의 입력값(inputs)으로 사용해야 합니다.

3. 의존성 해결의 핵심: outputs

이러한 워크스페이스간 의존성 문제는 outputs를 활용해 해결할 수 있습니다. 특정 워크스페이스에서 생성된 결과값을 outputs로 지정하면, terraform_remote_state를 통해 다른 워크스페이스에서 이 값을 참조하여 사용할 수 있습니다. 이 방식을 통해 간편하게 여러 워크스페이스 간의 의존성을 관리할 수 있습니다.

실습

예를 들어, 네트워크 설정을 관리하는 network workspace EC2 인스턴스를 관리하는 ec2-instance workspace가 있다고 가정합니다.

구조는 아래와 같습니다.

├── ec2-instance
│   └── main.tf
└── network
    ├── main.tf
    └── terraform.tfvars

ec2-instnace workspace가 network workspace와 의존 관계에 있습니다.

network workspace

network workspace에서 네트워크 정보를 세팅하고, 그 결과값을 ec2-instance workspace에서 EC2 인스턴스를 생성할 때 사용하려 합니다.

terraform apply and outputs

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

Outputs:

subnet_groups = {
# 중략
        "id" = "subnet-06c0ad435882b392a"
# 중략
}
vpc_cidr = "10.0.0.0/16"
vpc_id = "vpc-0db8a127bb474817e"
vpc_name = "remote-state"

ec2 workspace 워크스페이스에서 가져오는 방법

main.tf

provider "aws" {
  region = "ap-northeast-2"
}

# data source를 이용하여 terraform_remote_state로 ec2 workspace에서 참조합니다.
data "terraform_remote_state" "network" {
  backend = "local"

  config = {
    path = "${path.module}/../network/terraform.tfstate"
  }
}

locals {
  vpc_name      = data.terraform_remote_state.network.outputs.vpc_name
  subnet_groups = data.terraform_remote_state.network.outputs.subnet_groups
}

# 중략
resource "aws_instance" "ubuntu" {
  ami           = data.aws_ami.ubuntu.image_id
  instance_type = "t2.micro"
  subnet_id     = local.subnet_groups["public"].ids[0]

  tags = {
    Name = "${local.vpc_name}-ubuntu"
  }
}

위의 코드를 통해, network workspace의 상태 파일(terraform.tfstate)을 참조하게 되고, 그 결과값(outputs)을 현재 workspace(ec2)에서 사용할 수 있게 됩니다.

terraform.tfstate

data source를 이용하여 terraform_remote_state로 ec2 workspace에서 참조합니다.

data "terraform_remote_state"
- backend = "local" 를 사용하여 network/terraform.tfstate 를 가져 왔습니다.

locals
- 모듈의 속성을 ref하는 것과 같은 방식으로 outputs에 지정된 내용을 가져왔습니다.

resource "aws_instance"
- remote_state에서 가져온 `subnet_groups`, `vpc_name`을 참조한다.

terraform apply and outputs

subnet_id와 tags의 prefix가 network workspace의 outputs 값으로 설정된 것을 확인할 수 있습니다.

+ source_dest_check                    = true
      + subnet_id                            = "subnet-06c0ad435882b392a"
      + tags                                 = {
          + "Name" = "remote-state-ubuntu"
        }
      + tags_all                             = {
          + "Name" = "remote-state-ubuntu"
        }

결론

테라폼의 terraform_remote_state 기능을 사용하면, 다른 워크스페이스의 정보를 손쉽게 가져와 현재 워크스페이스에서 활용할 수 있습니다.

이는 여러 워크스페이스에서의 의존성 관리에 아주 유용하게 쓰입니다.

멀티 워크스페이스 구조에서는 워크스페이스간 의존성 관리가 중요합니다. terraform_remote_stateoutputs를 적절히 활용하면, 각 워크스페이스에서 생성된 정보를 다른 워크스페이스에서 손쉽게 활용할 수 있습니다.

이를 통해 여러 워크스페이스에서의 의존성 관리를 효율적으로 할 수 있습니다.