`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 인자가 있는 출력 블록도 참조할 수 있어요:
- 다른 자식 모듈의 임시
output블록 - 쓰기 전용 인자
ephemeral인자가 있는 변수ephemeral리소스 블록provider블록에서 프로바이더 구성- 프로비저너 및 프로비저너 연결 구성에서. 자세한 내용은 프로비저너 사용을 참고해요.
요약 (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 블록은 일반적으로 명시적 의존성을 요구하지 않으므로 명시적 의존성을 추가할 때는 왜 필요한지 설명하는 주석을 포함할 것을 권장해요.