리소스의 임시(ephemeral) 값

리소스의 임시(ephemeral) 값

인프라를 관리하다 보면 Terraform이 현재 작업 밖으로 영속화하지 않길 원하는 민감한 값을 만들고 다룰 일이 자주 생겨요. Terraform은 리소스가 상태(state)나 계획(plan) 파일에 저장하고 싶지 않은 데이터를 관리할 수 있도록 ephemeral 리소스 블록과 특정 리소스의 임시 쓰기 전용(write-only) 인자, 이렇게 두 가지 도구를 제공해요.

출처: 문서

본문

임시(ephemeral) 리소스

ephemeral 블록은 본질적으로 임시적인 리소스를 정의해요. 임시 리소스는 고유한 수명 주기를 가지며, Terraform은 임시 리소스에 대한 정보를 상태나 계획 파일에 저장하지 않아요. 각 ephemeral 블록은 임시 비밀번호나 다른 시스템으로의 연결 같은 하나 이상의 임시 리소스를 설명해요.

ephemeral "random_password" "db_password" {
  length           = 16
  override_special = "!#$%&*()-_=+[]{}<>:?"
}

resource "aws_db_instance" "example" {
  instance_class       = "db.t3.micro"
  allocated_storage    = "5"
  engine               = "postgres"
  username             = "example"
  skip_final_snapshot  = true
  publicly_accessible  = true
  db_subnet_group_name = aws_db_subnet_group.example.name
  password_wo          = ephemeral.random_password.db_password.result
  password_wo_version  = 1
}

ephemeral 리소스 블록에 대해 더 알아보려면 ephemeral 블록 참조를 참고하세요.

쓰기 전용(write-only) 인자

resource 블록이 정의하는 Terraform의 관리 리소스에는 쓰기 전용 인자라고 불리는 임시 인자를 포함할 수 있어요. 쓰기 전용 인자는 현재 Terraform 작업 동안에만 사용할 수 있고, Terraform은 이를 상태나 계획 파일에 저장하지 않아요.

쓰기 전용 인자를 사용하면 Terraform 작업 중에 임시 값을 안전하게 리소스에 전달하면서, 그 값이 Terraform에 의해 영속화될 걱정을 하지 않아도 돼요. 예를 들어 aws_db_instance 리소스에는 데이터베이스 비밀번호를 받는 쓰기 전용 password_wo 인자가 있어요:

ephemeral "random_password" "db_password" {
  length           = 16
  override_special = "!#$%&*()-_=+[]{}<>:?"
}

resource "aws_secretsmanager_secret" "db_password" {
  name = "db_password"
}

resource "aws_secretsmanager_secret_version" "db_password" {
  secret_id                = aws_secretsmanager_secret.db_password.id
  secret_string_wo         = ephemeral.random_password.db_password.result
  secret_string_wo_version = 1
}

ephemeral "aws_secretsmanager_secret_version" "db_password" {
  secret_id = aws_secretsmanager_secret_version.db_password.secret_id
}

resource "aws_db_instance" "example" {
  instance_class      = "db.t3.micro"
  allocated_storage   = "5"
  engine              = "postgres"
  username            = "example"
  skip_final_snapshot = true
  password_wo         = ephemeral.aws_secretsmanager_secret_version.db_password.secret_string
  password_wo_version = aws_secretsmanager_secret_version.db_password.secret_string_wo_version
}

Terraform이 aws_db_instance 리소스를 만들 때 password_wo 값을 aws 프로바이더로 보내요. 그러면 aws 프로바이더가 password_wo 값을 사용해 데이터베이스 인스턴스를 만들고, Terraform은 그 비밀번호 값을 저장하지 않고 버려요.

이 예시와 쓰기 전용 인자 사용에 대해 더 알아보려면 쓰기 전용 인자 사용하기를 참고하세요.

더 알아보기 (Learn more)