일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- CSS
- 파이썬
- react
- BFS
- k8s
- 자바스크립트
- 백준
- 알고리즘
- 블록체인
- VUE
- AWS
- JavaScript
- next.js
- 이슈
- es6
- 리액트
- 타입스크립트
- 백엔드
- docker
- 가상화
- TypeScript
- 솔리디티
- 웹
- 이더리움
- 프론트엔드
- 클라우드
- HTML
- 쿠버네티스
- kubernetes
- 컴퓨터공학
- Today
- Total
즐겁게, 코드
Terraform output 으로 생성된 요소의 값 출력하기 본문
테라폼의 output은 모듈의 생성 결과를 다른 모듈에서 사용하거나 사용자에게 요소의 특정 값(Ex. 생성된 클러스터의 유저네임)을 출력하는 역할을 하는데요, 공식 문서에서는 다음 유스케이스를 제시하고 있습니다.
- 자식 모듈은 output을 통해 리소스의 하위 요소들을 부모 모듈에 공개할 수 있습니다.
- 루트 모듈에서는
terraform apply
를 성공적으로 마친 후 생성된 특정 값들을 출력할 수 있습니다. - 원격 상태(remote state)를 사용할 때는, terraform_remote_state 를 사용해 다른 테라폼 파일에서도 output 값을 사용할 수 있습니다.
output 선언 방법
output 선언 방법은 정말 간단합니다.
출력할 값을 정한 후, 필요에 따라 sensitive 여부나 description 등의 속성을 추가하기만 하면 됩니다.
output "값 식별용 이름" {
value = <출력할 값>
description = <output 값의 설명> // optional
sensitive = <민감한 값의 마스킹 처리여부> // optional
depends_on = [<먼저 평가되어야 하는 자식 모듈의 값>]
}
- output을 사용해 Azure Container Registry의 호스트를 출력하는 예시
resource "azurerm_container_registry" "container_registry" {
name = "chanmin"
resource_group_name = azurerm_resource_group.chanmin.name
location = azurerm_resource_group.chanmin.location
sku = "Basic"
admin_enabled = true
}
output "registry_hostname" {
description = "레지스트리의 호스트명을 출력합니다."
value = azurerm_container_registry.container_registry.login_server
}
output 옵션
output 자체의 옵션이 많지 않아, 편하게 읽어주시면 될 것 같습니다. 🙂
description
description 은 출력 시 CLI에 함께 나타나는 내용이 아니라, 테라폼 모듈을 만들어 배포할 시 설명 문서에 추가되는 내용입니다.
즉, 개발자를 위한 주석의 역할이 아닌 모듈 사용자를 위한 설명이며 테라폼 공식 문서 에서도 이 점을 설명하고 있습니다.
sensitive
sensitive는 민감한 키, 비밀번호 등의 값을 마스킹해 보여줄 수 있는 옵션입니다.
문자열 대신 true / false의 불리언 값을 갖습니다.
resource "azurerm_container_registry" "container_registry" {
name = "chanmin"
resource_group_name = azurerm_resource_group.chanmin.name
location = azurerm_resource_group.chanmin.location
sku = "Basic"
admin_enabled = true
}
output "registry_hostname" {
description = "레지스트리의 호스트명입니다."
value = azurerm_container_registry.container_registry.login_server
}
output "registry_username" {
description = "레지스트리 접근용 유저네임입니다."
value = azurerm_container_registry.container_registry.admin_username
}
// sensitive 옵션 적용
output "registry_password" {
description = "레지스트리 접근용 비밀번호입니다."
sensitive = true
value = azurerm_container_registry.container_registry.admin_password
}
sensitive 옵션이 true로 설정되면, 아래와 같이 데이터가 <sensitive> 로 마스킹되어 출력됩니다.
이렇게 마스킹된 값은 terraform apply
를 통해서는 확인할 수 없지만, terraform output <output 값 식별자>
를 통해 직접 출력하면 확인이 가능합니다.
depends_on
테라폼은 대부분의 상황에서 의존성 노드를 스스로 찾아내지만, 가끔은 암묵적으로 필요로 하는 값을 찾아내지 못하는 경우도 존재합니다.
이런 상황을 대비해, depends_on에 명시된 output 값들은 output 값보다 먼저 평가되도록 합니다.
output "instance_ip_addr" {
value = aws_instance.server.private_ip
description = "인스턴스의 프라이빗 IP 주소"
depends_on = [
// aws_instance.server.private_ip 값을 출력하기 전에,
// aws_security_group_rule.local_access 값이 존재하는지 먼저 평가합니다.
aws_security_group_rule.local_access,
]
}
하지만, 공식 문서에 따르면 depends_on 속성은 최후의 방법으로 사용되어야만 하며, 이를 사용할 경우에는 반드시 주석을 통해 사용한 이유를 남겨둘 것을 권장하고 있습니다.
최후의 방법(last resort이라 언급한 개인적인 생각은, 테라폼은 자체적으로 디펜던시 그래프를 통해 의존성 관계를 정의하는데 개발자가 굳이 여기에 개입해 임의로 의존성 관계를 수정하는 것을 지양해야 한다는 뉘앙스인 것 같습니다. 🙂
'⚡️ DevOps > IAC' 카테고리의 다른 글
인프라 프로비저닝을 위한 Terraform 시작하기 (0) | 2022.05.03 |
---|