`output` 블록 참조

output 블록 참조 (output block reference)

output 블록을 사용해 인프라에 대한 정보를 노출할 수 있어요. 실습: Terraform에서 데이터 출력 튜토리얼을 따라 해 보세요. 이 페이지에서는 output 블록의 구성 모델과 지원 인자를 다룰게요.

출처: 문서

본문

output 블록을 사용해 인프라에 대한 정보를 노출할 수 있어요.

실습: Terraform에서 데이터 출력 튜토리얼을 따라 해 보세요.

배경 (Background)

output 블록의 값은 다른 프로그래밍 언어의 반환 값과 비슷해요. output 블록은 명령줄, HCP Terraform, 그리고 구 구성의 상태에 접근할 수 있는 다른 Terraform 구성에서 참조할 수 있는 인프라에 대한 정보를 노출해요. output 블록은 Terraform에서 네 가지 주요 목적을 담당해요:

  • 자식 모듈이 리소스 속성을 부모 모듈에 노출할 수 있어요.
  • 루트 모듈이 CLI 출력에서 값을 표시할 수 있어요.
  • 원격 상태를 사용하는 다른 Terraform 구성이 terraform_remote_state 데이터 소스로 루트 모듈 출력에 접근할 수 있어요.
  • Terraform 작업에서 자동화 도구로 정보를 전달해요.

HCP Terraform에서는 Terraform이 구성의 구성을 적용한 후 output 블록 값이 UI에 나타나요. UI와 API 응답에서 값을 숨기도록 HCP Terraform에서 출력을 민감으로 표시할 수 있어요.

output 블록 사용에 대해 더 알아보려면 출력을 사용해 모듈 데이터 노출을 참고해요.

구성 모델 (Configuration model)

output 블록은 다음 인자를 지원해요:

  • output "<NAME>" 블록
    • type 타입 제약
    • value
    • description 문자열
    • sensitive 불리언
    • ephemeral 불리언
    • depends_on 참조 리스트
    • deprecated 문자열
    • precondition 블록
      • condition
      • error_message 문자열

완전한 구성 (Complete configuration)

사용 가능한 모든 인자는 다음 output 블록에 정의돼 있어요. output 블록에는 상호 배타적인 인자가 없어요.

output "<NAME>" {
  type        = <TYPE>
  value       = <VALUE>
  description = "<DESCRIPTION>"
  sensitive   = <BOOL>
  ephemeral   = <BOOL>
  depends_on  = [ <RESOURCE> ]
  deprecated  = "<MESSAGE>"

  precondition {
    condition     = <CONDITION>
    error_message = "<MESSAGE>"
  }
}

사양 (Specification)

output 블록은 다음 구성을 지원해요.

output "<NAME>"

output 블록을 선언할 때는 Terraform의 리소스 명명 규칙을 따라요.

output 블록에서 다음 인자가 지원돼요:

인자 설명 타입 필수?
type 이 출력의 값에 대한 타입 제약을 지정해요. 타입 제약 선택
value Terraform이 이 출력에 대해 반환하는 값이에요. 필수
description 출력의 목적과 사용 방법에 대한 설명이에요. 문자열 선택
sensitive Terraform이 이 값을 CLI 출력에서 숨기는지 지정해요. 불리언 선택
ephemeral 이 값을 상태에 저장하지 않도록 방지할지 지정해요. 불리언 선택
depends_on 이 출력에 대한 명시적 의존성의 리스트예요. 리스트 선택
deprecated 출력에 대한 폐기 메시지예요. 자식 모듈에서만 유효해요. 문자열 선택
precondition 출력을 계산하거나 상태에 저장하기 전에 검증할 조건이에요. 블록 선택

type

output 블록의 type 인자는 그 출력에 할당할 수 있는 값의 타입을 제약해요. 타입 제약을 설정하지 않으면 출력은 모든 타입의 값을 받아요.

output "unique_name" {
  type  = <TYPE>
  value = <VALUE>
}

타입 제약을 정의하면 모듈 소비자가 모듈이 어떤 타입의 데이터를 생성하는지 이해하는 데 도움이 돼요. 모듈의 모든 출력 값에 타입을 추가하면 검증, plan, apply 작업 사이의 더 나은 일치가 가능해요.

출력 블록에서 유효한 기본 타입, 복합 타입, 구조적 타입을 제약으로 사용할 수 있어요. 타입, 생성자, 변환에 대한 자세한 내용은 타입 제약을 참고해요.

value

output 블록에 value 인자를 포함해야 해요. Terraform은 value 인자의 식을 평가하고 그 결과를 출력의 반환 값으로 노출하며 그 값을 상태에 저장해요.

output "unique_name" {
  value = <VALUE>
}

유효한 식이라면 무엇이든 출력 value가 될 수 있어요. 더 알아보려면 을 참고해요.

요약 (Summary)

  • 데이터 타입: 식
  • 기본값: 없음
  • 필수: 예

description

output 블록의 description 인자를 사용해 이 출력의 목적, 요구 사항, 그리고 이 출력이 내보내는 값의 종류를 설명해요.

output "instance_ip_addr" {
  value       = <VALUE>
  description = "<DESCRIPTION>"
}

모듈 소비자의 관점에서 설명을 작성해 소비자가 출력이 왜 존재하는지와 어떻게 사용하는지 이해하도록 도울 것을 권장해요.

요약 (Summary)

  • 데이터 타입: 문자열
  • 기본값: 없음

sensitive

output 블록에 sensitive 인자를 추가해 Terraform 작업의 CLI 출력에서 그 블록의 값을 숨겨요.

output "admin_password" {
  value     = <VALUE>
  sensitive = <BOOL>
}

sensitive 인자를 true로 설정하면 Terraform은 plan 및 apply 작업에서 그 출력 값을 검열해요:

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

Outputs:

admin_password = (sensitive value)

terraform output 명령-json 또는 -raw 명령줄 플래그와 함께 사용하면 Terraform은 sensitive 값을 평문으로 표시해요.

Terraform은 또한 민감한 값을 상태에 기록하므로, 상태 데이터에 접근할 수 있는 사람은 민감한 값에 접근할 수 있어요. 민감한 데이터를 안전하게 저장하는 방법에 대한 자세한 내용은 민감한 데이터 관리를 참고해요.

요약 (Summary)

  • 데이터 타입: 불리언
  • 기본값: false

ephemeral

참고: 임시 출력은 Terraform v1.10 이상에서 사용할 수 있어요.

자식 모듈의 output 블록에 ephemeral 인자를 추가해 상태나 plan 파일에 그 데이터를 지속시키지 않고 모듈 사이에 데이터를 전달해요. 루트 모듈의 output 블록에는 ephemeral 인자를 추가할 수 없어요.

output "unique_password" {
  value     = <VALUE>
  ephemeral = <BOOL>
}

자식 모듈과 루트 모듈 사이에 출력 값을 전달하는 것은 상태에 저장하고 싶지 않은 자격 증명, 토큰 및 기타 임시 값을 관리하는 데 유용해요. output 블록에서 ephemeral 인자를 활성화하면 구성은 다음 조건을 충족해야 해요:

  • output 블록의 값은 임시 맥락에서 와야 해요.
  • 그 출력을 다른 임시 맥락에서만 참조할 수 있어요.

다음 임시 맥락은 ephemeral 인자가 있는 출력 블록의 값을 설정할 수 있고, ephemeral 인자가 있는 출력 블록도 참조할 수 있어요:

요약 (Summary)

  • 데이터 타입: 불리언
  • 기본값: false

depends_on

depends_on 인자는 output 블록에 대한 다른 업스트림 리소스에 대한 명시적 의존성을 지정해요. Terraform은 그에 의존하는 output 블록의 값을 계산하기 전에 업스트림 리소스에 대한 모든 작업을 완료해요.

output "unique_name" {
  value      = <VALUE>
  depends_on = [ <RESOURCE> ]
}

depends_on은 메타-인자예요. 메타-인자는 Terraform 언어에 내장되어 리소스를 어떻게 생성할지 제어해요. 이 인자가 어떻게 동작하는지에 대한 자세한 내용은 depends_on 참조를 참고해요.

요약 (Summary)

  • 데이터 타입: 리스트
  • 기본값: 없음

deprecated

참고: 폐기된 출력은 Terraform v1.15 이상에서 사용할 수 있어요.

deprecated 인자는 출력이 폐기된 이유를 지정해요. Terraform은 다른 모듈이 출력을 사용할 때 이 이유를 표시해요.

output 블록에 deprecated 인자는 자식 모듈에서만 추가할 수 있으며 루트 모듈에서는 추가할 수 없어요.

output "old_name" {
  value      = <VALUE>
  deprecated = "Please use 'new_name' instead."
}

output "new_name" {
  value = <VALUE>
}

Terraform은 출력을 정의하는 모듈 안에서는 폐기 경고를 표시하지 않아요. 모듈 소비자만 경고를 봐요. 모듈 호출에 대한 중첩 폐기 경고를 억제하려면 module 블록에서 ignore_nested_deprecations 인자를 설정해요.

요약 (Summary)

  • 데이터 타입: 문자열
  • 기본값: 없음

precondition

precondition 블록을 사용하면 output 블록의 값이 특정 요구 사항을 충족하는지 검증할 수 있어요. Terraform이 출력을 노출하거나 그 값을 상태에 저장하기 전에 출력 값이 요구 사항을 충족하는지 검증하려면 출력에 precondition을 사용해요.

output "unique_name" {
  value  = <VALUE>

  precondition {
    condition     = <CONDITION>
    error_message = "<MESSAGE>"
  }
}

precondition 블록에서 다음 인자를 지정할 수 있어요:

속성 설명 데이터 타입 필수?
condition Terraform이 작업을 진행하려면 true를 반환해야 하는 식이에요. 유효한 조건식 필수
error_message 조건이 false로 평가될 때 표시할 메시지예요. 문자열 필수

Terraform은 plan을 만들거나 적용할 때 출력에 대한 precondition을 평가하며, precondition 블록의 condition 식이 false로 평가되면 Terraform은 error_message로 오류를 던지고 현재 작업을 중지해요.

precondition에 대한 자세한 내용은 구성 검증을 참고해요.

요약 (Summary)

  • 데이터 타입: 블록
  • 기본값: 없음

예시 (Examples)

다음 예시는 output 값의 일반적인 사용 사례를 보여줘요.

기본 예시 (Basic example)

다음 예시에서 output 블록은 현재 모듈에서 서버의 개인 IP 주소를 노출해요:

output "instance_ip_addr" {
  value       = aws_instance.server.private_ip
  description = "The private IP address of the main server instance."
}

자식 모듈 출력 접근 (Accessing child module outputs)

다음 예시에서 현재 모듈은 web_server라는 자식 모듈의 instance_ip_addr이라는 출력을 사용해요:

output "website_url" {
  value = "https://${module.web_server.instance_ip_addr}"
  description = "The URL of the web server, starting with https://."
}

민감한 출력 (Sensitive output)

다음 예시에서 db_password 출력은 sensitive 인자를 true로 설정해 Terraform이 CLI 출력에 데이터베이스 비밀번호를 표시하지 못하게 해요:

output "db_password" {
  value     = aws_db_instance.db.password
  description = "The database password."
  sensitive = true
}

검증이 있는 출력 (Output with validation)

다음 예시에서 instance_public_ip 출력은 출력을 노출하거나 상태에 저장하기 전에 특정 조건이 충족되는지 확인하는 precondition을 가져요. instance_public_ip가 서버의 공개 IP를 공유하기 전에 출력의 precondition은 서버의 보안 그룹에 포트 80 또는 443의 트래픽을 허용하는 수신 규칙이 하나 이상 있는지 확인해요:

output "instance_public_ip" {
  value = aws_instance.web.public_ip
  description = "Public IP address of the instance."

  precondition {
    condition     = length([for rule in aws_security_group.web.ingress : rule if rule.to_port == 80 || rule.to_port == 443]) > 0
    error_message = "Security group must allow HTTP (port 80) or HTTPS (port 443) ingress traffic."
  }
}

서버의 보안 그룹이 포트 80 또는 443의 수신을 허용하지 않으면 Terraform은 error_message로 오류를 던지고 현재 작업을 중지해요.

명시적 의존성 (Explicit dependencies)

다음 예시에서 instance_ip_addr은 보안 그룹 규칙에 대한 명시적 의존성을 추가해 IP 주소를 노출하기 전에 Terraform이 보안 그룹을 만들도록 해요:

output "instance_ip_addr" {
  value       = aws_instance.server.private_ip
  description = "The private IP address of the main server instance."

  depends_on = [
    # Services are unreachable unless the security group rule is created
    # before exposing this IP address.
    aws_security_group_rule.local_access,
  ]
}

output 블록은 일반적으로 명시적 의존성을 요구하지 않으므로 명시적 의존성을 추가할 때는 왜 필요한지 설명하는 주석을 포함할 것을 권장해요.

더 알아보기 (Learn more)