Terraform의 시크릿: 처리 방식 및 프로젝트

발행: (2025년 12월 25일 오전 09:43 GMT+9)
6 분 소요
원문: Dev.to

I’m happy to translate the article for you, but I’ll need the text you’d like translated. Could you please paste the content of the article (excluding the source line you already provided) here? Once I have the text, I’ll translate it into Korean while preserving the original formatting, markdown syntax, and technical terms.

Source:

Project 1 — AWS Secrets Manager

시나리오

  • 회사 유형: 중대형, SaaS, 핀테크, 전자상거래, 헬스케어(예: SOC2, HIPAA, PCI 준수 고객 데이터).
  • 애플리케이션: RDS(MySQL/Postgres) 사용.
  • 요구 사항:
    • 비밀번호가 Git에 포함되거나 개발자에게 노출되어서는 안 됨.
    • 회전 가능해야 함.
    • IAM으로 권한이 부여된 서비스만 접근 가능해야 함.

기대 결과

비밀번호를 하드코딩하지 않고 RDS 데이터베이스를 생성합니다. Terraform은:

  • 실행 시 비밀번호를 안전하게 읽어야 함.
  • 코드를 통해 절대 저장되지 않아야 함.
  • IAM으로 권한이 부여된 서비스에만 접근을 허용해야 함.
aws secretsmanager create-secret \
  --name prod/rds/db_password \
  --secret-string '{"password":"StrongProdPass123!"}'

Note: 비밀은 Terraform 외부에서 생성됩니다.

Terraform Backend Configuration

terraform {
  backend "s3" {
    bucket         = "terraform-state-prod"
    key            = "rds/terraform.tfstate"
    region         = "us-east-1"
    dynamodb_table = "terraform-locks"
    encrypt        = true
  }
}
  • 상태를 암호화합니다.
  • 상태 손상을 방지합니다.
  • 팀이 안전하게 배포할 수 있도록 합니다.

Terraform에서 비밀 읽기

data "aws_secretsmanager_secret" "db" {
  name = "prod/rds/db_password"
}

data "aws_secretsmanager_secret_version" "db" {
  secret_id = data.aws_secretsmanager_secret.db.id
}

Terraform 비밀을 생성하지 않으며; 단지 읽기만 합니다.

RDS Instance Resource

resource "aws_db_instance" "prod" {
  engine         = "mysql"
  instance_class = "db.t3.micro"
  username       = "admin"
  password = jsondecode(
    data.aws_secretsmanager_secret_version.db.secret_string
  )["password"]
}
  • 비밀번호 회전을 지원합니다.
  • IAM을 통한 감사.
  • 보안 규정 준수 충족.
  • Git에 비밀이 노출되지 않음.

프로덕션 환경에서는 데이터베이스 비밀번호를 AWS Secrets Manager에 저장합니다. Terraform은 IAM 권한을 사용해 런타임에 이를 읽어와 하드코딩된 비밀을 피하고 회전 및 규정 준수를 지원합니다.

시나리오: 간단한 EC2 비밀 (SSM 파라미터 스토어)

목표

비밀을 노출하지 않고 EC2 인스턴스로 안전하게 전달합니다.

aws ssm put-parameter \
  --name /prod/app/api_key \
  --type SecureString \
  --value "api-key-123"

EC2 인스턴스에 ssm:GetParameter 권한이 있는 IAM 역할을 생성하고 연결합니다.

data "aws_ssm_parameter" "api_key" {
  name            = "/prod/app/api_key"
  with_decryption = true
}

EC2 사용자‑data 예시

# For simple secrets, we use SSM SecureString. EC2 IAM roles allow secure access without exposing secrets in scripts or repositories.

CI‑Driven Secret Injection

컨텍스트

  • 현대 DevOps, 원격 팀, 플랫폼 엔지니어링.
  • Terraform은 CI에서 실행되며, 개발자는 로컬에 AWS 키를 보관하지 않아야 합니다.

예시

variable "db_password" {
  sensitive = true
}

CI 환경 변수 (예: GitHub Actions):

env:
  TF_VAR_db_password: ${{ secrets.DB_PASSWORD }}
  • 로컬 비밀 없음.
  • 제로 트러스트 모델.
  • 감사 로그 및 일관된 배포.

Terraform은 CI 파이프라인에서만 실행됩니다. 비밀은 CI 비밀 관리자에서 런타임에 주입되어 로컬 노출을 방지합니다.

중앙 집중식 Terraform 실행 (Terraform Cloud)

  • 실행을 중앙 집중화하고 민감한 변수를 암호화하여 저장합니다.
  • 상태 잠금, 암호화된 저장소 및 원격 실행을 제공합니다.
  • 팀 구성원에게 로컬 Terraform 설치가 필요 없게 합니다.

Terraform Cloud는 실행을 중앙 집중화하고 민감한 변수를 안전하게 저장하여 협업을 안전하게 만듭니다.

Dynamic Secrets with Vault

  • 높은 보안이 요구되는 환경(은행, 핀테크, 기업)에 이상적입니다.
  • Vault는 단기간 유효한 DB 자격 증명을 발급합니다.
  • Terraform은 동적 자격 증명을 읽으며, 이들은 자동으로 만료됩니다.

Vault는 동적 비밀을 제공하여, 시간 제한이 있는 자격 증명을 발급함으로써 영향을 최소화합니다.

도구 요약

ToolTypical Use Case
AWS Secrets Manager프로덕션 데이터베이스 (고가치 비밀)
AWS SSM Parameter Store간단한 EC2 비밀 (SecureString)
CI secret stores파이프라인 수준 비밀 주입
Terraform Cloud중앙 집중식 팀 실행
HashiCorp Vault고보안, 동적 비밀 생성
Back to Blog

관련 글

더 보기 »