[Terraform] 시크릿을 테라폼 리소스로 전달하는 방법
카테고리: terraform
태그: terraform
🎯시크릿을 테라폼 리소스로 전달하는 방법
- 데이터 소스를 사용하여 시크릿 저장소에서 정보를 읽기
- 시크릿 값을 테라폼 외부에서 관리하고 환경 변수를 통해 시크릿 값을 테라폼에 전달하기
데이터 소스를 사용하여 시크릿 저장소에서 정보를 읽기
예를 들어 시크릿은 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 버킷에 대한 액세스 제한하는 등 상태 파일에 액세스할 수 있는 사용자를 세심하게 파악하고 관리해야 합니다.
📌출처
👍 개인 공부 기록용 블로그입니다. 오류나 조언이 있으시면 언제든지 댓글 혹은 메일로 남겨주시면 감사하겠습니다! 😄
댓글남기기