Stack 간 데이터 전달하기

Stack 간 데이터 전달하기 (Pass data from one Stack to another)

프로비저닝 생명주기를 공유하지 않는 여러 Stacks가 있다면, Stacks를 서로 연결해서 한 Stack의 데이터를 다른 Stack이 소비하도록 내보낼 수 있어요. Stack의 출력 값이 실행 후 변경되면 HCP Terraform은 그 출력에 의존하는 모든 Stacks의 실행을 자동으로 트리거해요.

출처: 문서

본문

배경 (Background)

프로젝트의 서로 다른 Stacks 간에 데이터를 전달해야 할 수 있어요. 예를 들어 조직의 한 Stack은 네트워킹 인프라 같은 공유 서비스를 관리하고, 다른 Stack은 애플리케이션 컴포넌트를 관리할 수 있어요. 별도의 Stacks를 사용하면 인프라를 독립적으로 관리할 수 있지만, 네트워킹 Stack과 애플리케이션 Stack 간에 데이터를 공유해야 할 수는 있어요.

Stack에서 정보를 출력하려면, 데이터를 내보내는 Stack의 배포 구성에서 publish_output 블록을 선언해요. publish_output 블록을 선언하는 Stack을 업스트림(upstream) Stack이라고 해요.

업스트림 Stack이 내보낸 데이터를 소비하려면, 같은 프로젝트의 다른 Stack의 배포 구성에서 upstream_input 블록을 선언해요. upstream_input 블록을 선언하는 Stack을 다운스트림(downstream) Stack이라고 해요.

요구사항과 제한 (Requirements and limitations)

다운스트림 Stacks는 자신의 업스트림 Stacks와 같은 프로젝트에 있어야 해요.

Stack 간 데이터 전달에는 다음 제한이 적용돼요.

  • Stacks는 최대 20개의 다른 업스트림 Stacks에 연결할 수 있어요.
  • Stacks는 최대 25개의 다운스트림 Stacks에 값을 노출할 수 있어요.

다른 Stack에 출력 노출하기 (Expose outputs to another Stack)

컴포넌트 구성에서 output 블록을 선언해서 Stack의 값을 HCP Terraform UI에 노출할 수 있어요.

# components.tfcomponent.hcl
output "vpc_id" {
  description = "The VPC ID of the networking Stack"
  type        = string
  value       = component.vpc.vpc_id
}

component "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  version = "~> 5.0"

  # ...
}

배포 구성의 publish_output 블록은 output 값을 같은 프로젝트의 다른 Stacks에서 사용할 수 있게 해줘요. 현재 Stack에서 노출하려는 각 값에 대해 배포 구성에서 publish_output 블록을 선언해야 해요.

다음 예제는 network 배포의 vpc_id 출력 값을 vpc_id_network로 노출하는 publish_output 블록을 정의해요.

# network.tfdeploy.hcl
publish_output "vpc_id_network" {
  description = "The networking Stack's VPC's ID."
  value       = deployment.network.vpc_id
}

deployment "network" {
  # ...
}

배포의 출력 값을 deployment.<DEPLOYMENT_NAME>.<OUTPUT_NAME> 문법으로 참조할 수 있어요. 구성을 적용한 뒤에는 같은 프로젝트의 어떤 Stack이든 upstream_input 블록을 선언해 네트워크 배포의 vpc_id_network 출력을 참조할 수 있어요.

publish_output 블록을 포함하는 컴포넌트 구성 버전을 적용하면 HCP Terraform이 그 값들의 스냅샷을 게시해서, HCP Terraform이 그것들을 해석할 수 있게 돼요. 다운스트림 Stacks가 Stack의 게시된 출력을 참조하려면 먼저 Stack의 배포 구성을 적용해야 해요.

publish_output 블록에 대해 더 알아보세요.

업스트림 Stack의 출력 소비하기 (Consume the output from an upstream Stack)

다른 Stack의 publish_output 블록에서 값을 읽으려면 Stack의 배포 구성에 upstream_input 블록을 선언해요. upstream_input 블록을 추가하면 업스트림 Stack에 대한 의존성이 생겨요.

예를 들어 같은 프로젝트의 업스트림 Stack에서 vpc_id_network 출력을 사용하고 싶다면, 배포 구성에 upstream_input 블록을 선언해요.

# application.tfdeploy.hcl
# Application Stack deployment configuration

upstream_input "network_stack" {
  type   = "stack"
  source = "app.terraform.io/hashicorp/Default Project/networking-stack"
}

deployment "application" {
  inputs = {
    vpc_id = upstream_input.network_stack.vpc_id_network
  }
}

Stack의 구성을 HCP Terraform에 push하면, HCP Terraform은 구성이 참조하는 업스트림 Stack의 가장 최근에 게시된 스냅샷을 검색해요. 스냅샷이 없으면 다운스트림 Stack의 실행은 실패해요.

HCP Terraform이 참조한 업스트림 Stack에 대한 게시된 스냅샷을 찾으면, 그 Stack의 모든 출력이 이 다운스트림 Stack에 사용 가능해져요. 참조하려는 업스트림 Stack마다 upstream_input 블록을 추가하세요. upstream_input 블록에 대해 더 알아보세요.

출력 값 변경 시 실행 트리거 (Trigger runs when output values change)

업스트림 Stack의 게시된 출력 값이 변경되면, HCP Terraform은 그 출력에 의존하는 다운스트림 Stacks의 실행을 자동으로 트리거해요.

다음 예제에서 application 배포는 업스트림 네트워킹 Stack에 의존해요.

# application.tfdeploy.hcl
# Application Stack deployment configuration

upstream_input "network_stack" {
  type   = "stack"
  source = "app.terraform.io/hashicorp/Default Project/networking-stack"
}

deployment "application" {
  inputs = {
    vpc_id = upstream_input.network_stack.vpc_id_network
  }
}

애플리케이션 Stack은 네트워킹 Stack의 출력에 의존하므로, vpc_id_network가 변경되면 HCP Terraform이 애플리케이션 Stack에 대한 새 실행을 트리거해요. 이 접근 방식은 생명주기가 분리된 Stacks를 디커플링(decouple)할 수 있게 해주고, 업스트림 Stack의 갱신이 다운스트림 Stacks로 전파되도록 보장해요.

업스트림 Stack 의존성 제거하기 (Remove upstream Stack dependencies)

업스트림 Stack의 출력에 의존하는 것을 멈추려면 다운스트림 Stack의 배포 구성에서 다음을 수행해요.

  1. 업스트림 Stack의 upstream_input 블록을 제거해요.
  2. 업스트림 Stack의 출력에 대한 모든 참조를 제거해요.
  3. 구성 변경 사항을 HCP Terraform에 push하고 새 구성을 적용해요.

더 알아보기 (Learn more)