[Terraform] template_file 데이터 소스

업데이트:     Updated:

카테고리:

태그:

🎯template_file 데이터 소스

일반적으로 한 프로그래밍 언어(배시)를 다른 프로그래밍 언어(테라폼)에 포함하면 각각의 언어를 유지하기가 더 어려워지므로 배시 스크립트를 외부화할 수 있습니다.

내장 함수

테라폼에는 표현식을 사용하여 실행할 수 있는 여러 내장 함수가 있습니다. 예를 들어 file 함수는 다음과 같이 사용합니다.

file(<PATH>)

이 함수는 PATH에서 파일을 읽고 그 내용을 문자열로 반환합니다. 예를 들어 사용자 데이터 스크립트를 user-data.sh 파일에 넣고 다음과 같이 문자열로 내용을 읽을 수 있습니다.

file("user-data.sh")

template_file

그런데 user-data.sh 스크립트에 데이터베이스의 주소 및 포트를 terraform_remote_state 데이터 소스를 통해 동적인 데이터를 요구해야 하는 경우가 있습니다.

#!/bin/bash
echo "Hello, World!"" >> index.html
echo "${data.terraform_remote_state.db.outputs.address}" >> index.html
echo "${data.terraform_remote_state.db.outputs.port}" >> index.html
nohup busybox httpd -f -p ${var.server_port} &

테라폼에서 file 함수는 테라폼 코드를 참조와 보간을 이용하여 값을 채울 수 없습니다. 그러나 template_file 데이터 소스는 우리에게 해결책을 제시해줍니다.

template_file 데이터 소스에는 2개의 인수, 즉 렌더링할 문자열인 template과 렌더링 중에 사용할 변수의 맵인 vars가 있습니다. vars에는 rendered라는 출력 속성이 있는데 이는 렌더링 template의 결과입니다.

data "template_file" "user_data" {
  template = file("user-data.sh")

  vars = {
    server_port = var.server_port
    db_address  = data.terraform_remote_state.db.outputs.address
    db_port     = data.terraform_remote_state.db.outputs.port
  }
}

vars 매개 변수는 사용자 데이터 스크립트에 필요한 3가지 변수, 즉 서버 포트, 데이터베이스 주소 및 데이터베이스 포트에 대한 변수입니다. 이러한 변수를 사용하려면 다음과 같이 user-data.sh 스크립트를 업데이트해야 합니다.

#!/bin/bash

cat > index.html <<EOF
<h1>Hello, World</h1>
<p>DB address: ${db_address}</p>
<p>DB port: ${db_port}</p>
EOF

nohub busybox httpd -f -p ${server_port} &
  • 테라폼의 표준 보간 구문을 사용하여 변수를 조회하지만 template_file 데이터 소스의 vars 맵에 있는 변수만 사용할 수 있습니다. 이러한 변수에 엑세스하는 데는 접두사가 필요하지 않습니다. 예를 들어 var.server_port가 아닌 server_port를 사용하면 됩니다.
  • 스크립트에는 웹 브라우저에서 결괏값을 좀 더 읽기 쉽게 하기 위해 <h1>과 같은 HTML 구문이 포함되어 있습니다.

template_file 데이터 소스의 rendered 출력 속성

마지막으로 user_data 매개 변수를 사용하는 리소스에서 template_file 데이터 소스의 rendered 출력 속성을 가리키도록 업데이트합니다. 다음 예제에서는 aws_launch_configuration 리소스의 user_data 매개 변수를 업데이트합니다.

resouce "aws_launch_configuration" "example" {
  image_id        = "ami-0c55b159bfafe1f0"
  instance_type   = "t2.micro"
  security_groups = [aws_security_group.instance.id]
  user_data       = data.template_file.user_data.rendered

  lifecycle {
    create_before_destroy = true
  }
}

📌출처

Terraform Up & Running


👍 개인 공부 기록용 블로그입니다. 오류나 조언이 있으시면 언제든지 댓글 혹은 메일로 남겨주시면 감사하겠습니다! 😄

맨 위로 이동하기

terraform 카테고리 내 다른 글 보러가기

댓글남기기