개념
왜 Secrets Manager를 쓰는지?
지금 방식의 문제
terraform.tfvars → db_password 평문 저장
secret.yaml → base64 인코딩 (사실상 평문)
둘 다 실수로 git에 올라가면 자격증명 유출
Secrets Manager 방식
민감한 값을 AWS에서 중앙 관리
Terraform → Secrets Manager에서 값을 가져와서 사용
K8s Pod → External Secrets Operator가 자동으로 주입
이 가이드에서 다루는 것
1. Secrets Manager에 값 등록
2. Terraform에서 db_password 가져오기
3. K8s Pod에 DB 접속정보 / JWT 시크릿 자동 주입
저장할 값 목록
/team3/foldy/dev/db_password → RDS 마스터 비밀번호
/team3/foldy/dev/db_url → RDS 엔드포인트 (terraform apply 후 등록)
/team3/foldy/dev/db_username → RDS 마스터 계정 이름
/team3/foldy/dev/jwt_secret → JWT 서명 시크릿
/team3/foldy/prod/db_password
/team3/foldy/prod/db_url
/team3/foldy/prod/db_username
/team3/foldy/prod/jwt_secret
네이밍 규칙: /team3/foldy/{env}/{key}
1단계 — Secrets Manager에 값 등록
AWS 콘솔에서 등록하거나 CLI로 등록
CLI 방법:
aws secretsmanager create-secret \
--name /team3/foldy/dev/db_password \
--secret-string "실제패스워드값" \
--region ap-northeast-2
⚠️ db_url은 terraform apply로 RDS 생성 후 등록
terraform output rds_endpoint 값을 사용
2단계 — Terraform에서 db_password 가져오기
기존 방식 (tfvars 평문)
db_password = "직접입력한값"
변경 방식 (Secrets Manager 참조)
terraform apply 전에 Secrets Manager에 값이 있어야 함
infra/envs/dev/main.tf에 data 블록 추가
data "aws_secretsmanager_secret_version" 사용
찾아볼 것: "terraform aws_secretsmanager_secret_version"
연결 방법:
module "rds" {
db_password = data.aws_secretsmanager_secret_version.db_password.secret_string
}
이러면 terraform.tfvars에서 db_password 변수 삭제 가능
dev/variables.tf에서도 db_password 변수 삭제 가능
3단계 — External Secrets Operator 설치
K8s Pod에 Secrets Manager 값을 자동 주입해주는 도구
설치 방법 (Helm):
찾아볼 것: "external secrets operator helm install"
설치 후 확인:
kubectl get pods -n external-secrets
⚠️ IRSA 설정이 필요함
ESO Pod가 Secrets Manager에 접근하려면
IAM 권한이 있어야 함
Terraform IAM 모듈에 ESO용 Role 추가 필요
찾아볼 것: "external secrets operator IRSA EKS"
4단계 — IAM 권한 추가 (Terraform)
iam/main.tf에 ESO용 IRSA Role 추가 필요
허용해야 할 액션:
secretsmanager:GetSecretValue
secretsmanager:DescribeSecret
Resource는 /team3/foldy/* 경로로 제한
arn:aws:secretsmanager:ap-northeast-2:<계정ID>:secret:/team3/foldy/*
terraform output으로 eso_irsa_role_arn 출력 추가
→ ServiceAccount annotation에 사용
5단계 — K8s 매니페스트 수정
기존 secret.yaml 방식 (base64 직접 입력) 대신
ExternalSecret 리소스로 교체
team3-config/base/ 에 추가할 파일:
externalsecret.yaml → Secrets Manager 값을 K8s Secret으로 변환
secretstore.yaml → Secrets Manager 연결 설정
흐름:
SecretStore → "어느 Secrets Manager에 접근할지"
ExternalSecret → "어떤 값을 가져와서 어떤 K8s Secret으로 만들지"
결과:
ESO가 자동으로 foldy-secret 을 생성
기존 secret.yaml 삭제 가능
.gitignore에서 secret.yaml 제거 가능
찾아볼 것: "external secrets operator SecretStore ExternalSecret"