Notice
Recent Posts
Recent Comments
관리 메뉴

즐겁게, 코드

Terraform output 으로 생성된 요소의 값 출력하기 본문

⚡️ DevOps/IAC

Terraform output 으로 생성된 요소의 값 출력하기

Chamming2 2022. 5. 5. 22:12

테라폼의 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에 함께 나타나는 내용이 아니라, 테라폼 모듈을 만들어 배포할 시 설명 문서에 추가되는 내용입니다.

즉, 개발자를 위한 주석의 역할이 아닌 모듈 사용자를 위한 설명이며 테라폼 공식 문서 에서도 이 점을 설명하고 있습니다.

AWS 공식 VPC 모듈 Github / 좌측 모듈에서 정의한 output description이 모듈 문서에 반영된 모습

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
Comments
소소한 팁 : 광고를 눌러주시면, 제가 뮤지컬을 마음껏 보러다닐 수 있어요!
와!! 바로 눌러야겠네요! 😆