[Terraform] 시크릿을 테라폼 리소스로 전달하는 방법

업데이트:     Updated:

카테고리:

태그:

🎯시크릿을 테라폼 리소스로 전달하는 방법

  • 데이터 소스를 사용하여 시크릿 저장소에서 정보를 읽기
  • 시크릿 값을 테라폼 외부에서 관리하고 환경 변수를 통해 시크릿 값을 테라폼에 전달하기

데이터 소스를 사용하여 시크릿 저장소에서 정보를 읽기

예를 들어 시크릿은 AWS 시크릿 매니저(AWS Secrets Manager)에 저장할 수 있습니다. AWS 시크릿 매니저 UI를 사용하여 시크릿을 저장한 다음 aws_secretsmanager_secret_version 데이터 소스를 사용하여 테라폼 코드에서 시크릿 값을 다시 읽을 수 있습니다.

provider "aws" {
  region = "us-east-2"
}

resource "aws_db_instance" "example" {
  identifier_prefix     = "terraform-up-and-running"
  engine                = "mysql"
  allocated_storage     = 10
  instance_class        = "db.t2.micro"
  name                  = "example_database"
  username              = "admin"

  password =
    data.aws_secretmanager_secret_version.db_password.secret_string
}

data "aws_secretmanager_secret_version" "db_password" {
  secret_id = "mysql-master-password-stage"
}

다음은 다양한 공급자가 지원하는 시크릿 저장소와 데이터 소스입니다.

시크릿 저장소 데이터 소스
AWS Secrets Manager                aws_secretsmanager_secret_version                                                                                                                                                                                                 
AWS Parameter Store aws_ssm_parameter
AWS KMS aws_kms_secrets
GKE KMS google_kms_secrets
Azure Key Vault azurem_key_vault_secret
HashiCorp Vault vault_generic_secrets

시크릿 값을 테라폼 외부에서 관리하고 환경 변수를 통해 시크릿 값을 테라폼에 전달하기

시크릿을 테라폼 리소스로 전달하는 두 번째 방법은 시크릿 값을 원패스워드, 라스트패스 또는 macOS의 키체인 접근과 같은 테라폼 외부에서 관리하고 환경 변수를 통해 시크릿 값을 테라폼에 전달하는 것입니다.

1. variables.tf 에서 db_password 라는 변수를 선언합니다.

variable "db_password" {
  description = "The password for the database"
  type        = "string"
}

📌Note: 이 변수에는 default 값이 없는데 이는 의도적인 것입니다. 데이터베이스 패스워드 또는 민감한 정보는 평문으로 저장해서는 안 됩니다. 대신 환경 변수를 사용하여 이 변수를 설정합니다.

2.1 TF_VAR 환경 변수 사용

테라폼 구성에 정의된 입력 변수 db_password에 환경 변수 TF_VAR_db_password를 사용하여 이 변수의 값을 테라폼에 제공할 수 있습니다.

$ export TF_VAR_db_password="<DB_PASSWORD>"
$ terraform apply

(...)

2.2 서브쉘 사용

시크릿 값이 배시 히스토리에 저장되지 않게 하기 위한 더 좋은 방법은 pass와 같은 명령(https://www.passwordstore.org/)으로 서브쉘을 사용하여 안전한 환경에서 시크릿 값을 읽는 것입니다.

$ export TF_VAR_db_password=$(pass database-password)
$ terraform apply

(...)

⚠️참고: 시크릿 값은 항상 테라폼 상태에 저장됩니다.

시크릿 저장소 또는 환경 변수에서 시크릿 값을 읽는 것은 시크릿 값이 코드에 평문으로 저장되지 않도록 하는 적절한 방법입니다. 하지만 꼭 알아야 할 사항이 있습니다. 시크릿 값을 어떤 방법으로 읽든 간에 aws_db_instance와 같은 테라폼 리소스에 시크릿 값을 인수로 전달하면 해당 시크릿 값은 테라폼 상태 파일에 평문으로 저장됩니다.

이는 테라폼의 약점이며 아직까지 해결 방법도 없습니다. 그러므로 항상 암호화를 사용하는 등 상태 파일을 저장할 때 특히 주의해야 합니다. 또한 IAM 권한을 사용해 S3 버킷에 대한 액세스 제한하는 등 상태 파일에 액세스할 수 있는 사용자를 세심하게 파악하고 관리해야 합니다.

📌출처

Terraform Up & Running


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

맨 위로 이동하기

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

댓글남기기