출력값 — 인프라 정보를 밖으로 꺼내 보여주기
출력값 — 인프라 정보를 밖으로 꺼내 보여주기
리소스를 만들고 나면 그 ID나 IP 주소 같은 정보가 필요해질 때가 많아요. 심지어 다른 모듈이나 자동화 도구로 그 값을 넘겨야 할 때도 있죠. output 블록은 바로 그런 인프라 정보를 명령줄, HCP Terraform, 그리고 다른 Terraform 구성에서 쓸 수 있게 밖으로 노출하는 역할을 해요.
출처: https://developer.hashicorp.com/terraform/language/values/outputs
본문
output 블록은 어떤 일을 하나
Terraform에서 output 블록은 다음 목적으로 쓰여요.
- 자식 모듈이 리소스 속성을 부모 모듈에 노출할 때
- 루트 모듈이 CLI 출력에 값을 표시할 때
- 원격 상태를 쓰는 다른 Terraform 구성이
terraform_remote_state데이터 소스로 루트 모듈 출력에 접근할 때 - Terraform 작업의 결과 정보를 자동화 도구에 넘길 때
출력값 정의하기
output 블록을 추가하면 모듈의 인프라 정보를 내보낼 수 있어요. 예를 들어 구성에서 만든 웹 서버의 ID와 IP 주소를 두 개의 output 블록으로 노출해볼게요.
output "instance_id" {
description = "ID of the EC2 instance"
value = aws_instance.web.id
}
output "instance_ip" {
description = "Private IP address of the EC2 instance"
value = aws_instance.web.private_ip
}
resource "aws_instance" "web" {
# …
}
output 블록의 value 인자에는 유효한 표현식이라면 무엇이든 넣을 수 있어요. 상세한 내용은 output 블록 레퍼런스를 보세요.
출력값에 접근하는 법
출력값을 어디에서 정의하느냐에 따라 접근 방식이 달라져요. 루트 모듈의 출력값은 구성을 apply한 뒤 CLI에 표시되고, HCP Terraform을 쓰면 워크스페이스 개요 페이지에도 목록이 나와요.
자식 모듈의 출력
자식 모듈에 output 블록을 정의하면 그 값이 부모 모듈에 노출돼요. 부모 모듈은 module.<CHILD_MODULE_NAME>.<OUTPUT_NAME> 문법으로 자식 모듈의 출력에 접근할 수 있어요.
다음은 web_server라는 자식 모듈의 instance_ip와 instance_id 출력을 module.web_server.NAME으로 참조하는 부모 모듈 예시예요.
module "web_server" {
source = "./modules/web_server"
# …
}
resource "aws_route53_record" "web" {
zone_id = data.aws_route53_zone.main.zone_id
name = "web.example.com"
type = "A"
records = [module.web_server.instance_ip]
#...
}
resource "aws_cloudwatch_alarm" "web_health" {
alarm_name = "web-server-health"
comparison_operator = "GreaterThanThreshold"
threshold = "80"
dimensions = {
InstanceId = module.web_server.instance_id
}
# ...
}
민감한 값을 출력할 때
비밀번호나 API 키 같은 민감한 데이터를 출력한다면 sensitive 인자를 써서 Terraform이 CLI 출력에 값을 표시하지 않게 해요.
output "database_password" {
description = "Auto-generated password for the RDS database instance"
value = aws_db_instance.main.password
sensitive = true
}
CLI에서 민감한 출력값에 직접 접근하려고 하면 실제 값 대신 가린 메시지가 표시돼요.
$ terraform output database_password
database_password = <sensitive>
주의할 점이 있어요. sensitive 출력값의 값은 여전히 상태에 저장돼요. 그리고 terraform output 명령에 -json이나 -raw 플래그를 쓰면 민감한 출력도 평문으로 표시되니 조심해야 해요.
출력에 ephemeral 인자를 추가하면 그 값을 상태와 플랜 파일에서 빼버려요. 다만 그 출력에 넣을 수 있는 값에 제약이 생기니, 민감 데이터 처리에 대한 자세한 내용은 민감 데이터 관리 문서를 확인해 주세요.