TFAS (TerraForm Addicted School)의 내용을 정리한 글입니다.
심각한 테라폼 중독입니다 - 책으로 스터디를 진행합니다.

테라폼 프로바이더는 오픈소스 프로젝트로, 테라폼을 만든 하시코프에서 공식적으로 제공하는 프로바이더가 존재한다. 특히 공식 프로바이더 중에서 유틸리티로 사용가능한 프로바이더를 확인해 본다.
테라폼 프로바이더 티어
테라폼 프로바이더는 기능과 지원 수준에 따라 공식, 파트너, 커뮤니티 티어로 나뉜다.
| 공식 | 파트너 | 커뮤니티 | |
| 관리 주체 | 하시코프 | 하시코프의 공식 파트너사 | 개발자 커뮤니티 / 외부 기여자 |
| 특징 | 하시코프에 의해 관리되기 때문에 버그 수정, 기능 업데이트가 비교적 빠르며 안정적 지원 가능 | 파트너사가 관리하지만 하시코프의 공식 파트너이기 때문에 신뢰성이 높음 | 오픈소스로 제공되며, 다양한 프로바이더를 제공하지만 신뢰성 있는 지원이 부족할 수 있음 |
| 예시 | 주요 퍼블릭 클라우드, 하시코프 서비스, 쿠버네티스 등 인프라 플랫폼, http 등 네트워크 프로바이더 | 데이터독, 컨플루언트, 클라우드플레어, 깃허브 | LDAP, Kubectl 등 사용자 정의 API 관리용 프로바이더 |
공식 프로바이더 중에서도 특정 플랫폼에 종속되지 않은 프로바이더들이 많다. 이런 프로바이더의 예로는 랜덤, http, 로컬, null, tls 등 유틸리티 역할을 하는 프로바이더가 있다. 이런 프로바이더를 편의상 유틸리티 프로바이더라고 명시하고 어떤 기능을 제공하는지 알아본다.
랜덤 프로바이더
인프라를 정의할 때 무작위의 문자열이 필요한 경우가 있다. 예를 들어 RDS의 데이터베이스 비밀번호를 지정해야 할 때 무작위 값으로 비밀번호를 생성하는 경우 더 높은 보안 수준을 달성할 수 있다.
이런 요구사항을 만족시키기 위해서 사용할 수 있는 것이 하시코프 공식 프로바이더인 랜덤 프로바이더이다. 랜덤 프로바이더는 여러 종류의 무작위 값을 생성할 수 있다.
resource "random_password" "this" {
length = 16
override_special = "!#$%&()*+,-.:;<=>?[]^_`{|}~"
}
locals {
master_username = "admin"
master_password = random_password.this.result
}
resource "aws_rds_cluster" "this" {
engine = "aurora-mysql"
engine_mode = "serverless"
master_username = local.master_username
master_password = local.master_password
}
resource "aws_secretmanager_secret" "this" {
name = "db/${local.db_namd}/${local.master_username}"
description = "Managed By Terraform"
}
resource "aws_secretmanager_secret_version" "this" {
secret_id = aws_secretmanager_secret.this.id
secret_string = jsonencode({
"username" = local.master_username
"password" = local.master_password
})
}
무작위 값을 생성하기 위해 random_password 리소스를 사용했다. 비밀번호의 길이인 length는 해당 리소스의 유일한 필수 설정값이다. min_lovwer, min_special 등 선택 설정값을 사용하여 복잡한 제약조건을 만들 수 있다.
http 프로바이더
http 프로바이더는 http 프로토콜을 사용해 테라폼 실행 환경과 외부 API 서버가 서로 소통할 수 있게 해 준다.
예를 들어 AWS에 SAML 인증 제공자를 등록한다고 해보자. 오픈소스 인증 서비스 중 많이 사용하는 키클록을 비롯한 많은 커뮤니티 티어 프로바이더에서는 SAML 인증 제공자의 메타데이터 문서를 제공하지 않을 수 있다. 이런 경우 HTTP 프로바이더를 사용해 SAML 인증 제공자의 API를 직접 호출할 수 있다.
다음은 키클록을 SAML 인증 제공자로 설정하는 경우 HTTP 프로바이더를 사용해 메타데이터 문서를 전달하는 예시이다.
locals {
keycloak_url = "https://keycloak.terraform.io"
keycloak_realm = "aws"
keycloak_saml_descriptor_url = "${local.keycloak_url}/realms/${local.keycloak_realm}/protocol/saml/descriptor"
}
data "http" "this" {
url = local.keycloak_saml_descriptor_url
}
resource "aws_iam_saml_provider" "this" {
name = "keycloak"
saml_metadata_document = data.http.this.response_body
}
http 프로바이더는 http 타입의 데이터 블록을 가진다. url 은 필수 인수이며 url에 요청을 보내 결괏값을 특정 값으로 내보낸다. 이때 data.http의 선택 인수로 method를 설정할 수 있으며, POST, HEAD 등의 메서드를 지정할 수 있다.
로컬 프로바이더
로컬 프로바이더는 로컬 환경의 파일을 생성하거나 덮어쓰는 방식으로 작동한다. 로컬 프로바이더를 이용하면 테라폼 코드를 실행한 뒤 여러 종류의 변수를 원하는 형태로 가공한 파일을 만들 수 있다. 이런 성질을 이용하면 인프라 리소스의 현황을 문서화할 때 도움이 된다.
테라폼을 사용해 인프라를 관리한다면 관리 중인 리소스에 대한 정보를 문서화해 주기적으로 최신화할 수 있다. 이때 로컬 프로바이더가 리소스 현황 문서를 작성해 준다면 수동으로 진행하는 리소스 현황 문서 업데이트가 줄어들어 인적 오류의 가능성이 줄어들 수 있다.
로컬 프로바이더를 사용해서 자동으로 리소스 현황 문서를 만드는 예시를 봐보자. 로컬 프로바이더로 생성할 파일을 마크다운 형식으로 작성한다. 예를 들어 EC2 리소스 관리 문서를 만든다고 한다면, EC2 인스턴스가 생성될 때마다 문서에 필요한 정보들이 동적반영되기 위해서는 조건문과 반복문을 사용한 템플릿 파일이 필요하다.
%{ for vpc, ec2_set in vpc_ec2_map ~}
%{if length(ec2_set) > 0 ~}
# In ${upper(vpc)} vpc
| Name | ID | Private IP | Public IP | AZ |
| ---- | ---- | ---- | ---- | ---- |
%{ for k, v in ec2_set ~}
| ${v.full_name} | ${v.instance_id} | ${v.private_ip} | ${v.public_ip} | ${v.availability_zone} |
%{ endfor ~}
%{ endif ~}
%{ endfor ~}
템플릿 파일 변수 처리 문법은 테라폼의 스트링 템플릿 표현 방법에 따른다. 전체 로직은 vpc_ec2_map 변수를 읽고 순회하며 vpc를 키로 삼아 ec2 데이터를 집합으로 가지는 변수이다. 이때 인스턴스가 있는지 확인하여 ec2 현황표를 그리도록 한다.
해당 템플릿 파일을 활용해 로컬 파일을 생성하는 로컬 프로바이더의 리소스 블록은 다음과 같다.
module "ec2" {
# ...
}
locals {
templatefiles_path = "./"
resource_documents_path = "../resource_documents"
}
resource "local_file" "ec2" {
content = templatefile("${local.templatefiles_path}/ec2.tftpl", {
vpc_ec2_map = { for k, v in module.ec2 : k => v.ec2_info }
region = "ap-northeast-2"
})
filename = "${local.resource_documents_path}/EC2_SEOUL.md"
}
이를 통해 파일에 어떤 내용이 작성되어야 할지 지정할 수 있다. 그리고 filename 설정값을 통해 content를 어느 경로에 파일에 작성할지 지정한다.
그 외
TLS 프로바이더
TLS 프로바이더는 인증서나 키페어를 생성할 수 있다.
resource "tls_private_key" "this" {
algorithm = "RSA"
rsa_bits = 4096
}
output "public_key" {
value = tls_private_key.this.public_key_pem
}
output "private_key" {
value = tls_private_key.this.private_key_pem
}
DNS 프로바이더
DNS 프로바이더는 dns 레코드를 관리하거나 불러올 때 사용하나 일반적으로는 dns 관리 서비스에서 제공하는 프로바이더를 사용하는 것이 일반적이다. 따라서 특정 레코드를 조회하고 값을 조회하는 용도로 사용가능하다.
data "dns_a_record_set" "google" {
host = "google.com"
}
output "google_record_addresses" {
value = data.dns_a_record_set.google.addrs
}
타임 프로바이더
타임 프로바이더는 시간 관련 작업을 처리하는 데 사용하는 프로바이더이다. time_sleep이라는 리소스 타입을 활용하여 대기하거나 할 수 있다.
아카이브 프로바이더
아카이브 프로바이더를 활용하면 단일이나 다중 파일을 압축하여 zip 또는 tar.gz 아카이브 파일을 생성할 수 있다. 여러 코드와 의존성 선언 파일을 하나의 압축해 업루트 해야 하는 서비스를 사용할 때 사용할 수 있다.
resource "archive_file" "this" {
type = "zip"
source_dir = "${path.module}/lambda_code"
output_path = "${path.module}/lambda_code.zip"
}
resource "aws_lambda_function" "this" {
function_name = "lambda_function"
role = "test_role"
handler = "main"
runtime = "go1.x"
source_code_hash = filebase64sha256(data.archive_file.this.output_path)
filename = archive_file.this.output_path
}'School > TFAS' 카테고리의 다른 글
| [TFAS] 챕터 16 쿠버네티스 관련 프로바이더 (0) | 2025.12.14 |
|---|---|
| [TFAS] 챕터 14 다른 실행 환경의 출력값을 참조하는 네트워크 실행 환경 구성하기 (0) | 2025.12.06 |
| [TFAS] 챕터 13 VPC 와 보안 그룹 모듈의 출력값을 활용하는 EC2 모듈 만들기 (0) | 2025.12.06 |
| [TFAS] 챕터 12 CSV 파일로 관리하는 보안 그룹 모듈 만들기 (1) | 2025.12.06 |
| [TFAS] 챕터 11 YAML 파일로 관리하는 VPC 모듈 만들기 (0) | 2025.12.04 |